我正在尝试设置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。