如何優雅地解決這個記憶體問題?
我有一台帶有交換分區的標準 Linux(Debian 測試)筆記型電腦。
我用它做了很多實驗。其中一些真的很耗記憶體,Linux 預設的行為方式對我來說是個問題……讓我們舉一個愚蠢的例子:
- 坐在筆記型電腦前
- 打開終端
- 鍵入
python
,然後a = [0]*100000000
現在很有可能您沒有足夠的 RAM 來處理這個大列表。Linux 將填滿 RAM,然後是交換,幾分鐘後,OOM 殺手將被觸發並殺死(幾乎)隨機服務,希望如果你在合適的時間按下 Ctrl+C,
python
如果終端仍然有焦點,電腦將再次響應。我想強制執行一些記憶體限制,以避免不必要的交換,並拒絕程序分配比我擁有的記憶體更多的記憶體(在 RAM 中)。如果記憶體需求低於某個限製或被 root 要求,那麼只需殺死除 root 之外的任何使用者中最耗記憶體的程序。
ulimit -Sv [mem]
我在後面聽到!嗬嗬!“
cgroups
通過cgexec
!” 第一排有人說!是的,你是對的:這些確實是非常好的解決方案。但:
我想要的是核心說:“你屬於使用者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。