从昨天开始,我在 Debian 机器上运行的 Apache 服务器就变得非常不稳定。我的网站有时可以加载,有时则不能。我认为这与内存有关,因为我的 Apache 日志中全是内存不足(已分配 262144)(尝试分配 4480 字节)。我还附上了内存图的屏幕截图。
重启服务器可以暂时解决问题。我查看了占用内存的进程,但占用内存最大的是 MySQL,占比 6.5%。
在哪里还可以寻找问题?
编辑:我在重启后立即执行了 free -m,大约 2 小时后又执行了一次。我认为趋势很明显:
root@xxx:~# free -m
total used free shared buffers cached
Mem: 4016 731 3284 0 80 200
-/+ buffers/cache: 449 3566
Swap: 459 0 459
root@xxx:~# free -m
total used free shared buffers cached
Mem: 4016 2466 1550 0 92 473
-/+ buffers/cache: 1900 2115
Swap: 459 0 459
答案1
您可能有大量 Apache 进程正在运行。执行以下命令ps ax | grep apache2 | wc -l
查看有多少进程。
如果您的KeepAliveTimeout
参数太大(如默认值),有人可以连接到您,让连接停留并消耗您的所有资源。
我通常使用KeepAliveTimeout 5
,因此当 5 秒内没有返回任何信息时,Apache 可以断开连接。
也检查MaxConnectionsPerChild
一下。如果它们是无限的,内存泄漏会耗尽你所有的内存。使用一个合适的值,比如 10000 或 50000。
还要查看已加载的模块。您可能有几个未使用的模块,它们在每个进程实例上都会占用一点内存。虽然数量不多,但很快就会累积起来。
最后,查看一下您的日志。看看日志中是否有任何异常。您可能会发现您的服务器正在遭受攻击,或者有人安装了失败的库,或者诸如此类的事情。
答案2
请检查 MaxRequestsPerChild 参数,如果为 0,请尝试将其更改为更接近 1000 的值(取决于流量)。内存不足信息建议您使用 PHP,检查 php.ini 中的 memory_limit 和 max_execution_time 值,也许您应该增加/减少时间/内存。请提供有关 Apache/PHP 和应用程序配置的更多信息。
答案3
问题的原因在于邮件队列过大。删除队列即可解决问题。