Amazon Elasticsearch Service クラスターで JVM メモリ負荷が高くなった場合、トラブルシューティングはどうすればよいですか?

最終更新日: 2020 年 4 月 14 日

Amazon Elasticsearch Service (Amazon ES) クラスターで JVM メモリ負荷が高くなっています。 JVM メモリ負荷のレベルはいろいろありますが、それらが何を意味するか、また、それらを減らす方法を教えてください。

解決方法

JVM メモリ負荷は、クラスターノード内の Java ヒープの割合を指定します。次のガイドラインは、JVM メモリ負荷の割合が何を意味するかを示しています。

  • JVM メモリ負荷が 75% に達すると、Amazon ES が Concurrent Mark Sweep (CMS) ガベージコレクターをトリガーします。ガベージコレクションは、CPU 負荷が高くなるプロセスです。この割合で JVM メモリ負荷が数分間続くと、ClusterBlockException、JVM OutOfMemoryError、またはその他のクラスターのパフォーマンスに関して問題が発生する可能性があります。
  • JVM メモリ負荷が 30 分間に 92% を超えた場合、Amazon ES はすべての書き込みオペレーションをブロックします。
  • JVM メモリ負荷が 100% に達した場合、Amazon ES JVM は終了するように設定されており、最終的に OutOfMemory (OOM) で再開されます。

JVM メモリ負荷は、次の理由で発生する可能性があります。

  • クラスターへのリクエスト数のスパイク。
  • 集計、ワイルドカード、クエリでの幅広い時間範囲の選択。
  • ノード間でのシャード割り当ての不均衡、またはクラスター内のシャードが多すぎる。
  • フィールドデータ、またはインデックスマッピングの急激な展開。
  • 受信した負荷を処理できないインスタンスタイプ。

クラスターへのトラフィックを減らすことで、JVM メモリ負荷が高くなる問題を解決できます。クラスターへのトラフィックを減らすには、以下のベストプラクティスに従ってください。

  • POST /index_name/_cache/clear?fielddata=true API オペレーションで、フィールドデータのキャッシュをクリアします。
    注: キャッシュをクリアすると、進行中のクエリが中断される可能性があります。
  • テキストフィールドでの集計を回避するか、マッピングタイプをキーワードに変更します。
  • ドメインを (ノードあたりの最大ヒープサイズが 32 GB となるよう) スケーリングします。
  • スローログを有効にして、問題のあるリクエストを特定します。
    注: JVM メモリ負荷が 90% 未満であることを確認します。低速な Elasticsearch クエリの詳細については、Elastic ウェブサイトの「Advanced tuning: finding and fixing slow Elasticsearch queries」をご参照ください。
  • 検索インデックス作成を最適化し、正しい数のシャードを選択します。インデックス作成とシャードカウントの詳細については、「Amazon Elasticsearch Service をはじめよう: シャード数の算出方法」をご参照ください。
  • 古いまたは未使用のインデックスを削除して、シャードの数を減らします。
  • JVM のメモリサーキットブレーカーを設定します。JVM サーキットブレーカーの詳細については、「JVM OutOfMemoryError」をご参照ください。

高い JVM メモリ負荷をトラブルシューティングする方法の詳細については、「Elasticsearch ノードがクラッシュしたのはなぜですか?」をご参照ください。