我的 Amazon OpenSearch Service 叢集 Java 虛擬機器 (JVM) 記憶體壓力過高,我想要降低它。
簡短說明
預設情況下,OpenSearch Service 會使用 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體 RAM 的 50% 作為 JVM 堆積,最大為 32 GiB。JVM 記憶體壓力會指定叢集節點中 Java 堆積的百分比。
下列情境可能會造成 JVM 記憶體壓力過高:
- 叢集的請求數量激增
- 在查詢中使用彙總、萬用字元,以及廣泛的時間範圍
- 跨節點或叢集中碎片太多的不平衡碎片分配
- 欄位資料或索引對應暴增
- 無法管理傳入負載的 Amazon EC2 執行個體類型
解決方法
監控資料模式
若要解決 JVM 記憶體壓力過高問題,請降低叢集流量。
執行下列指令以取得叢集的節點層級統計資訊,並識別遭遇記憶體壓力或過度垃圾回收的節點:
GET _nodes/stats/jvm
若要進一步識別有問題的請求,請啟用慢速日誌。如需更多資訊,請參閱 OpenSearch 網站上的碎片慢速日誌。確保 JVM 記憶體壓力低於 90%。如需有關查詢過慢的詳細資訊,請參閱 Elasticsearch 網站上的進階調整:尋找和修正 Elasticsearch 查詢過慢。
使用 Amazon CloudWatch 監控 JVM 記憶體使用量及垃圾回收行為。利用這些資訊偵測模式,並在叢集不穩定前採取行動。同時,設定 CloudWatch 警示,以主動偵測並解決 JVM 記憶體壓力過高的問題。
檢查快取設定
若要清除欄位資料快取,請執行以下查詢:
POST /index_name/_cache/clear?fielddata=true
**注意:**清除快取可能會中斷正在執行的查詢。
如果超過 JVM 斷路器限制且記憶體使用量仍未受控,您將會收到 JVM OutOfMemoryError 訊息。若要解決此問題,請依照組態需求修改上層斷路器欄位資料快取分配或請求斷路器設定。如需修改這些叢集層級設定的資訊,請參閱 OpenSearch 網站上的叢集設定 API。
最佳化組態
使用以下最佳實務來最佳化組態:
如需進一步了解如何對 JVM 記憶體壓力過高的問題進行疑難排解,請參閱為什麼我的 OpenSearch Service 節點會當機?
了解 JVM 記憶體壓力過高的影響
以下情境顯示 OpenSearch Service 如何管理不同百分比的 JVM 記憶體壓力:
- 若 JVM 記憶體壓力達到 75%,OpenSearch Service 會對 x86 執行個體啟動 Concurrent Mark Sweep (CMS) 垃圾回收器。以 ARM 為基礎的 Graviton Amazon EC2 執行個體類型,使用 Garbage-First (G1) 記憶體回收器,此記憶體回收器會使用額外的簡短暫停和堆積重組。
**注意:**垃圾回收是一個大量佔用 CPU 的流程。如果記憶體使用量持續增加,您可能會遇到「ClusterBlockException」、「JVM OutOfMemoryError」或其他叢集效能問題。
- 如果 JVM 記憶體壓力超過 92% 達 30 分鐘,則 OpenSearch Service 會封鎖所有寫入作業。
- 若 JVM 記憶體壓力達到 100%,OpenSearch Service 將終止執行,並最終以「OutOfMemory (OOM)」錯誤訊息重新啟動執行個體。
相關資訊
對 OpenSearch Service 進行疑難排解
OpenSearch Service 入門: 我需要多少碎片?