沒有交換的 Linux 仍然開始抖動

沒有交換的 Linux 仍然開始抖動

Debian 9.4、Linux 4.9

有時我會編譯一些幾乎不適合 RAM 的東西,或者一個惡意進程突然開始消耗超出可用記憶體的記憶體。當進程超過可用 RAM 時,即使我啟用了零交換(沒有交換是為了避免這種情況),Linux 也會開始對磁碟造成影響。我猜它開始丟棄並重新加載諸如mmap當前正在運行的二進位檔案的 ped 部分之類的東西?

此時,我的 X 會話很快就變得沒有回應,我所能做的就是等待幾十分鐘,直到整個 X 會話被終止,我才能重新登入。

我試圖四處尋找解決方案,但似乎沒有任何效果。 OOM 殺手無法捕捉此過程,因此vm.overcommit_memory=2我甚至無法使用 GDM 和 Gnome 登入。

有辦法嗎告訴 Linux 根本不要交換?這樣我至少有機會讓 rouge 進程被失敗的進程殺死malloc,即使沒有,至少我不需要等待而盯著一台沒有反應的機器。

或有任何其他提示如何管理這種情況?

答案1

如果您正在編譯的原始程式碼需要幾乎所有可用 RAM(如果不是更多),那麼唯一的高效能解決方案可能是添加真實 RAM。話雖如此,您可以嘗試新增大量交換(例如 RAM 的 2 倍或 3 倍)並設定/proc/sys/vm/swappiness為較低值,例如 1(請注意,對於核心 3.5+ 將其設為 0 會完全停用交換),以便交換僅在確實必要時才使用。這應該可以最大限度地減少顛簸。

答案2

我不明白人們如何建議添加更多 RAM 或更多交換空間。行為不當的應用程式可能會吞噬一切並重現問題。

這種凍結是 Linux 核心中的一個嚴重的架構錯誤。一旦發生凍結,恢復的唯一方法是使用魔術鍵 (alt+sysrq+f) 強制 OOM。內核日誌稍後會告訴您什麼被殺死以及原因。

幾個項目正在嘗試防止用戶空間出現這種凍結。例如,請參閱 EarlyOOM。

相關內容