Linux
完全刪除交換或將交換設置為 0?
在管理具有 512GB 記憶體的伺服器時,我遇到了一個程序,它一直在消耗交換空間,直到達到 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
它會隨著時間的推移不斷增長(以 ~20 MB / 小時的速度),直到消耗掉 100% 的交換。值得一提的是它在 docker 容器中執行,但我不知道這是否會影響任何事情。
交換性:
# cat /proc/sys/vm/swappiness 0
我真的想在這一點上完全禁用交換,但這個答案強烈建議不要這樣做。我有哪些選擇可以將此程序的記憶體完全保留在 RAM 中?
由於您的問題是關於 Docker 容器內的程序,因此值得檢查您是否缺少
vm.overcommit_memory=1
此處所述的配置:Node using swap memory instead of host memory預設情況下,Docker 建議對 Docker 環境使用 vm.swappiness=0 的值,這會阻止交換,除非出現 OOM (OutOfMemory) 情況。所有節點都必須設置 vm.overcommit_memory=1,這告訴核心始終允許記憶體分配,直到沒有真正的記憶體。本文介紹了當 vm.swappiness 使用其他值 0 時可能發生的情況。如果 vm.swappiness 設置為大於 0 的值,您可能會注意到節點上僅使用交換記憶體,即使主機記憶體可用。