Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

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/elasticsearchMAX_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を利用すると大変便利ですよ!

併せて読みたい