我尝试过修复这个问题,但显然了解得不够。当我运行 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 代码问题总是让人头疼 :/