我使用/ server-status来监视Apache进程.开始时它们看起来像这样:
_____W_K__K____________C_K________C_____________W_.............. ................................................................ ................................................................
但经过几个小时的运行后看起来像这样:
R_KCR___KR__RKRR_RRRKRRRRRRKRR_RRCK____R_RRRR_RRRKRRRKRRRRRRRRR_ R_RRRR_R.RR.R_R.R_R..CKRRRRW.K_RCRKRR_R_.._R._.RK_KRK_.RRR.KK_.R ..RR............................................................
有太多的"阅读"(R)状态需要很长时间,我不知道他们做了什么,因为他们甚至没有请求.(提到我从上面的示例中跳过了其他"."状态,总共有2000个位置可用.)在进程列表中,我有大约40个"R"进程,如下所示:
Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request 15-2 21291 0/37/11158 R 0.03 7468 2 0.0 1.93 198.35 82.78.95.105
报告的标题如下所示:
Server Version: Apache/2.4.10 (Debian) mod_fcgid/2.3.9 OpenSSL/1.0.1t Server MPM: prefork Server Built: Sep 15 2016 20:44:43 Current Time: Thursday, 12-Jan-2017 08:38:46 EET Restart Time: Wednesday, 11-Jan-2017 00:51:18 EET Parent Server Config. Generation: 3 Parent Server MPM Generation: 2 Server uptime: 1 day 7 hours 47 minutes 27 seconds Server load: 0.34 0.35 0.39 Total accesses: 1599556 - Total Traffic: 29.9 GB CPU Usage: u18.87 s6.81 cu0 cs0 - .0224% CPU load 14 requests/sec - 274.0 kB/second - 19.6 kB/request 90 requests currently being processed, 27 idle workers
我有一个私人服务器:4X3.6GHZ Xeon处理器,2X512 GB SSD,32 GB内存,Debian 3.16.36-1,Apache 2.4.10,PHP 5.6.29,mod_fcgid,php-fpm,php5-cgi,prefork.
我的一些apache2.conf设置:
Timeout 14400 KeepAlive On MaxKeepAliveRequests 1000 KeepAliveTimeout 3 HostnameLookups Off
我的mpm_prefork.conf设置:
StartServers 50 MinSpareServers 25 MaxSpareServers 50 ServerLimit 2000 MaxRequestWorkers 2000 MaxConnectionsPerChild 1000
我的一些fcgid.conf设置:
FcgidMaxRequestLen 1073741824 FcgidOutputBufferSize 1073741824 FcgidMaxProcesses 200 FcgidMaxProcessesPerClass 100 FcgidMinProcessesPerClass 0 FcgidProcessLifeTime 30 FcgidConnectTimeout 30 FcgidIOTimeout 14400 FcgidBusyTimeout 14400 FcgidIdleTimeout 3 FcgidIdleScanInterval 1
我在服务器上有一些长期运行的cronjobs,这就是为什么我需要Apache和PHP进程的大"14400"(= 4小时)超时.
问题:
为什么有这么多"R"状态没有请求?
他们做了什么,我怎么知道?
为什么他们跑这么久?
更新1:
A已将超时修改为7200(= 2小时),这是我可以运行我的cronjobs的最小值.但是我的cronjobs没有问题.
FcgidIOTimeout 7200 FcgidBusyTimeout 7200
也适用于Apache:
Timeout 7200
基于PHP和mod_fcgid:在handle_request_ipc函数中ap_pass_brigade失败我这样做了:
FcgidOutputBufferSize 0
基于mod_fcgid:在handle_request函数中ap_pass_brigade失败我这样做了:
FcgidMaxRequestsPerProcess 500
几个小时后,服务器停止响应:
服务不可用:由于维护停机或容量问题,服务器暂时无法为您的请求提供服务.请稍后再试.
在日志中我发现了一些像这两个错误:
[fcgid:warn] (104)Connection reset by peer: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function [fcgid:warn] (32)Broken pipe: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
和一堆这样的(可能是每个请求):
[fcgid:warn] mod_fcgid: too much processes, please increase FCGID_MAX_APPLICATION
问题2:
这些错误是什么意思?我怎样才能纠正它们?
为什么服务器停止响应?可能是因为错误......
mod_fcgid,php-fpm,php5-cgi,prefork模块是否完全兼容且有效?这是我获得新服务器时的默认配置.
Buzogany Las.. 7
问题解决了.
解决方案是将Apache的Timeout
值降低到像15这样的数字.当我意识到运行一个很长的PHP脚本(甚至数小时)时,不需要这个超时是高的,所以PHP max_execution_time
应该是大的.
更新
我已经在PHP-FPM下使用FastCGI升级到PHP 7.1,并且我已经将Apache的MPM模式更改为esra-s建议的事件,并且它像地狱一样运行.非常感谢!
问题解决了.
解决方案是将Apache的Timeout
值降低到像15这样的数字.当我意识到运行一个很长的PHP脚本(甚至数小时)时,不需要这个超时是高的,所以PHP max_execution_time
应该是大的.
更新
我已经在PHP-FPM下使用FastCGI升级到PHP 7.1,并且我已经将Apache的MPM模式更改为esra-s建议的事件,并且它像地狱一样运行.非常感谢!