我正在使用带有 prefork 的 Apache 2.4。
我的MPM指令设置如下:
<IfModule mpm_prefork_module>
MinSpareServers 200
MaxSpareServers 400
StartServers 200
ServerLimit 1300
MaxClients 1300
MaxRequestWorkers 1300
MaxRequestsPerChild 10000
</IfModule>
但是我的服务器状态页面显示:
Parent Server Config. Generation: 1
Parent Server MPM Generation: 0
Server uptime: 34 minutes 54 seconds
Total accesses: 551221 - Total Traffic: 11.8 GB
CPU Usage: u8151.55 s2320.18 cu.02 cs.11 - 500% CPU load
263 requests/sec - 5.8 MB/second - 22.5 kB/request
1024 requests currently being processed, 0 idle workers
WKWKKWWWWKWKKKWKKCRWWKWWKKWKKWKWKWKWWWWWKKKWKWWKKWKKWWWWWKWWKWWK
WWWWKWKWWWWWKWKKWKWKWCKWKKKKKWKKWWKKCKKKKWWWKKWKKWWWKKWCKKWKKKKW
WWKKWKKWWWKWKWWKKKWKKWWWKKWWKKKWWKKKKWKKWKCKKWKKWKKKKWWWKWKKWKWW
WWKWWKWWKKWKWKKWKRWKWKKWWWWWWKCKKKKKWWWKWWWKKKKWWKWWKWWKKKKWWKKK
WKKKWWWWWWWKWKWKWWKKWKKKKKKWKWWKWWWKKKKWKKKWWKKWWKKWKWKWWWWKKWKW
KWKWWWWKCWKKKCWKKWWWWWKWKWWKWKWRWKKWWKWKWKKWWKKWKWKWKKKKWWKKKWKW
WKKKKKWKKKKWWKWKWKWWWKKKWWKWCCKWKWWKKWKKWWCKKWWWWKKWKWWWWWWWWKKK
WWKKKWKWKKKKKKKKWKKKKKKKWWWCKWWWKKWWWWKWCWWKKKKWKWWKKKWKWKWWWWWW
WKWKKKWKWKKWWWWKWWWWWKKCWKWWKWKWWWWWWKWWWWKKWWWKWWWWKWKWKKKWKKWK
WWKKKWKWWWKKWWWKWKWKWKKKKWKWWWWWWWKKWWWWKKKCKKKWKWKWWWWKWKWWWWWW
WWKKKWKWWWKWWKWWKKWKWKWKWKKWKKWKKKCKKWWWKWCWKKWWKKWWKKWKKWWKKWWK
WWKKWKWKKWKWKWKWWKWKKWWKKWWKKKWKWWKKWWWKKWWKKCKKKWWKKWKWWWCWKKWK
KKWKWKWWWWWKKKKKKKWKWKWKWWWWKKKWWKWKWKKKWKWWWKWCWWKWKWWKKKWWWCWK
WCWCKWWKKWKWWKWKKWWWKKWWKRKWWKKWWWKWKWWKWKKWWWKKWWKWKWKWWWKWKWKW
WKWKWWKWKKKWWWKWWWKCWWWWKWWWKKKKKKWKWKKKKKKKKWKKWWWWWWWWWKWWWKKW
KWKKKWWKKWWKWKWWKKWWKKKKKWKWWWKKWKWWKWWWKKKWKWCKKKKWWKWWKWCKKCKK
SSSSSSSSSSSSSSSSSSSSSSSSS.......................................
................................................................
................................................................
................................................................
....................
请注意,有一行显示当前正在处理 1024 个请求,且没有空闲的 worker。它只是将请求数限制在 1024 个。
现在在我的/etc/init.d/httpd我有ulimit -HSn 32768所以我不认为这是一个开放文件限制问题。
我真的想不出为什么连接数会在 1024 时被切断,尽管我的 MaxClients 设置得更高,并且服务器状态似乎需要更多的连接,但却在 1024 时停止。
答案1
服务器中编译了 ServerLimit 20000 的硬限制(对于 prefork MPM 200000)。
因此,你不应该达到硬限制。
ServerLimit
我在早期版本中遇到了调整困难;请尝试apache2ctl stop
然后apache2ctl start
。(使用优雅甚至重新启动都无法获取更改。)
附注:您可能希望减少KeepAliveTimeout
和/或MaxKeepAliveRequests
,或者尝试,KeepAlive Off
因为您有太多工作程序处于“K”状态。此外,这些“S”表示服务器在启动工作程序时遇到问题,可能是由于 500% 的 CPU 负载(我认为这是最大可用负载)。如果调整 KeepAlive 设置没有帮助,您可能需要考虑升级服务器或负载平衡。
答案2
您应该调查 HA Proxy(如果还没有的话)以将您的请求拆分到多个服务器。
即使在快速硬件上,您也会从单台机器传输大量数据。如果您需要保留一台机器,请尝试 Nginx。在高负载下,它将比 Apache 运行得更快。