スワッピングを無効にする

ほとんどのオペレーティングシステムは、ファイルシステムキャッシュのためにできるだけ多くのメモリを使用し、未使用のアプリケーションメモリを積極的にスワップアウトしようとします。これにより、JVMヒープの一部やその実行可能ページがディスクにスワップアウトされる可能性があります。

スワッピングはパフォーマンスに非常に悪影響を及ぼし、ノードの安定性にも悪影響を与えるため、あらゆるコストをかけて避けるべきです。これにより、ガーベジコレクションがミリ秒ではなく数分続くことがあり、ノードが遅く応答したり、クラスターから切断されたりする可能性があります。レジリエントな分散システムでは、オペレーティングシステムにノードを強制終了させる方が効果的です。

スワッピングを無効にするためのアプローチは3つあります。推奨されるオプションは、スワップを完全に無効にすることです。これが不可能な場合、スワップの最小化とメモリロックのどちらを優先するかは、環境に依存します。

すべてのスワップファイルを無効にする

通常、Elasticsearchはボックス上で実行されている唯一のサービスであり、そのメモリ使用量はJVMオプションによって制御されています。スワップを有効にする必要はありません。

Linuxシステムでは、次のコマンドを実行することで一時的にスワップを無効にできます:

  1. sudo swapoff -a

これにより、Elasticsearchの再起動は必要ありません。

永久に無効にするには、/etc/fstabファイルを編集し、swapという単語を含む行をコメントアウトする必要があります。

Windowsでは、System Properties → Advanced → Performance → Advanced → Virtual memoryを介してページングファイルを完全に無効にすることで同等のことが達成できます。

スワップの設定

Linuxシステムで利用可能な別のオプションは、sysctl値vm.swappiness1に設定することです。これにより、カーネルのスワップの傾向が減少し、通常の状況下ではスワッピングが発生しないはずですが、緊急時にはシステム全体がスワップすることを許可します。

bootstrap.memory_lockを有効にする

別のオプションは、Linux/Unixシステムでmlockallを使用するか、WindowsでVirtualLockを使用して、プロセスのアドレス空間をRAMにロックし、Elasticsearchのヒープメモリがスワップアウトされないようにすることです。

一部のプラットフォームでは、メモリロックを使用してもオフヒープメモリがスワップされることがあります。オフヒープメモリのスワップを防ぐために、すべてのスワップファイルを無効にすることをお勧めします。

メモリロックを有効にするには、bootstrap.memory_locktrueに設定します。elasticsearch.yml:

Yaml

  1. bootstrap.memory_lock: true
  1. Elasticsearchを起動した後、この設定が正常に適用されたかどうかは、このリクエストの出力で`````mlockall`````の値を確認することで確認できます:
  2. #### Python
  3. ``````python
  4. resp = client.nodes.info(
  5. filter_path="**.mlockall",
  6. )
  7. print(resp)
  8. `

Ruby

  1. response = client.nodes.info(
  2. filter_path: '**.mlockall'
  3. )
  4. puts response

Js

  1. const response = await client.nodes.info({
  2. filter_path: "**.mlockall",
  3. });
  4. console.log(response);

Console

  1. GET _nodes?filter_path=**.mlockall

mlockallfalseである場合、mlockallリクエストが失敗したことを意味します。また、Unable to lock JVM Memoryという言葉を含む行がログに表示され、より多くの情報が得られます。

Linux/Unixシステムで最も考えられる理由は、Elasticsearchを実行しているユーザーがメモリをロックする権限を持っていないことです。これを付与する方法は次のとおりです:

  • .zip.tar.gz
  • Elasticsearchを起動する前に、ulimit -l unlimitedをrootとして設定します。あるいは、memlockunlimitedに設定します。/etc/security/limits.conf:
    ``````sh

ユーザー’elasticsearch’のmlockallを許可する

elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

  1. - RPMおよびDebian
  2. - [systemd設定](96b3a12ed4f7bcb8.md#systemd)で`````LimitMEMLOCK`````を`````infinity`````に設定します。
  3. `````mlockall`````が失敗する可能性のある別の理由は、[JNA一時ディレクトリ(通常は`````/tmp`````のサブディレクトリ)が`````noexec`````オプションでマウントされていること](/read/elasticsearch-8-15/ae2596cc39e1a970.md)です。これは、`````ES_JAVA_OPTS`````環境変数を使用してJNAの新しい一時ディレクトリを指定することで解決できます:
  4. ``````sh
  5. export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=<path>"
  6. ./bin/elasticsearch

または、jvm.options設定ファイルでこのJVMフラグを設定します。