我已经设法了解OOM杀手是什么,以及它的“坏”规则.虽然我的机器很小,但我的应用程序甚至更小,通常只有一半的物理内存在使用,更不用说交换空间了,所以我很惊讶.我正在努力解决罪魁祸首,但我不知道如何阅读OOM-Killer日志.
任何人都可以请指教我如何阅读日志中的数据(什么是ve,free和gen?),或者帮我解析这些日志?
Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): selecting to kill,queued 0,seq 1,exc 2326 0 goal 2326 0... Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): task ebb0c6f0,thg d33a1b00,sig 1 Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): selected 1,signalled 1,queued 1,exc 2326 0 red 61795 745 Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): selecting to kill,seq 2,exc 122 0 goal 383 0... Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): task ebb0c6f0,exc 383 0 red 61795 745 Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): task ebb0c6f0,sig 2 Apr 20 20:03:27 EL135 kernel: OOM killed process watchdog (pid=14490,ve=13516) exited,free=43104 gen=24501. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=4457,free=43104 gen=24502. Apr 20 20:03:27 EL135 kernel: OOM killed process ntpd (pid=10816,free=43104 gen=24503. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=27401,free=43104 gen=24504. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=29009,free=43104 gen=24505. Apr 20 20:03:27 EL135 kernel: OOM killed process apache2 (pid=10557,free=49552 gen=24506. Apr 20 20:03:27 EL135 kernel: OOM killed process apache2 (pid=24983,free=53117 gen=24507. Apr 20 20:03:27 EL135 kernel: OOM killed process apache2 (pid=29129,free=68493 gen=24508. Apr 20 20:03:27 EL135 kernel: OOM killed process sendmail-mta (pid=941,free=68803 gen=24509. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=12418,free=69330 gen=24510. Apr 20 20:03:27 EL135 kernel: OOM killed process python (pid=22953,free=72275 gen=24511. Apr 20 20:03:27 EL135 kernel: OOM killed process apache2 (pid=6624,free=76398 gen=24512. Apr 20 20:03:27 EL135 kernel: OOM killed process python (pid=23317,free=94285 gen=24513. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=29030,free=95339 gen=24514. Apr 20 20:03:28 EL135 kernel: OOM killed process apache2 (pid=20583,free=101663 gen=24515. Apr 20 20:03:28 EL135 kernel: OOM killed process logger (pid=12894,free=101694 gen=24516. Apr 20 20:03:28 EL135 kernel: OOM killed process bash (pid=21119,free=101849 gen=24517. Apr 20 20:03:28 EL135 kernel: OOM killed process atd (pid=991,free=101880 gen=24518. Apr 20 20:03:28 EL135 kernel: OOM killed process apache2 (pid=14649,free=102748 gen=24519. Apr 20 20:03:28 EL135 kernel: OOM killed process grep (pid=21375,free=132167 gen=24520. Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): selecting to kill,seq 4,exc 4215 0 goal 4826 0... Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): task ede29370,thg df98b880,sig 1 Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): selected 1,exc 4826 0 red 189481 331 Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): task ede29370,sig 2 Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): selecting to kill,seq 5,exc 3564 0 goal 3564 0... Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): task c6c90110,thg cdb1a100,sig 1 Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): selected 1,exc 3564 0 red 189481 331 Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): task c6c90110,sig 2 Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): selecting to kill,seq 6,exc 8071 0 goal 8071 0... Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): task d7294050,thg c03f42c0,sig 1 Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): selected 1,exc 8071 0 red 189481 331 Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): task d7294050,sig 2
看门狗是一个看门狗任务,闲置;日志中没有任何内容表明它已经做了好几天.它的工作是重新启动其中一个应用程序,如果它死了,所以有点讽刺的是它是第一个被杀死的应用程序.
Tail正在监控几个日志文件.不太可能疯狂地消耗记忆.
apache网络服务器只向一位小老太太提供页面,这位老太太只在星期天用它来到教堂,几个睡在床上的开发人员,并且几周没有访问网站上的一个页面.它可能拥有的唯一流量来自端口扫描仪;所有内容都受密码保护,不会在任何地方链接,因此没有蜘蛛感兴趣.
Python运行两个独立的自定义应用程序.日志中没有任何内容表明他们没有像往常一样哼唱.其中一个是相对较新的实施,这使得嫌疑人#1.它没有任何重要的数据结构,通常只使用总物理RAW的8%左右.从那以后它没有行为不端.
grep是嫌疑人#2,我想要有罪,因为这是一次性的命令.该命令(将grep -r的输出传送给另一个grep)至少提前30分钟启动,而且它仍在运行的事实是可疑的.但是,我不会认为grep会使用大量的内存. OOM杀手需要一段时间才能完成它,这表明它并没有发疯,但OOM杀手一旦被杀就停止了,这表明它可能是记忆猪,最终满足了OOM杀手的血腥欲望.
解决方法
首先,我对这个主题感兴趣,因为我正在优化具有有限RAM的系统,以安全的方式运行许多用户进程.
我认为此日志中的错误消息是指OpenVZ Linux容器.
“ve”是一个虚拟环境,在OpenVZ中也称为容器.每个容器都有一个ID,您看到的是该ID.更多相关信息:
术语“空闲”是指那个时刻的空闲内存,以字节为单位.随着进程被终止,你可以看到可用内存逐渐增加.
“gen”这个词我有点不确定.我相信这是指一代人.也就是说,它从1开始并且对于容器中的每一代进程增加一.因此,对于您的系统,启动后似乎执行了24K进程.如果我错了,请纠正我.这应该很容易测试.
至于为什么它会杀死进程,这是因为你的OOM杀手配置.它试图将空闲内存恢复到预期的数量(看起来是128 Kb). Oracle对如何将其配置为您可能更喜欢的内容进行了很好的描述:
http://www.oracle.com/technetwork/articles/servers-storage-dev/oom-killer-1911807.html
此外,如果您想查看每个容器的内存配置,请查看以下内容: