我在跑Debian GNU/Linux 5.0我遇到了来自内核的间歇性内存不足错误。服务器停止响应除 ping 之外的所有操作,我不得不重新启动服务器。
# uname -a
Linux xxx 2.6.18-164.9.1.el5xen #1 SMP Tue Dec 15 21:31:37 EST 2009 x86_64
GNU/Linux
这似乎是 /var/log/messages 中的重要部分
Dec 28 20:16:25 slarti kernel: Call Trace:
Dec 28 20:16:25 slarti kernel: [<ffffffff802bedff>] out_of_memory+0x8b/0x203
Dec 28 20:16:25 slarti kernel: [<ffffffff8020f825>] __alloc_pages+0x245/0x2ce
Dec 28 20:16:25 slarti kernel: [<ffffffff8021377f>] __do_page_cache_readahead+0xc6/0x1ab
Dec 28 20:16:25 slarti kernel: [<ffffffff80214015>] filemap_nopage+0x14c/0x360
Dec 28 20:16:25 slarti kernel: [<ffffffff80208ebc>] __handle_mm_fault+0x443/0x1337
Dec 28 20:16:25 slarti kernel: [<ffffffff8026766a>] do_page_fault+0xf7b/0x12e0
Dec 28 20:16:25 slarti kernel: [<ffffffff8026ef17>] monotonic_clock+0x35/0x7b
Dec 28 20:16:25 slarti kernel: [<ffffffff80262da3>] thread_return+0x6c/0x113
Dec 28 20:16:25 slarti kernel: [<ffffffff8021afef>] remove_vma+0x4c/0x53
Dec 28 20:16:25 slarti kernel: [<ffffffff80264901>] _spin_lock_irqsave+0x9/0x14
Dec 28 20:16:25 slarti kernel: [<ffffffff8026082b>] error_exit+0x0/0x6e
完整片段在此:http://pastebin.com/a7eWf7VZ
我认为也许服务器实际上内存不足(它有 1GB 的物理内存),但我的 Cacti 内存图看起来正常......
一位朋友在这里纠正了我;他指出,这张图实际上是倒置的,因为紫色表示内存可用(并非如标题所示使用的内存)。
但奇怪的是,在内核崩溃之前不久,负载图突然急剧上升:
我可以查看哪些日志来获取更多信息?
更新:
值得一提的是,崩溃时 CPU 百分比和网络流量图表均正常。唯一异常的是平均负载图表。
更新 2:
我认为这是在我部署 Passenger/Ruby 时开始发生的,并且top
我发现 Ruby 占用了大部分内存和相当多的 CPU:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5189 www-data 18 0 255m 124m 3388 S 0 12.1 12:46.59 ruby1.8
14087 www-data 16 0 241m 117m 2328 S 21 11.4 3:41.04 ruby1.8
15883 www-data 16 0 239m 115m 2328 S 0 11.3 1:35.61 ruby1.8
答案1
检查日志消息中是否有内核内存不足终止程序的迹象,或者OOM killed
检查 的输出dmesg
。这可能会给出哪些进程是 OOM 终止程序的目标的迹象。另请查看以下内容:
http://lwn.net/Articles/317814/
和
http://linux-mm.org/OOM_Killer
这个系统是做什么的?您是否同时耗尽了交换空间?根据您详细描述崩溃的外部链接,看起来问题出在 rsyslogd 上。在这种情况下,定期重启应用程序可能会很方便。
答案2
2.6.18 是一个非常老的内核。我遇到过一些问题,某些情况会触发内核无限循环,导致内存耗尽、I/O 带宽完全用尽等问题,从而无限循环地将相同的数据刷新到磁盘(这会导致负载峰值,但 CPU 使用率正常)。
这些错误往往在报告后不久就会得到修复,因此内核升级是修复此问题的简单方法 - 另外,升级内核意味着您可以免费获得一些安全修复 :-)
答案3
另外要注意的是,不要忘记 Cacti 和类似的图表以一定的分辨率绘制( collectd 默认为 5 秒,我相信 cacti 默认为 30 秒),因此您有 30-60 秒的时间不一定会显示在您的图表上...如果系统完全陷入困境,这也会影响数据收集守护进程。
您可能会在日志文件中找到其他有用的信息,无论是常规的 /var/log/messages 还是服务特定的 /var/log/apache2/error.log。
如果您不能,那么我建议您检查您的服务(我注意到上面的日志摘录中有 apache2)并验证它们是否能够导致服务器出现内存耗尽的情况。(例如:默认的 apache 配置,带有 mod_prefork 和 php 应该能够使您的系统停止运行)。