Ubuntu 7.04虚拟机运行内存不足

我在Linode.com上运行一个Ubuntu 7.04虚拟机来托pipe几个网站,电子邮件列表等等。它在很长一段时间里工作得非常完美。 我不修补它,或者真的注意它。

最近(过去几个月),随着频率的增加,盒子内存不足,我不得不重新启动它。 它configuration了350MB真实内存,外加64MB交换。 它运行Apache,Mysql,Postfix和mailman。

内存不足的症状是显而易见的,我在kernel.log中看到这些:

Jul 21 10:16:42 grendel kernel: Out of memory: kill process 30364 (apache2) score 11205 or a child Jul 21 10:16:42 grendel kernel: Killed process 30364 (apache2) Jul 21 10:16:42 grendel kernel: apache2 invoked oom-killer: gfp_mask=0xa01d2, order=0, oomkilladj=0 

有没有银弹法来确定这里发生了什么? 我正在看“顶”,而我看到随着时间的推移可用的真实记忆下降,我没有看到明显的罪魁祸首。

也许configuration一个cron作业来发送类似ps auxh | sort -r --key=4 | head -5的东西 ps auxh | sort -r --key=4 | head -5 每隔30分钟左右你ps auxh | sort -r --key=4 | head -5

这会让你知道前五的记忆消费者的东西,这可能有助于追查罪魁祸首的过程。 第四列是进程消耗的内存的百分比。

你可能会发现一段时间的趋势。

最后,尝试使用命令F o按虚拟(全部)图像大小进行sorting。 然后你会看到最大的进程。

如果Apache进程变得越来越大,例如,如果你正在通过mod_php运行PHP脚本,这些脚本有时可以处理大量的数据,那么你可能不会注意到任何一个进程都会大规模地增长(但是随着时间的推移,每个Apache进程都会增长一点)。 如果是这种情况,那么你可以尝试以下方法:

  • 通过调整选项来限制Apache使用的subprocess的数量:
    • StartServers的
    • 比MinSpareServers
    • MaxSpareServers的
    • MaxClients的
  • 如果你用Apache做的每件事都是线程安全的,那么考虑使用mpm_worker而不是mpm_perfork
  • 确保KeepAliveTimeout不会太高(这会阻止错误的客户端持续一个进程时间过长,尤其重要的是,如果您严格限制了孩子的数量
  • 使用MaxRequestsPerChild选项减less每个进程的最大生存时间将有助于解决由于内存泄漏导致的问题,但如果将其configuration得太远,可能会使服务效率显着下降

您也可以通过安装swapd来删除重新启动的要求,这将在内存不足的情况下自动创build交换文件。