linux – OOM杀手的法医分析

Ubuntu的Out-Of-Memory Killer对我的服务器造成了严重破坏,悄悄暗杀了我的应用程序,sendmail,apache和其他人.

我已经设法了解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杀手的血腥欲望.

解决方法

我是ServerFault的新手,刚刚看到这篇文章.它似乎已经在队列前面重新浮现,即使它已经老了.我们可能会把这个可怕的人放到床上吗?

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

我认为此日志中的错误消息是指OpenVZ Linux容器.

“ve”是一个虚拟环境,在OpenVZ中也称为容器.每个容器都有一个ID,您看到的是该ID.更多相关信息:

https://openvz.org/Container

术语“空闲”是指那个时刻的空闲内存,以字节为单位.随着进程被终止,你可以看到可用内存逐渐增加.

“gen”这个词我有点不确定.我相信这是指一代人.也就是说,它从1开始并且对于容器中的每一代进程增加一.因此,对于您的系统,启动后似乎执行了24K进程.如果我错了,请纠正我.这应该很容易测试.

至于为什么它会杀死进程,这是因为你的OOM杀手配置.它试图将空闲内存恢复到预期的数量(看起来是128 Kb). Oracle对如何将其配置为您可能更喜欢的内容进行了很好的描述:

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

此外,如果您想查看每个容器的内存配置,请查看以下内容:

https://openvz.org/Setting_UBC_parameters

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


查找全部容器的日志文件 $ sudo find /var/lib/docker/containers -name *.log 查看日志位置 $ docker inspect --format='{{.LogPath}}' <container_name> 实时查询内容 $
Linux日志文件中列属性的详细解析
在Linux系统中没有duf命令,如何有效地管理磁盘空间?
深入探讨EncryptPad在Linux操作系统中的功能和优势
原理和应用场景:Linux中ttyload工具的工作原理和实际用途
深度解析SELinux的三种策略类型
评估Linux系统性能的ttyload工具使用效果
分享在Linux系统中检测SSH版本的方法
介绍Linux平台上的数据加密工具EncryptPad
在Linux系统中,如何查看和诊断块设备信息?
在Linux环境下如何查看块设备信息?
探索Linux操作系统下的数据加密工具EncryptPad
学会在Linux系统中查看硬盘信息
分析SELinux:原理与实践
掌握SELinux策略类别
技巧:有效解读和管理Linux日志文件
查看Linux系统中的所有用户
了解Linux系统中各种不同类型的日志文件
深入理解Linux PS命令
方法:在Linux操作系统中查看用户