首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >杀人的价值总是比设定的少一个

杀人的价值总是比设定的少一个
EN

Unix & Linux用户
提问于 2014-05-05 19:56:48
回答 1查看 949关注 0票数 3

我试图为内存不足的杀手设置oom_adj值,每次(不管进程如何)我都会得到比我设置的更少的值(至少对于正整数来说是这样)。我从未尝试过负整数,因为我希望这些进程首先被OOM Killer杀死)。

代码语言:javascript
复制
[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 ~]# 

这是预期的行为吗?如果没有,为什么会发生这种情况?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2014-05-06 00:14:01

不推荐使用oom_adj,并且只为遗留目的提供。在内部,Linux使用的oom_score_adj范围更广:oom_adj上升到15,而oom_score_adj上升到1000。

每当您写信给oom_adj (比方说9)时,内核就会这样做:

代码语言:javascript
复制
oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE;

并将其存储到oom_score_adjOOM_SCORE_ADJ_MAX是1000,OOM_DISABLE是-17。

因此,对于9,您将得到oom_adj=(9 * 1000) / 17 ~= 529.411,由于这些值是整数,oom_score_adj将容纳529。

现在,当您阅读oom_adj时,内核将这样做:

代码语言:javascript
复制
oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) / OOM_SCORE_ADJ_MAX;

因此,对于529,您将得到:oom_adj = (529 * 17) / 1000 = 8.993,并且由于内核使用整数和整数算术,这将变成8。

所以在那里..。你写9,你得到8,因为不动点/整数算法。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/128013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档