Oom

如何計算核心 oom 分數?

  • January 31, 2014

在 Google 上查看,找不到任何解釋如何proc/<pid>/oom_score計算分數的內容。為什麼使用這個分數而不是只使用使用的總記憶體?

請參閱 Goldwyn Rodrigues 的2009 年文章了解當時的實施情況,Jonathan Corbet 的2010 年文章了解我認為目前的行為,以及 Jonathan Corbet 的2013 年文章了解有關未來變化的想法。

來自 2010 年的文章:

在 David 的更新檔集中,舊的 badness() 啟發式方法幾乎完全消失了。相反,計算變成了一個簡單的問題,即程序使用了多少可用記憶體百分比。如果整個系統記憶體不足,那麼“可用記憶體”是系統可用的所有 RAM 和交換空間的總和。相反,如果 OOM 情況是由於耗盡了給定 cpuset/控制組所允許的記憶體而引起的,那麼“可用記憶體”就是分配給該控制組的總量。如果超出記憶體策略施加的限制,則會進行類似的計算。在每種情況下,程序的記憶體使用被認為是它的駐留集(它正在使用的 RAM 頁數)和它的交換使用的總和。

這個計算結果是一個百分比乘以十的數字;使用可用記憶體的每個字節的程序將獲得 1000 分,而根本不使用記憶體的程序將獲得零分。這個分數很少有啟發式調整,但程式碼仍然從根擁有的程序的分數中減去少量(30),因為它們比使用者擁有的程序更有價值。

應用的另一項調整是添加儲存在每個程序的 oom_score_adj 變數中的值,該變數可以通過 /proc 進行調整。這個旋鈕允許調整每個程序對使用者空間中OOM殺手的吸引力;將其設置為 -1000 將完全禁用 OOM 終止,而設置為 +1000 相當於在關聯程序上繪製一個大目標。

引用自:https://serverfault.com/questions/571319