我在 Linode.com 上运行了一个 Ubuntu 7.04 虚拟机来托管一些网站、电子邮件列表等。它在很长一段时间内都可以完美运行。我不修补它或真正关注它。
最近(过去几个月)并且频率越来越高,盒子内存不足,我必须重新启动它。它配置了 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
是否有一种灵丹妙药的方法来确定这里发生了什么?我正在观看“顶部”,虽然我看到可用的实际内存随着时间的推移而下降,但我没有看到明显的罪魁祸首。
也许配置一个 cron 作业以
ps auxh | sort -r --key=4 | head -5
每 30 分钟左右将类似的输出发送给您?这将使您知道该事物的前 5 个内存消费者,这可能有助于追踪罪魁祸首过程。第 4 列是进程消耗的内存百分比。
随着时间的推移,您可能能够发现趋势。
在顶部,尝试使用命令F o按虚拟(总)图像大小排序。然后你会在顶部看到最大的进程。
如果 Apache 进程变得越来越大,例如,如果您通过 mod_php 运行 PHP 脚本,这些脚本有时会处理大量数据,您可能不会注意到任何一个进程大量增长(但每个 Apache 进程都会随着时间的推移而增长一点点) )。如果是这种情况,那么您可以尝试以下方法:
您还可以通过安装 swapd 来消除重新启动的要求,它会在内存不足的情况下自动创建交换文件。