Ubuntu 7.04 VM 内存不足

Ubuntu 7.04 VM 内存不足

我在 Linode.com 上运行着一台 Ubuntu 7.04 VM,用于托管一些网站、电子邮件列表等。它运行了很长时间,没有出现任何问题。我没有给它打补丁,也没有真正关注过它。

最近(过去几个月),这种情况越来越频繁,盒子内存不足,我不得不重新启动它。它配置了 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

有没有一种灵丹妙药方法可以确定这里发生了什么?我正在观察“top”,虽然我看到可用的实际内存随着时间的推移而减少,但我没有发现明显的罪魁祸首。

答案1

ps auxh | sort -r --key=4 | head -5也许可以配置一个 cron 作业,每隔 30 分钟左右将类似的输出邮寄给您?

这样您就可以了解该设备上内存消耗最大的 5 个进程,这可能有助于追踪罪魁祸首进程。第 4 列是进程消耗的内存百分比。

您可能能够发现随着时间的推移而出现的趋势。

答案2

在顶部,尝试命令按虚拟(总)映像大小排序。然后您将看到最大的进程位于顶部。

答案3

如果 Apache 进程越来越大,例如,如果您通过 mod_php 运行 PHP 脚本,该脚本有时会处理大量数据,您可能不会注意到任何一个进程大幅增长(但每个 Apache 进程都会随着时间的推移而略有增长)。如果是这种情况,那么您可以尝试以下操作:

  • 通过调整选项来限制 Apache 使用的子进程的数量:
    • 启动服务器
    • 最小备用服务器
    • 最大备用服务器数
    • 最大客户数
  • 如果你使用 Apache 所做的一切都是线程安全的,请考虑使用 mpm_worker 而不是 mpm_perfork
  • 确保 KeepAliveTimeout 不太高(这可以防止错误的客户端长时间持有进程,如果你已经严格限制了子进程的数量,这一点尤其重要
  • 如果问题是由于内存泄漏引起的,使用 MaxRequestsPerChild 选项减少每个进程的最大生存时间会有所帮助,但如果将其配对得太远,可能会显著降低服务的效率

答案4

您还可以通过安装 swapd 来消除重启的要求,它将在内存不足时自动创建交换文件。

相关内容