我们有一台几乎每天都没有响应的Apache服务器。 通过检查/ server-status(mod_status)我们可以看到我们有60个subprocess都处于“W”(发送应答)状态。
service httpd restart一切恢复正常,问题消失了一天左右。 max_exectution_time设置为“30”。 TimeOut被设置为“60”。 curl_setopt($conn, CURLOPT_FORBID_REUSE, 0)来查询Solr(我希望这会通过curl正确地收集垃圾,如果连接消失的话)。 set_time_limit(0)或者在我们的代码中使用任何愚蠢的东西。 set_time_limit意味着脚本将在max_execution_time之后完成。 我有一个理论认为,Apache的ListenBacklog设置得太高,每当我们杀死进程时,60个新进程立即启动,所有这些都试图对已经离开的客户做出响应。 这将解释为什么当我们重新启动服务器时问题消失了。 但似乎ListenBacklog没有设置,因此默认的“511”将被使用。 我试图连续几次杀死所有的subprocess,以清除积压,但问题仍然存在…所有PHP页面的新请求都会永远响应(大多数不响应)。
PHPconfiguration:
max_execution_time = 30 max_input_time = 60 safe_mode = off
Apacheconfiguration:
KeepAlive off <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 60 MaxRequestsPerChild 1000 </IfModule>
我用完了想法…任何提示将不胜感激!
我build议的故障排除步骤是:
strace -p $PID挂起的进程,看看系统调用,如果有的话,它卡住了 lsof -p $PID来查看打开的文件句柄或套接字是否可以提供线索 tcpdump -vv -A -s1500 port 80 ,查看stream量是什么以及响应出错的地方。