在我们的集群上,当新进程请求太多内存时,我们有时会关闭节点.我很困惑为什么OOM杀手不仅仅是杀死了罪恶的过程.
原因是某些进程得到-17 oom_adj.这使得他们禁止OOM杀手(unkillabe!).
我可以通过以下脚本清楚地看到:
#!/bin/bash for i in `grep -v 0 /proc/*/oom_adj | awk -F/ '{print $3}' | grep -v self`; do ps -p $i | grep -v CMD done
好吧,它对sshd,udevd和dhclient有意义,但后来我看到常规用户进程也得到-17.一旦该用户进程导致OOM事件,它将永远不会被杀死.这导致OOM kiler疯狂. NFS rpc.statd,cron,碰巧不是-17的一切都将被消灭.结果节点关闭.
我有Debian 6.0(Linux 2.6.32-3-amd64).
有谁知道在哪里控制-17 oom_adj赋值行为?
可以从/etc/rc.local启动sshd和Torque mom会导致过度保护行为吗?
解决方法
它从产生它的过程中继承.如果SSH设置为-17,那么Bash将是.如果你通过Bash重新启动,你将进一步产生它.
[i-180ae177] root@migrantgeek ~ # pgrep MysqLd_safe 11395 [i-180ae177] root@migrantgeek ~ # cat /proc/11395/oom_adj 0 [i-180ae177] root@migrantgeek ~ # for pid in `pgrep bash`; do echo -17 > /proc/$pid/oom_adj; done [i-180ae177] root@migrantgeek ~ # /etc/init.d/MysqLd restart Stopping MysqL: [ OK ] Starting MysqL: [ OK ] [i-180ae177] root@migrantgeek ~ # pgrep MysqLd_safe 11523 [i-180ae177] root@migrantgeek ~ # cat /proc/11523/oom_adj -17
编辑init脚本以在启动过程结束时更改值应解决此问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。