OOM Killer 值始終比設定值小 1

OOM Killer 值始終比設定值小 1

我正在嘗試設定oom_adj記憶體不足殺手的值,每次我這樣做(無論過程如何),我都會得到比我設定的值少一的值(至少對於正整數。自從我開始,我就沒有嘗試過負整數)希望這些進程首先被 OOM Killer 殺死)。

[root@server ~]# echo 10 > /proc/12581/oom_adj
[root@server ~]# cat /proc/12581/oom_adj
9
[root@server ~]# echo 9 > /proc/12581/oom_adj
[root@server ~]# cat /proc/12581/oom_adj
8
[root@server ~]# echo 8 > /proc/12581/oom_adj
[root@server ~]# cat /proc/12581/oom_adj
7
[root@server ~]# echo 7 > /proc/12581/oom_adj
[root@server ~]# cat /proc/12581/oom_adj
6
[root@server ~]# 

這是預期的行為嗎?如果不是,為什麼會發生這種情況?

答案1

oom_adj已棄用並僅用於遺留目的。 Linux 內部使用的oom_score_adj範圍更大:oom_adj最多 15 個,oom_score_adj最多 1000 個。

每當您寫入oom_adj(假設為 9)時,核心都會執行以下操作:

oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE;

並將其儲存到oom_score_adj.OOM_SCORE_ADJ_MAX是 1000,OOM_DISABLE是 -17。

因此,對於 9,您將得到529,oom_adj=(9 * 1000) / 17 ~= 529.411因為這些值是整數。oom_score_adj

現在當你閱讀oom_adj核心時會這樣做:

oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) / OOM_SCORE_ADJ_MAX;

因此,對於 529,您將得到:oom_adj = (529 * 17) / 1000 = 8.993由於內核使用整數和整數算術,因此這將變為 8。

所以,你寫下 9,由於定點/整數運算,你會得到 8。

相關內容