如何對 Amazon OpenSearch Service 叢集上的高 JVM 記憶體壓力進行疑難排解?

上次更新日期:2021 年 7 月 23 日

我的 Amazon OpenSearch Service (Amazon Elasticsearch Service 的後繼者) 叢集具有高 JVM 記憶體壓力。不同的 JVM 記憶體壓力層級代表什麼?我該如何減少壓力級別?

解析度

JVM 記憶體壓力會指定叢集節點中 Java 堆積的百分比。以下準則會說明 JVM 記憶體壓力百分比的含義:

  • 如果 JVM 記憶體壓力達 75%,Amazon OpenSearch Service 會觸發並行標記清除 (CMS) 廢棄項目收集器。廢棄項目收集是 CPU 密集型處理程序。如果 JVM 記憶體壓力保持在此百分比達數分鐘,則您可能會遭遇 ClusterBlockException、JVM OutOfMemoryError 或其他叢集效能問題。
  • 如果 JVM 記憶體壓力在 30 分鐘內超過 92%,則 OpenSearch Service 會封鎖所有寫入操作。
  • 如果 JVM 記憶體壓力達 100%,則系統會將 OpenSearch Service JVM 設定為退出,且最終會重新啟動 OutOfMemory (OOM)。

高 JVM 記憶體壓力可能是由以下原因引起:

  • 對叢集的請求數達峰值。
  • 彙總、萬用字元,以及在查詢中選取寬廣的時間範圍。
  • 節點中的碎片分配不平衡,或一個叢集中有太多碎片。
  • 欄位資料或索引映射劇增。
  • 執行個體類型無法處理傳入的負載。

您可以透過減少叢集流量來解決高 JVM 記憶體壓力問題。若要減少至叢集的流量,請遵循以下最佳實務:

  • 使用 POST /index_name/_cache/clear?fielddata=true API 操作來清除欄位資料快取。
    注意:清除快取可能會中斷進行中的查詢。
  • 避免對文字欄位進行彙總,或將映射類型變更為關鍵字。
  • 擴展網域 (以便使每個節點的堆積大小上限為 32 GB)。
  • 啟用慢速日誌以找出錯誤請求。
    注意:請驗證 JVM 記憶體壓力低於 90%。如需有關慢速 Elasticsearch 查詢的詳細資訊,請參閱進階調校:尋找和修復慢速 Elasticsearch 查詢
  • 選擇正確的碎片數,以最佳化搜尋或索引。如需有關索引和碎片數的詳細資訊,請參閱開始使用 Amazon OpenSearch Service:我需要幾個碎片?
  • 刪除舊的或未使用的索引來減少碎片數量。
  • 若為進階使用者,您可以根據使用案例來更新上層、fielddata 或請求斷路器設定。如需有關 JVM 斷路器的詳細資訊,請參閱 JVM OutOfMemoryError

如需有關對高 JVM 記憶體壓力進行疑難排解的詳細資訊,請參閱為什麼我的 Amazon OpenSearch Service 節點當機?