做了一些研究,我發現可以透過在 /proc/pid/oom_adj 中插入一個值來調整甚至使某些進程免受 OOM 殺手的影響,我當然需要使用 pidof 或 pgrep 或 pgrep 為我的進程找到 pid類似的東西,並製作一個腳本,一旦我的所有進程啟動並運行,我就會運行該腳本。
OOM 殺手的問題與其他殺手一樣。表面上看起來理智、理智,但內心深處卻是嚴重的不安,相當瘋狂,常常無法做出正確的判斷。
現在我個人不介意一點殺戮,只要我知道發生了什麼並且對受害者有一定的控制(冷靜點,我說的是電腦的東西)所以我正在尋找更好的方法來保護某些進程針對可怕的OOM 殺手,這樣我就不必在每次所有程式執行或啟動新程式時都執行腳本。有什麼想法可以輕鬆實現這個目標嗎?
答案1
您不應該依賴 OOM Killer 來管理您的流程。 OOM Killer 是當唯一的其他選擇是系統崩潰時的最後手段。例如,所有快取和磁碟緩衝區記憶體都已刷新並提交,所有可以換出/丟棄的內容都已處理,而您仍然沒有足夠的記憶體......顯然您不希望正在運行的系統達到這種狀態。
由於 OOM Killer 運行受到嚴格限制(無法分配更多記憶體、無法在其他進程中交換等),因此它將要殺死你不想被殺死的進程以緩解記憶體壓力。
我認為如果您的系統沒有足夠的內存,您需要添加更多內存或交換空間,具體取決於您是否耗盡了物理內存或總虛擬內存。
另一方面,如果由於內存洩漏或其他錯誤,您有一些失控的進程不時消耗過多內存,則可以通過其他方式控制:
在啟動有問題的進程之前進行設定
ulimit -m
並限制該進程可以分配的記憶體量。如果存在記憶體洩漏且這是相當可預測的,則透過 cron 按計劃優雅地重新啟動有問題的進程。
無論如何,OOM 殺手不是你的朋友,它是一門鬆散的大砲:-/