查看顶部时,Apache 启动了大量进程,导致网站无法加载

查看顶部时,Apache 启动了大量进程,导致网站无法加载

我尝试过修复这个问题,但显然了解得不够。当我运行 top 命令时,我看到它充满了 httpd 进程。当这种情况发生时,我的网站停止加载。它没有崩溃,只是不停地旋转。我正在使用 prefork MPM。这看起来像:

<IfModule prefork.c>
StartServers       1
MinSpareServers    5
#MinSpareServers    1
MaxSpareServers    10
#MaxSpareServers    5
ServerLimit        25
#ServerLimit        50
MaxClients        25
#MaxClients        50
#MaxRequestsPerChild  10000
MaxRequestsPerChild  100
</IfModule>

这个问题始于注释掉的默认值。然后我尝试进行更改,认为如果我降低 MaxClients 会有所帮助,因为我有大约 1gb 的可用内存。我认为默认的 MaxClients 太高了,因为每个 httpd 进程的平均内存使用量为 55mb。这是 top 的屏幕截图,请记住,这并不显示所有 httpd 进程。

top - 09:48:27 up 42 days,  3:13,  1 user,  load average: 1.09, 1.09, 1.09
Tasks:  35 total,   3 running,  32 sleeping,   0 stopped,   0 zombie
Cpu(s): 14.7%us,  0.5%sy,  0.0%ni, 84.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2097152k total,  1134676k used,   962476k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                        
 1649 root      17   0  315m 122m  14m S  0.0  6.0   1:51.67 java                                                                                            
27755 mysql     18   0  204m  71m 5744 S  4.0  3.5 806:09.08 mysqld                                                                                          
23603 apache    15   0 76404  51m 5900 S  0.0  2.5   0:20.21 httpd                                                                                           
20408 apache    15   0 77124  51m 5252 S  0.0  2.5   0:25.57 httpd                                                                                           
28026 apache    16   0 76788  50m 5240 R 97.7  2.5   0:05.15 httpd                                                                                           
24497 apache    16   0 76272  50m 5484 S  0.0  2.5   0:06.55 httpd                                                                                           
27724 apache    15   0 76380  50m 5268 S  0.0  2.5   0:04.81 httpd                                                                                           
21561 apache    15   0 75672  50m 5532 S  0.0  2.4   0:28.54 httpd                                                                                           
26537 apache    16   0 75116  49m 5488 R 19.9  2.4   0:10.09 httpd                                                                                           
28027 apache    15   0 75080  49m 5216 S  0.0  2.4   0:03.07 httpd                                                                                           
24498 apache    15   0 74180  49m 5656 S  0.0  2.4   0:12.33 httpd                                                                                           
21934 apache    15   0 74568  48m 5256 S  0.0  2.4   0:27.48 httpd                                                                                           
24484 apache    15   0 74152  48m 5260 S  0.0  2.4   0:17.70 httpd                                                                                           
28012 apache    15   0 73248  47m 5208 S  0.0  2.3   0:02.34 httpd                                                                                           
13428 root      18   0 37032  15m 8456 S  0.0  0.8   0:00.21 httpd

我究竟做错了什么?

答案1

在我看来,您有一个代码问题,您正在尝试通过 MPM 参数来控制它。

其中一些参数会适得其反,特别是 MaxClients 和 MaxRequestPerChild,它们不会帮助您降低负载,相反会使负载更高。

还要记住,top 显示的只是虚拟内存分配情况,并不意味着每个 apache 实际使用了 50mb 内存,为了获得更准确的统计数据,你可以将其添加到配置中来激活 mod_status

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>

举个例子,这是我在高负载下的常规 Apache 服务器上的配置

StartServers       32
MinSpareServers    10
MaxSpareServers   20
ServerLimit      8192
MaxClients       4096
MaxRequestsPerChild  9000

最让我担心的是单个 httpd 实例的 CPU 利用率达到 97%,这表明 apache 上运行的代码正在做一些非常讨厌的事情,我宁愿对此进行调查,因为您只是试图通过降低 prefork 参数来(明智地)控制局面,但解决问题的唯一方法是解决主要问题。

祝你好运!Apache 代码问题总是让人头疼 :/

相关内容