我试图为内存不足的杀手设置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 ~]# 这是预期的行为吗?如果没有,为什么会发生这种情况?
发布于 2014-05-06 00:14:01
不推荐使用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,您将得到oom_adj=(9 * 1000) / 17 ~= 529.411,由于这些值是整数,oom_score_adj将容纳529。
现在,当您阅读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,因为不动点/整数算法。
https://unix.stackexchange.com/questions/128013
复制相似问题