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に保持するための私のオプションは何ですか?
あなたの質問はDockerコンテナ内のプロセスに関するものなので、ここで説明するようにvm.overcommit_memory=1
構成が欠落していないかどうかを確認する価値があります。 ホストメモリの代わりにスワップメモリを使用するノード
デフォルトでは、Docker環境ではvm.swappiness = 0の値を使用することをお勧めします。これにより、OOM(OutOfMemory)条件の場合を除いてスワッピングが防止されます。すべてのノードはvm.overcommit_memory = 1を設定する必要があります。これは、真のメモリがなくなるまで常にメモリ割り当てを許可するようにカーネルに指示します。この記事では、vm.swappinessに0以外の値が使用されるたびに発生する可能性のある状況について説明します。 vm.swappinessが0より大きい値に設定されている場合、ホストメモリが使用可能であったとしても、ノードでスワップメモリのみが使用されていることに気付く場合があります。