![Ubuntu 7.04 VM 内存不足](https://linux22.com/image/488807/Ubuntu%207.04%20VM%20%E5%86%85%E5%AD%98%E4%B8%8D%E8%B6%B3.png)
我在 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 来消除重启的要求,它将在内存不足时自动创建交换文件。