我們有一個 debian linux 網路伺服器。它只是運行apache2。我們的 mysql 伺服器在另一台主機上。然而,我們有時會在網頁伺服器上執行 cron 任務來執行常規任務。
然而最近一個 cron 任務出現了一個錯誤並開始吞噬記憶體。 Linux OOM 殺手殺死了 apache。這當然導致了我們的網站癱瘓。佔用記憶體的 cron 繼續運行。然而在這種情況下,我希望 OOM 殺手殺死該腳本,並且不是阿帕奇。
有什麼方法可以配置內核以便我可以說不殺死名為「apache2」的進程(或至少使 apache2 成為最後的它殺死的東西)? apache 和常規 crons 都以同一用戶(www-user)運行。
答案1
聽起來您並沒有透過實際調試這個 cron 作業佔用如此多內存的原因來解決問題的根本原因。
您可以嘗試設定此選項
echo 1 > /proc/sys/vm/oom_kill_alaving_task
這將告訴 OOM 殺手殺死觸發 OOM 條件的進程,但這不能保證是您的 cron 作業。您也可以在腳本中使用「ulimit -m」來設定要使用的最大駐留記憶體量。我認為你最好的選擇是評估為什麼 cronjob 消耗了這麼多內存,以及它是否最適合另一台主機,或者是否需要重寫以消耗更少的內存。
答案2
OOMKiller是一定程度上可配置。啟動進程後,您可以將 的值設為/proc/<pid>/oom_adj
負整數。這將影響 OOMKiller 對進程及其子進程的親和力。當您的系統遇到記憶體不足的情況時,其他進程將被終止。
答案3
您也可以更改虛擬記憶體的提交行為。例如,您可以將 /proc/sys/vm/overcommit_memory 的值變更為「2」—這表示不要過度使用記憶體。 (不要在不了解它的作用的情況下就改變這個值。)
在「無過度使用」模式下,無論新進程要求更多內存,在嘗試分配時都會收到錯誤。因此,與其讓 OOM 殺手去破壞您舊的、長時間運行的進程,不如讓新人請求 RAM 時被告知「不」。
……然後你需要解決你的記憶問題。找到洩漏,重新設計記憶體消耗進程,為盒子添加更多記憶體等。
答案4
這裡說你可以在進程上設定 OOM_DISABLE「標誌」: http://linux-mm.org/OOM_Killer