关于OOM Killer的proc文件系统

下面开始介绍与OOM Killer相关的proc文件系统。

/proc/<PID>/oom_adj

为/proc/<PID>/oom_adj设置值就可以调整得分。调整值的范围为-16~15。正的值容易被OOM Killer选定。负值可能性较低。例如,当指定3时,得分就变为23倍;当指定-5时,得分就变为1/25

“-17”是一个特殊的值。如果设置为-17,就会禁止OOM Killer发出的信号(从Linux 2.6.12开始支持设置-17)。

在OOM Killer运行的情况下,为了实现远程登录而想要将sshd排除在对象外时,可以执行下列命令。


cat/proc/'cat/var/run/sshd.pid'/oom_score

15

echo-17>/proc/'cat/var/run/sshd.pid'/oom_adj

tail/proc/'cat/var/run/sshd.pid'/oom_*

==>/proc/2278/oom_adj<==

-17

==>/proc/2278/oom_score<==

0/得分变成0/


从Linux 2.6.18开始可以使用/proc/<PID>/oom_adj。内容记载在Documentation/filesystems/proc.txt中。

/proc/sys/vm/panic_on_oom

将/proc/sys/vm/panic_on_oom设置为1时,在OOM Killer运行时可以不发送进程信号,而是使内核产生重大故障。

echo 1>/proc/sys/vm/panic_on_oom

/proc/sys/vm/oom_kill_allocating_task

从Linux 2.6.24开始proc文件系统就有oom_kill_allocating_task。如果对此设置除0以外的值,则促使OOM Killer运行的进程自身将接收信号。此处省略对所有进程的得分计算过程。


echo 1>/proc/sys/vm/oom_kill_allocating_task


这样就不需要参照所有进程,但是也不会考虑进程的优先级和root权限等,只发送信号。

/proc/sys/vm/oom_dump_tasks

从Linux 2.6.25开始,将oom_dump_tasks设置为除0以外的值时,在OOM Killer运行时的输出中会增加进程的列表信息。

下面为设置示例。


echo 1>/proc/sys/vm/oom_dump_tasks


列表信息显示如下,可以使用dmesg或syslog来确认。

关于OOM Killer的proc文件系统 - 图1

/proc/<PID>/oom_score_adj

从Linux 2.6.36开始都安装了/proc/<PID>/oom_score_adj,此后将替换为/proc/<PID>/oom_adj。详细内容请参考Documentation/feature-removal-schedules.txt。即使当前是对/proc/<PID>/oom_adj进行的设置,在内核内部进行变换后的值也是针对/proc/<PID>/oom_score_adj设置的。

/proc/<PID>/oom_score_adj可以设置-1000~1000之间的值。设置为-1000时,该进程就被排除在OOM Killer强制终止的对象外。

在内核2.6.36以后的版本中写入oom_adj,只会输出一次如下的信息。


dmesg

……

udevd(60):/proc/60/oom_adj is deprecated, please use/proc/60/oom_score_adj

instead.

……