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。

相关内容