对OOM杀手的法医分析

Ubuntu的内存不足杀手肆虐我的服务器,悄悄暗杀我的应用程序,sendmail,Apache等。

我已经设法了解OOM杀手是什么,以及它的“坏”规则。 虽然我的机器很小,我的应用程序甚至更小,通常只有一半的物理内存在使用,更不用说交换空间了,所以我很惊讶。 我试图找出罪魁祸首,但我不知道如何阅读OOM杀手日志。

任何人都可以请教我关于如何阅读日志中的数据(什么是vefreegen ?),还是帮我parsing这些日志?

 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, seq 1, exc 2326 0 red 61795 745 Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, seq 2, exc 122 0 goal 383 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, seq 2, exc 383 0 red 61795 745 Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): task ebb0c6f0, thg d33a1b00, 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, ve=13516) exited, free=43104 gen=24502. Apr 20 20:03:27 EL135 kernel: OOM killed process ntpd (pid=10816, ve=13516) exited, free=43104 gen=24503. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=27401, ve=13516) exited, free=43104 gen=24504. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=29009, ve=13516) exited, free=43104 gen=24505. Apr 20 20:03:27 EL135 kernel: OOM killed process apache2 (pid=10557, ve=13516) exited, free=49552 gen=24506. Apr 20 20:03:27 EL135 kernel: OOM killed process apache2 (pid=24983, ve=13516) exited, free=53117 gen=24507. Apr 20 20:03:27 EL135 kernel: OOM killed process apache2 (pid=29129, ve=13516) exited, free=68493 gen=24508. Apr 20 20:03:27 EL135 kernel: OOM killed process sendmail-mta (pid=941, ve=13516) exited, free=68803 gen=24509. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=12418, ve=13516) exited, free=69330 gen=24510. Apr 20 20:03:27 EL135 kernel: OOM killed process python (pid=22953, ve=13516) exited, free=72275 gen=24511. Apr 20 20:03:27 EL135 kernel: OOM killed process apache2 (pid=6624, ve=13516) exited, free=76398 gen=24512. Apr 20 20:03:27 EL135 kernel: OOM killed process python (pid=23317, ve=13516) exited, free=94285 gen=24513. Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=29030, ve=13516) exited, free=95339 gen=24514. Apr 20 20:03:28 EL135 kernel: OOM killed process apache2 (pid=20583, ve=13516) exited, free=101663 gen=24515. Apr 20 20:03:28 EL135 kernel: OOM killed process logger (pid=12894, ve=13516) exited, free=101694 gen=24516. Apr 20 20:03:28 EL135 kernel: OOM killed process bash (pid=21119, ve=13516) exited, free=101849 gen=24517. Apr 20 20:03:28 EL135 kernel: OOM killed process atd (pid=991, ve=13516) exited, free=101880 gen=24518. Apr 20 20:03:28 EL135 kernel: OOM killed process apache2 (pid=14649, ve=13516) exited, free=102748 gen=24519. Apr 20 20:03:28 EL135 kernel: OOM killed process grep (pid=21375, ve=13516) exited, free=132167 gen=24520. Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, 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, signalled 1, queued 1, seq 4, exc 4826 0 red 189481 331 Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): task ede29370, thg df98b880, sig 2 Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, 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, signalled 1, queued 1, seq 5, exc 3564 0 red 189481 331 Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): task c6c90110, thg cdb1a100, sig 2 Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, 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, signalled 1, queued 1, seq 6, exc 8071 0 red 189481 331 Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): task d7294050, thg c03f42c0, sig 2 

看门狗是一个看门狗任务,闲置; 日志里没有任何东西表明它已经做了好几天了。 它的工作是重新启动一个应用程序,如果它死了,所以有点讽刺的是,这是第一个被杀死的。

尾巴正在监视几个日志文件。 不大可能疯狂地消耗记忆。

apache网站服务器只为一位小老太太提供服务, 这个老太太每个星期天都会到教堂去找几个睡觉的开发者,而且几个星期之前还没有访问过这个网站的一个页面。 它可能有的唯一的stream量是从端口扫描仪; 所有的内容都是密码保护的,并且从任何地方都没有链接,所以没有蜘蛛感兴趣。

Python运行两个独立的自定义应用程序。 日志中没有任何东西表明他们没有像平常那样哼唱。 其中之一是相对较近的实施,这使得怀疑#1。 它没有任何重要的数据结构,通常只使用总物理RAW的8%左右。 从那以后它没有任何不妥。

grep是可疑的#2,我想犯罪,因为这是一次性的命令。 命令(将grep -r的输出传送给另一个grep)已经至less在30分钟之前启动,而且它仍在运行的事实是可疑的。 但是,我不会认为grep会使用大量的内存。 OOM杀手需要一段时间才能到达它,这表明它不会发疯,但OOM杀手一旦死亡就停下来,这可能是一个记忆猪,最终满足了OOM杀手的血腥欲望。

我是ServerFault的新手,刚刚看到这个post。 即使已经老了,它似乎已经在队列的前面重新出现了。 让我们把这个恐怖的人放在床上吧?

首先,我对这个主题感兴趣,因为我正在优化有限RAM的系统,以安全的方式运行许多用户进程。

我认为这个日志中的错误信息是指OpenVZ Linux容器。

“ve”是一个虚拟环境,也被称为OpenVZ中的一个容器。 每个容器都有一个ID,你看到的是这个ID。 更多关于这里:

https://openvz.org/Container

术语“空闲”是指当时在空闲时的字节数。 随着进程被杀死,你可以看到自由内存逐渐增加。

“gen”这个词我有点不确定。 我相信这是指一代。 也就是说,它从1开始,并在容器中的每一代进程中增加1。 所以,对于你的系统,看起来有24K +进程从启动以来执行。 如果我错了,请纠正我。 这应该很容易testing。

至于为什么它杀死进程,这是因为你的OOM杀手configuration。 它试图将可用内存恢复到预期的数量(看起来是128 Kb)。 Oracle对如何将其configuration为您可能更喜欢的方式进行了很好的说明:

http://www.oracle.com/technetwork/articles/servers-storage-dev/oom-killer-1911807.html

另外,如果您想查看每个容器的内存configuration,请查看:

https://openvz.org/Setting_UBC_parameters