elasticsearchのファイルディスクリプタを監視する
elasticsearchはLuceneをベースにしているため、細かい粒度でのファイルを多く生成します。
そのため "too many open files" エラーが発生して停止しないよう、安定稼働のためには日頃のリソース監視が必要です。
では、どのようにファイルディスクリプタの利用状況を確認すれば良いのでしょうか。調べてみました。
検証環境
複数のバージョンでテストしております。
- elasticsearch 1.0.1
- elasticsearch 1.3.4
- elasticsearch 1.4.2
調査の目的
root権限が必要な/proc/{proc_id}/limits
などを参照せずに次の値を取得する方法。
- max_file_descriptors
- open_file_descriptors
同時に開ける最大のファイル数(Max open files)の確認
elasticsearchいずれのバージョンでも同様の結果を取得できます。 ?prettyを付けると人間に読みやすい形式で改行やインデントをしてくれるので大変便利ですね。
この結果の{nodes}->{e1Gbmg6PQdOklg7NktAEvA}->{process}->{max_file_descriptors}を参照します。
$ curl localhost:9200/_nodes/_local/process?pretty { "cluster_name" : "elasticsearch", "nodes" : { "e1Gbmg6PQdOklg7NktAEvA" : { "name" : "Soldier X", "transport_address" : "inet[/**.**.**.***:9300]", "host" : "******", "ip" : "**.**.**.***", "version" : "1.4.2", "build" : "927caff", "http_address" : "inet[/**.**.**.***:9200]", "process" : { "refresh_interval_in_millis" : 1000, "id" : 2403, "max_file_descriptors" : 65535, "mlockall" : false } } } }
jqコマンドなら、次のように値だけ取得できます。
$ curl -s localhost:9200/_nodes/_local/process | jq '.nodes[] |.process.max_file_descriptors' 65535
もし未設定の場合には、多めに設定しておきましょう。
CentOSであれば/etc/sysconfig/elasticsearch
のMAX_OPEN_FILES
を編集します。
open file descriptorsの確認
現在開いているファイル数は、次のコマンド結果のopen_file_descriptors
を見ます。
elasticsearchいずれのバージョンでも同様の結果を取得できます。
$ curl localhost:9200/_nodes/_local/stats/process?pretty { "cluster_name" : "elasticsearch", "nodes" : { "e1Gbmg6PQdOklg7NktAEvA" : { "timestamp" : 1421290231439, "name" : "Soldier X", "transport_address" : "inet[/**.**.**.***:9300]", "host" : "", "ip" : [ "inet[/**.**.**.***:9300]", "NONE" ], "process" : { "timestamp" : 1421290231439, "open_file_descriptors" : 222, "cpu" : { "percent" : 0, "sys_in_millis" : 38985620, "user_in_millis" : 48149180, "total_in_millis" : 87134800 }, "mem" : { "resident_in_bytes" : 1137655808, "share_in_bytes" : 13058048, "total_virtual_in_bytes" : 13476794368 } } } } }
なお、軽量JSONパーサー『jq』なら、次のようにデータだけ取得できます。
$ curl -s localhost:9200/_nodes/_local/stats/process | jq '.nodes[] |.process.open_file_descriptors' 222
まとめ
傾向を把握するためにも、日頃からリソース監視を行い、グラフなどで可視化しておけると良いですね。
リソース監視の際には、Perlで書かれた次のMunin Pluginを利用すると大変便利ですよ!
- A useful Munin plugin for monitoring elasticsearch 1.x nodes in Perl.
https://github.com/y-ken/munin-plugin-elasticsearch
併せて読みたい
- Elasticsearch のノードで "too many open files" が出てしまったので対処したメモ - ようへいの日々精進 XP
http://inokara.hateblo.jp/entry/2014/03/08/083548