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に設定する - RPMやDebianを使用している場合は、
MAX_LOCKED_MEMORY
にunlimited
を設定する - 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
sysctl
のvm.swapiness=1
に設定することで、スワッピングする代わりにページキャッシュの領域を
使用しやすくなります。おそらくですが、0にしてしまうとあまり使用しないシステム領域のようなスワッピング
してもパフォーマンスに問題ないような項目までもが拒否されるので0にしないほうがいいと思われます。