有沒有辦法配置 Linux OOM 殺手來殺死父程序而不是子程序?
有沒有辦法配置 Linux OOM 殺手來殺死父程序而不是子程序?當子程序被殺死時,父程序繼續以錯誤的狀態執行。我可以檢測孩子是否被殺死然後退出,但我想知道是否有辦法告訴 OOM 殺手殺死父程序而不是犧牲子程序。
您可以通過更改 virtual file 中的值來調整任何給定程序被選為 OOM 殺手受害者的機率
/proc/<pid>/oom_score_adj
。該值越接近 1000,OOM 殺手選擇該程序的可能性就越大。OOM 殺手用來選擇受害者的邏輯在許多不同的核心版本中都發生了變化。現代核心版本預設情況下更喜歡殺死孩子,因為通常的錯誤情況是例如 web 伺服器啟動工作程序,如果發生錯誤,單個工作程序會失控並開始消耗記憶體,最好的糾正措施是殺死孩子並假設父程序在註意到子程序被殺死時可以處理這種情況。在 Apache 的情況下,它只會記錄給定子節點的失敗並繼續執行。另一方面,PostgreSQL(看起來與核心非常相似!)會注意到子程序被殺死,並會自動殺死所有其他子程序,並重新啟動父程序以確保完全了解整個系統狀態。在這兩種情況下,殺死公正的父程序都不會產生更好的結果。具有多個選項卡(每個選項卡作為單獨的子程序執行)的 Google Chrome 的工作方式類似,並且一個耗盡 RAM 的選項卡不應導致整個瀏覽器停機。
問題
oom_score_adj
在於它不是 OOM 殺手選擇邏輯的乘數,而是針對程序計算的總系統 RAM 的額外百分比。例如,如果您有 32 GB 的 RAM 並且 Chrome 選項卡的oom_score_adj
值為 300(由 Google Chrome 主機程序自動設置)並且該選項卡實際上消耗了 105 MB 的 RAM,那麼它肯定會被選為 OOM 受害者,因為當 OOM 殺手是選擇受害者,核心 OOM 殺手實現目前計算該 Chrome 孩子的“邏輯記憶體使用量”為 105 MB + 300/1000 * 32 GB = 9705 MB。顯然,系統不會通過殺死該程序來釋放 9.7 GB 的 RAM,但除非您有更大的程序,否則它將被選中。