我正在嘗試設定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。