Elasticsearchでは、ファイルディスクリプタ数の最大数が設定されています。 そのため、Elasticsearchでファイルを開こうとして、ファイルディスクリプタの最大数制限でエラーになる場合があります。 そのような場合、ファイルディスクリプタの最大数を変更する必要があります。

ファイルディスクリプタ数の確認

現在使用中のファイルディスクリプタ数と最大数を確認する場合、以下を実行します。

 curl http://localhost:9200/_nodes/stats/process?pretty

実行結果は以下のようになります。 この結果の中に"open_file_descriptors"と、"max_file_descriptors"があり、これらがファイルディスクリプタの現在開いている数と、最大数になります。

$ curl http://localhost:9200/_nodes/stats/process?pretty
{
  "_nodes" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "cluster_name" : "elasticsearch",
  "nodes" : {
    "6v9cJJWbTTSvKpfsFxcRHQ" : {
      "timestamp" : 1538827324291,
      "name" : "6v9cJJW",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "roles" : [
        "master",
        "data",
        "ingest"
      ],
      "attributes" : {
        "ml.machine_memory" : "3975294976",
        "xpack.installed" : "true",
        "ml.max_open_jobs" : "20",
        "ml.enabled" : "true"
      },
      "process" : {
        "timestamp" : 1538827324291,
        "open_file_descriptors" : 374,
        "max_file_descriptors" : 65536,
        "cpu" : {
          "percent" : 57,
          "total_in_millis" : 21850
        },
        "mem" : {
          "total_virtual_in_bytes" : 2658086912
        }
      }
    }
  }
}

ファイルディスクリプタ最大数の変更

CentOS7の場合、デフォルトではsystemdで起動しますので、systemdで使用されるelasticsearchの設定を変更する必要があります。

elasticsearch設定の確認

CentOS7の場合、elasticsearchの起動や停止はsystemdで行い、その設定ファイルは以下になります。

/lib/systemd/system/elasticsearch.service

このファイルの中身は以下のようになっています。 ファイルディスクリプタ最大数は、"LimitNOFILE"に指定します。

[Unit]
Description=Elasticsearch
Documentation=http://www.elastic.co
Wants=network-online.target
After=network-online.target

[Service]
RuntimeDirectory=elasticsearch
Environment=ES_HOME=/usr/share/elasticsearch
Environment=ES_PATH_CONF=/etc/elasticsearch
Environment=PID_DIR=/var/run/elasticsearch
EnvironmentFile=-/etc/sysconfig/elasticsearch

WorkingDirectory=/usr/share/elasticsearch

User=elasticsearch
Group=elasticsearch

ExecStart=/usr/share/elasticsearch/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid --quiet

# StandardOutput is configured to redirect to journalctl since
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of processes
LimitNPROC=4096

# Specifies the maximum size of virtual memory
LimitAS=infinity

# Specifies the maximum file size
LimitFSIZE=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Send the signal only to the JVM rather than its control group
KillMode=process

# Java process is never killed
SendSIGKILL=no

# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

# Built for packages-6.3.1 (packages)

elasticsearchの設定の変更

Systemdで使用されているelasticsearchの設定を変更する場合、以下のコマンドで変更したい個所だけ設定します。

sudo systemctl edit elasticsearch
デフォルトではviが起動しますので、以下のようにファイルディスクリプトの最大数を指定します。
[Service]
LimitNOFILE=100000
このファイルの実態は以下になります。直接以下のファイルを作成することも可能です。
/etc/systemd/system/elasticsearch.service.d/override.conf

設定後は、設定個所がsystemdに反映されるように以下のコマンドを実行します。

sudo systemctl daemon-reload
エラーがなければelasticsearchを再起動します。

# systemctl daemon-reload
# systemctl restart elasticsearch