什么可能导致内核内存不足错误?

什么可能导致内核内存不足错误?

我在跑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 应该能够使您的系统停止运行)。

相关内容