Linux

完全刪除交換或將交換設置為 0?

  • August 11, 2019

在管理具有 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 的值,您可能會注意到節點上僅使用交換記憶體,即使主機記憶體可用。

引用自:https://serverfault.com/questions/978780