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