许多长时间运行的Apache进程处于READ状态,在一段时间后没有请求

时间:2017-01-12 07:37:14

标签: php apache httpd.conf mod-fcgid

我使用/ 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............................................................

有太多" Read" (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设置:

<IfModule mpm_prefork_module>
  StartServers 50
  MinSpareServers 25
  MaxSpareServers 50
  ServerLimit 2000
  MaxRequestWorkers 2000
  MaxConnectionsPerChild 1000
</IfModule>

我的一些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,这就是为什么我需要那么大的&#34; 14400&#34; (= 4小时)Apache和PHP进程超时。

问题:

  1. 为什么会有这么多&#34; R&#34;没有请求的状态?
  2. 他们做了什么,我怎么知道?
  3. 为什么他们跑这么久?
  4. 更新1:

    A已将超时修改为7200(= 2小时),这是我可以运行我的cronjobs的最小值。但是我的cronjobs没有问题。

    FcgidIOTimeout 7200
    FcgidBusyTimeout 7200
    

    也适用于Apache:

    Timeout 7200
    

    基于PHP and mod_fcgid: ap_pass_brigade failed in handle_request_ipc function我这样做了:

    FcgidOutputBufferSize 0
    

    基于mod_fcgid: ap_pass_brigade failed in handle_request function我这样做了:

    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:

    1. 这些错误是什么意思?我该如何纠正它们?
    2. 为什么服务器停止响应?可能是因为错误......
    3. mod_fcgid,php-fpm,php5-cgi,prefork模块是否完全兼容且有效?这是我获得新服务器时的默认配置。

1 个答案:

答案 0 :(得分:7)

问题解决了。

解决方案是将Apache的Timeout值降低到类似15的数字。当我意识到运行一个很长的PHP脚本(甚至几个小时)时,不需要这个超时很高,它确实认为PHP的max_execution_time很大。

<强>更新

我还在PHP-FPM下使用FastCGI升级到PHP 7.1,并且我已经将Apache的MPM模式更改为esra-s建议的事件,并且它像地狱一样运行。非常感谢!