如果我的 MaxClients = 200,为什么会有 300 个 apache 进程处于休眠状态?

如果我的 MaxClients = 200,为什么会有 300 个 apache 进程处于休眠状态?
<IfModule mpm_prefork_module>
    StartServers            150
    MinSpareServers         5
    MaxSpareServers         20
    ServerLimit             200
    MaxClients              200
    MaxRequestsPerChild     0
</IfModule>

topApache 停止响应后:

运行几个小时后,我的服务器停止响应,因为太多 apache 进程处于睡眠状态...我唯一能做的就是重新启动 apache

我该怎么办?我使用的是 Debian 6,LAMP
KeepAlive 暂时处于关闭状态。

答案1

首先,您应该计算出每个 Apache 进程平均使用多少 RAM。运行ps -ylC apache2 --sort:rss以获得粗略估计值 - 将 RAM 加起来并除以进程数。您可能希望排除任何差异很大的值。

然后查看总 RAM 使用量,并减去 Apache 使用量。

MaxClients 应大致设置为:((总 RAM) - (Apache 以外的进程使用的 RAM) - (一些缓冲))/(Apache 进程使用的平均 RAM)

编辑:您可能还想看看输出mod_status查看是否有很多进程处于 KeepAlive 状态(“K”)。如果是,则需要减少 KeepAliveTimeout 设置。

答案2

  1. 使能够mod_status。请阅读该页面以了解详细信息和安全注意事项。
  2. 查看服务器状态http://example.org/server-status?refresh=N(每 N 秒刷新一次)。您将看到每个 httpd 子进程、它所服务的页面、请求该页面的客户端的 IP 等。

需要注意的事项:

  • 通常,当 Apache 有太多子进程时,是因为一个页面或一组相关页面由于代码问题而挂起。查找所有提供相同页面的 httpd 子进程。该页面可能有错误。
  • 如果一个客户端通过快速连续地请求多个页面来对您的服务器造成冲击,您可以在此页面上看到它。
  • 有时您还可以在此页面上检测到 DDOS。查找多个 IP 都请求同一个有缺陷的页面,或请求多个缓慢的页面。由于其性质,DDOS 很难检测。

答案3

首先仔细检查一下有 300 个 Apache 进程,类似如下pgrep -c apache2

您可能更改了配置,但尚未重新启动(这很容易持续数周)。

如果您的服务器停止响应,是只有 Apache 服务器停止响应,还是整个系统都停止响应?尝试监控您的内存使用情况(可用内存指标比所有进程的总使用量更容易测量)。

相关内容