Elaticsearchのパフォーマンス設定項目 Part.1


この記事はAwesomeのScalable Infrastructure and performanceとそれに関する記事を元に 作成した記事になります。したがって、Javaのチューニングに関しては取り扱っておりません。別途機会があれば記事にしたいと思います。

メモリ領域の設定

今回はメモリ領域に絞って設定方法を見ていきたいと思います。

メモリがスワッピングするのをロックする

当たり前ですが、検索に大きく影響を与えてしまうスワッピングを避けることが。まず第一義として挙げられます。 スワッピングはメモリがオーバーフローした際に、スワップバイス(物理ディスクにある領域)を利用し、OOMを防ぐ緩衝材 になっているものなので、実際の速度は1000倍近くも遅く、本番環境でこの領域を使用することは避けないといけません。

ElasticsearchではJavaガベージコレクションがヒープの各ページを割り当てます。 システムコールmlockall()でJVM内のヒープをブロックするための設定がElasticsearchには備わっており、 以下の設定をconfig/elasticsearch.ymlに加えることで達成できます。

5.X以前

bootstrap.mlockall: true

5.X以降

bootstrap.memory_lock: true

設定の反映にはElasitcsearchの再起動が必要になるので、設定をし再起動してください。

設定は以下のリクエストを送ることで確認できます。

curl -XGET localhost:9200/_nodes?filter_path=**.mlockall

正しく返ってくると、以下のようなレスポンスが生じされると思います。

{"nodes":{"VyKDGurkQiygV-of4B1ZAQ":{"process":{"mlockall":true}}}}

もし、JVMのヒープをロックすることが失敗したら、実行ユーザに権限が与えられていない 可能性が高いため、次の項目を実施してみてください。

  • rootユーザでulimit -l unlimitedを実行する、もしくは/etc/limits.confのmemlockをunlimitedに設定する
  • RPMDebianを使用している場合は、MAX_LOCKED_MEMORYunlimitedを設定する
  • systemdを使用している場合は、systemd configuration内で、LimitMEMLOCKをinfinityに設定する

十分なヒープサイズを設定する

上記を設定した場合、十分なヒープメモリ領域が必要なので、(デフォルトでは1GB) ES_HEAP_SIZEを設定するか、実行時のフラグで設定するようにしてください。 優先度的にはES_HEAP_SIZEが大きいです。

export ES_HEAP_SIZE=10g
ES_JAVA_OPTS="-Xms10g -Xmx10g" ./bin/elasticsearch 

スワップを無効にする

スワップ領域そのものを無効にするのも方法としてはあります。 一時的に変更する場合はsudo swapoff -aを実行、永続化させるには/etc/fstabのswapの項目をコメントアウトして下さい。

swapiness

sysctlvm.swapiness=1に設定することで、スワッピングする代わりにページキャッシュの領域を 使用しやすくなります。おそらくですが、0にしてしまうとあまり使用しないシステム領域のようなスワッピング してもパフォーマンスに問題ないような項目までもが拒否されるので0にしないほうがいいと思われます。