[Android Memory] Linux下malloc函数和OOM Killer
下面开始介绍与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来确认。
[ pid ] uid tgid total_vm rss cpu oom_adj name
[ 1] 0 1 2580 1 0 0 init
[ 500] 0 500 3231 0 1 -17 udevd
[ 2736] 0 2736 1470 1 0 0 syslogd
[ 2741] 0 2741 944 0 0 0 klogd
[ 2765] 81 2765 5307 0 0 0 dbus-daemon
[ 2861] 0 2861 944 0 0 0 acpid
...
[ 3320] 0 3320 525842 241215 1 0 stress
/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.