(如何)我可以使用系统日志来诊断神秘的崩溃?

我在Ubuntu服务器上运行LAMP堆栈。 今天两次,它已经停下来,需要一个硬重启。 在此之前,它已经稳定了好几个月。 自从最后一次改变configuration到现在已经过去了大约两星期,甚至还是很小的。

翻遍,我发现这在系统日志几分钟之前,一个失败的cron邮件提醒我中断:

Sep 22 18:14:33 rfb CRON[4912]: (tom) CMD (/usr/share/rfb-scripts/rrdtool-updater.sh) Sep 22 18:15:40 rfb CRON[4923]: (tom) CMD (/usr/share/rfb-scripts/rrdtool-updater.sh) Sep 22 18:16:36 rfb CRON[4952]: (tom) CMD (/usr/share/rfb-scripts/rrdtool-updater.sh) Sep 22 18:16:48 rfb kernel: [16220.076166] apache2 invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0 Sep 22 18:16:48 rfb kernel: [16220.076173] Pid: 4908, comm: apache2 Not tainted 2.6.32.9-rscloud #6 Sep 22 18:16:48 rfb kernel: [16220.076175] Call Trace: Sep 22 18:16:48 rfb kernel: [16220.076186] [<ffffffff8105ca35>] ? T.383+0x78/0x239 Sep 22 18:16:48 rfb kernel: [16220.076191] [<ffffffff8103dea6>] ? timekeeping_get_ns+0xe/0x2e Sep 22 18:16:48 rfb kernel: [16220.076195] [<ffffffff8105cd2a>] ? __out_of_memory+0x134/0x14b Sep 22 18:16:48 rfb kernel: [16220.076198] [<ffffffff8105cdab>] ? out_of_memory+0x6a/0x94 Sep 22 18:16:48 rfb kernel: [16220.076202] [<ffffffff8105f96f>] ? __alloc_pages_nodemask+0x47f/0x56b Sep 22 18:16:48 rfb kernel: [16220.076206] [<ffffffff81061112>] ? __do_page_cache_readahead+0x9e/0x1a1 Sep 22 18:16:48 rfb kernel: [16220.076212] [<ffffffff810384bd>] ? wake_bit_function+0x0/0x2e Sep 22 18:16:48 rfb kernel: [16220.076214] [<ffffffff81061231>] ? ra_submit+0x1c/0x20 Sep 22 18:16:48 rfb kernel: [16220.076217] [<ffffffff8105af33>] ? filemap_fault+0x17e/0x2ff Sep 22 18:16:48 rfb kernel: [16220.076221] [<ffffffff8106ea79>] ? __do_fault+0x54/0x335 Sep 22 18:16:48 rfb kernel: [16220.076224] [<ffffffff8106f008>] ? handle_mm_fault+0x2ae/0x636 Sep 22 18:16:48 rfb kernel: [16220.076228] [<ffffffff81014211>] ? do_page_fault+0x299/0x2ae Sep 22 18:16:48 rfb kernel: [16220.076232] [<ffffffff81226e18>] ? page_fault+0x28/0x30 Sep 22 18:16:48 rfb kernel: [16220.076235] Mem-Info: Sep 22 18:16:48 rfb kernel: [16220.076237] DMA per-cpu: Sep 22 18:16:48 rfb kernel: [16220.076238] CPU 0: hi: 0, btch: 1 usd: 0 Sep 22 18:16:48 rfb kernel: [16220.076240] CPU 1: hi: 0, btch: 1 usd: 0 Sep 22 18:16:48 rfb kernel: [16220.076242] CPU 2: hi: 0, btch: 1 usd: 0 Sep 22 18:16:48 rfb kernel: [16220.076244] CPU 3: hi: 0, btch: 1 usd: 0 Sep 22 18:16:48 rfb kernel: [16220.076245] DMA32 per-cpu: Sep 22 18:16:48 rfb kernel: [16220.076247] CPU 0: hi: 155, btch: 38 usd: 49 Sep 22 18:16:48 rfb kernel: [16220.076249] CPU 1: hi: 155, btch: 38 usd: 37 Sep 22 18:16:48 rfb kernel: [16220.076251] CPU 2: hi: 155, btch: 38 usd: 22 Sep 22 18:16:48 rfb kernel: [16220.076252] CPU 3: hi: 155, btch: 38 usd: 45 

包括前3行以演示正常操作。 日志继续,但我会让你兴奋。 (如果你真的想看到它,试试这个pastebin 。)

我的问题是,我可以用这个日志来诊断我的问题吗? 如果是这样,怎么样? 对于任何能够告诉我需要怎么做才能防止再次发生的人来说,这是一个好处。

同意,这是apache2这是不幸的过程,但它一直是我以前的罪魁祸首。 通常,特别是使用perl,php或mod_python将继续为某些Web应用程序分配ram。 由于不同的客户端碰到不同的apache进程,他们会不断增加内存使用率。

如果你的stream量足够高,以保持Apache进程活着,最终可能会运行256个Apache进程。 但是,它并不一定要接近这个限制,我曾经有一个使用250-300MB或者ram的30个apache进程给我一个糟糕的一天。

越来越多的交换会花费你一点时间,来看看发生了什么,但是你需要警告,这样你才能看到哪个进程正在吃掉ram,validation它是否确实是apache。

在cron作业中使用free或cacti和snmp使用阈值。 随着免费,你需要观看缓冲区和免费的RAM,总计他们和提醒一些底部的门槛。

另一件事,如果是apache,可能是要带上你的MaxClients,它可以有一个高的默认值。 或者,将MaxRequestsPerChild的数量降到足够低,以便每隔一段时间closures进程。 这只是一个乐队援助,但它可以帮助你足够长的时间来解决问题。

只是我在空中刺伤斯科特M

有些东西试图分配比你更多的内存。 你显然可以添加更多的交换,但这会杀死你的盒子的性能。 可能会添加一个小脚本,可以定期运行[更经常每分钟一次]

 date >> /some/file ps faux >> /some/file 

并logging输出 – 你可能会发现进程分配越来越多的内存。

来自@ user36376的build议很好。 看起来你有一个内存泄漏。 直到你跟踪调整apache以杀死进程服务器后,一些请求可能会给你一些时间来确定泄漏。 由于这是一个新的发生,应该怀疑最近的变化。 你也可以考虑使用ulimit来最小化apache子项的大小。 泄漏的内存可能会被换出,影响不大,因此增加交换可能会有所帮助。

考虑使用top来监视虚拟映像大小。 您可以更改顺序,以便虚拟尺寸是第一个sorting字段。 最大的程序将浮动到顶部。