如何使用oom_score_adj?


24

在11.04中,/proc/[pid]包含oom_score_adjman proc描述了旧的oom_adj。我没有在Google上搜索有关如何使用此功能的任何信息。

我需要安排的是,先杀死由“ pbs”或“ gridengine”启动的进程,然后再杀死其他任何事物。我怎样才能做到这一点?


要针对由Upstart管理的服务永久进行此更改:如何为守护程序永久设置OOM杀手调整?
gertvdijk

已经是答案了。它链接到它。:)
gertvdijk

但不在此站点上:-)
bmargulies

Answers:


13

基于对类似问题在Unix&Linux上的问答。

正如Stuart在回答中很好地指出的,有效值是-的-1000到1000范围内的整数oom_score_adj。在较低的值时,降低的是它会被杀死的机会。

重新启动应用程序后,必须一遍又一遍地更改此值是非常不便的。该过程终止后,信息只会丢失。Upstart(Ubuntu中的init守护程序),有一个不错的选择,可以配置守护程序以确保它在重新启动时已设置:

oom score

[...]片段[...]

例:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

因此,基本上,您可以编辑/etc/init/myservice.conf要更改的服务的配置文件,以包含line oom score -1000。我确实假设您在问题中谈论的服务“ pbs”或“ gridengine”已启用Upstart,否则您将需要另一种永久更改此方法的方法。


7

如果您可以修改启动脚本以生成要优先处理oom-killer的进程,请在启动脚本中添加以下内容:

echo 1000 > /proc/self/oom_score_adj

该值是为子进程继承的。


6

如果您为oom_adj或oom_score_adj设置较高的(ish)值,则它们将首先被杀死。例如

echo 15 > /proc/[pid]/oom_adj

oom_adj从-16变为15,并且如上所述oom_score_adj接受-1000至1000


您需要具有root才能执行此操作。sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
阿迪尔2014年

2
其实,你可以增加对分数过程W / O根(“是的,这可能是OOM杀死”)。减少(低于0)需要root。
Piskvor '17

5

查看代码始终是一个好主意。正常情况下,我使用kernel.org的搜索功能,但目前无法使用。Github也做得很好。我找到了这个:

而是添加了一个新的可调参数/ proc / pid / oom_score_adj,范围从-1000到+1000。它可以用来使启发式两极分化,以使某些任务永远不会被视为杀死oom,而其他任务却总是会被考虑。该值直接添加到badness()分数中,因此,例如,值-500意味着与系统上绑定到内存的内存中的其他任务相比,将其内存消耗的50%折价。共享相同的内存控制器。

来自https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h


为指针表示感谢,但我希望有人开车过去,并提出解决整个问题的方法,这似乎正在安排在派生任何作业之前为pbs的exec守护程序设置此值。
bmargulies 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.