Elasticsearchは、物理メモリが十分な場合、スワップを使わないようにする方がパフォーマンスが良くなります。 スワップを使用しない場合、Linuxのスワップを無効にするか、Elasticsearchの設定を変更してElasticsearchがスワップを使用しないようにする方法があります。

Elasticsearch 6.xでスワップを使用しないように設定

Elasticsearchではスワップを使用しないように設定することができます。 現在の設定は以下を実行して確認できます。

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

実際の結果は以下のようになり、"mlockall" が true になっていればスワップを使わない設定になっています。

# curl http://localhost:9200/_nodes/process?pretty
{
  "_nodes" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "cluster_name" : "elasticsearch",
  "nodes" : {
    "6v9cJJWbTTSvKpfsFxcRHQ" : {
      "name" : "6v9cJJW",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1",
      "version" : "6.3.1",
      "build_flavor" : "default",
      "build_type" : "rpm",
      "build_hash" : "eb782d0",
      "roles" : [
        "master",
        "data",
        "ingest"
      ],
      "attributes" : {
        "ml.machine_memory" : "1040871424",
        "xpack.installed" : "true",
        "ml.max_open_jobs" : "20",
        "ml.enabled" : "true"
      },
      "process" : {
        "refresh_interval_in_millis" : 1000,
        "id" : 7558,
        "mlockall" : true
      }
    }
  }
}

"mlockall" が false になっている場合は以下を参考に、設定ファイルを修正します。

elasticsearch.yml設定

"mlockall" をtrueにするために、以下の設定ファイルを修正します。

/etc/elasticesearch/elasticsearch.yml

elasticsearch.ymlには、以下のようなbootstrap.memory_lockをコメントアウトした箇所があります。

# bootstrap.memory_lock: true
先頭の"#"を削除して、この設定を有効にします。
bootstrap.memory_lock: true

修正後、変更が反映するようにelasticsearchを再起動します。

# systemctl restart elasticsearch

Systemd設定

elasticsearch.ymlを修正して再起動しても"mlockall"がfalseのままなら、以下のページを参考にsystemdの設定を行います。

ます、以下のディレクトリが存在するかを確認します。 yumでインストールしたままだと、このディレクトリは無いので、無い場合はルート権限で作成します。

/etc/systemd/system/elasticsearch.service.d
作成したら、このディレクトリ内に、override.conf というファイルを作成します。
# mkdir /etc/systemd/system/elasticsearch.service.d
# vi /etc/systemd/system/elasticsearch.service.d/override.conf
ファイルの中身は以下のようにします。
[Service]
LimitMEMLOCK=infinity

override.confができたら、以下のコマンドを実行してsystemdに反映されるようにします。

systemcl daemon-reload
反映後、elasticsearchを再起動します。再起動後、"mlockall" が trueになっていることを確認します。
# systemctl  daemon-reload
# systemctl restart elasticsearch

まだ "mlockall" が falseのままの場合は、以下のドキュメントを参考に設定におかしい箇所がないか確認して対処します。

Java VMヒープ設定

Elasticsearch 6では、JVMのヒープサイズ設定にES_HEAP_SIZEを使用することができません。 yumでインストールしている場合は、以下のファイルで設定します。

/etc/elasticsearch/jvm.options

Java VMのヒープサイズ設定は、"-Xms" と "-Xmx" に同じ値を指定します。 デフォルトでは以下のように1GBが指定されています。

################################################################

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms1g
-Xmx1g

Elasticsearchでは全物理メモリの50%を越えないように設定するのが推奨されているようです。 物理メモリを確認して、以下のように "-Xms" と "-Xmx" に同じ値を指定します。

-Xms500m
-Xmx500m

通常は /etc/elasticsearch/jvm.options で設定しますが、以下のファイルで設定することも可能です。

/etc/sysconfig/elasticsearch
この場合は、ES_JAVA_OPTSに、-Xms と -Xmx を指定します。
ES_JAVA_OPTS="-Xms400m -Xmx400m"

参考