web-dev-qa-db-ja.com

スワップを完全に削除しますか、それともスワップピネスを0に設定しますか?

512GBのRAMでサーバーを管理しているときに、スワップスペースの100%に達するまでスワップを消費し続け、その後それ以上の消費を停止する(6GBのスワップ)が正常に動作し続けるプロセスに遭遇しました(ただし、リクエストがプロセスに入ると、必要なパフォーマンスに到達するまでに長い時間(20分以上)がかかります)。

Swappinessを0に設定しても、このプロセスのスワップを防ぐことはできません。

freeがこれを示している間にスワッピングが発生します:

# free -h --giga
              total        used        free      shared  buff/cache   available
Mem:           515G         16G        2.3G         30M        497G        496G
Swap:          5.8G        1.0M        5.8G

問題のプロセス:

# smem -s swap -t -n -k
  PID User     Command                         Swap      USS      PSS      RSS
(...)
36776 1000     Java -XX:+UseG1GC -Xms1G -X     1.6M    13.4G    13.4G    13.4G
-------------------------------------------------------------------------------
  148 11                                       2.0M    15.1G    15.2G    15.9G

100%のスワップが消費されるまで、時間の経過とともに(〜20 MB /時間の速度で)成長し続けます。 Dockerコンテナで実行されていることは言及する価値があるかもしれませんが、それが何かに影響を与えるかどうかはわかりません。

Swappiness:

# cat /proc/sys/vm/swappiness
0

私は本当にこの時点でスワップを完全に無効にしたいのですが this 回答はそれに対して強くお勧めします。このプログラムのメモリを完全にRAMに保持するための私のオプションは何ですか?

1
Gizmo

あなたの質問はDockerコンテナ内のプロセスに関するものなので、ここで説明するようにvm.overcommit_memory=1構成が欠落していないかどうかを確認する価値があります。 ホストメモリの代わりにスワップメモリ​​を使用するノード

デフォルトでは、Docker環境ではvm.swappiness = 0の値を使用することをお勧めします。これにより、OOM(OutOfMemory)条件の場合を除いてスワッピングが防止されます。すべてのノードはvm.overcommit_memory = 1を設定する必要があります。これは、真のメモリがなくなるまで常にメモリ割り当てを許可するようにカーネルに指示します。この記事では、vm.swappinessに0以外の値が使用されるたびに発生する可能性のある状況について説明します。 vm.swappinessが0より大きい値に設定されている場合、ホストメモリが使用可能であったとしても、ノードでスワップメモリ​​のみが使用されていることに気付く場合があります。

3
eider96