Memory

如何優雅地解決這個記憶體問題?

  • April 18, 2019

我有一台帶有交換分區的標準 Linux(Debian 測試)筆記型電腦。

我用它做了很多實驗。其中一些真的很耗記憶體,Linux 預設的行為方式對我來說是個問題……讓我們舉一個愚蠢的例子:

  1. 坐在筆記型電腦前
  2. 打開終端
  3. 鍵入python,然後a = [0]*100000000

現在很有可能您沒有足夠的 RAM 來處理這個大列表。Linux 將填滿 RAM,然後是交換,幾分鐘後,OOM 殺手將被觸發並殺死(幾乎)隨機服務,希望如果你在合適的時間按下 Ctrl+C,python如果終端仍然有焦點,電腦將再次響應。

我想強制執行一些記憶體限制,以避免不必要的交換,並拒絕程序分配比我擁有的記憶體更多的記憶體(在 RAM 中)。如果記憶體需求低於某個限製或被 root 要求,那麼只需殺死除 root 之外的任何使用者中最耗記憶體的程序。

ulimit -Sv [mem]我在後面聽到!

嗬嗬!“cgroups通過cgexec!” 第一排有人說!

是的,你是對的:這些確實是非常好的解決方案。但:

  • 它們不適用於系統範圍
  • 限制是按程序設置的
  • 限制是靜態的,不考慮可用 RAM 的實際數量(AFAIK)
  • 到處都是,他們說這些並不是實施硬限制的真正好解決方案。

我想要的是核心說:“你屬於使用者foo(不是 root),你使用了很多記憶體,我們會用完記憶體。對不起老兄……現在死!”

或者:“你到底在做什麼?你需要x MB,而只有y MB 可用。是的,SWAP 是空的,但你不打算使用 SWAP 來做你的髒活,是嗎?不,我說不!你沒有記憶!如果你堅持,你會死的!

有人在你聽到的建議cgroups。好吧,嘗試尋求那個方向,因為它可以為您提供:

  • 應用於您選擇的一組任務(因此不是系統範圍的,但不是每個程序)
  • 為組設置了限制
  • 限制是靜態的
  • 他們可以對記憶體和/或記憶體+交換實施硬限制

這樣的事情可以讓你更接近你的目標

group limited {
 memory {
   memory.limit_in_bytes = 50M;
   memory.memsw.limit_in_bytes = 50M;
 }
}

這說明這個cgroup下的任務最多只能使用50M的記憶體和50M的記憶體+swap,所以當記憶體滿了就不會swap了,但是如果記憶體沒有滿可以映射一些數據交換,這是可以允許的。

以下是cgroup 記憶體文件的摘錄:

通過使用 memsw 限制,您可以避免因交換不足而導致的系統 OOM。

引用自:https://unix.stackexchange.com/questions/64522