Многим долго выполняющимся процессам Apache в состоянии READ без запросов через определенное время

Я использую / 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,6 ГГц процессором Xeon, 2X512 ГБ SSD, 32 ГБ памяти, 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 на серверах, поэтому мне нужен большой тайм-аут «14400» (= 4 часа) для процессов Apache и PHP.

Вопросы:

  1. Почему так много «R» статусов без запросов?
  2. Что они делают, как я могу узнать?
  3. Почему они так долго бегают?

Обновление 1:

А изменили тайм-ауты до 7200 (= 2 часа), это минимум для меня, чтобы я мог запустить свои cronjobs. Однако у меня не было проблем с моими cronjobs.

FcgidIOTimeout 7200
FcgidBusyTimeout 7200

Также для Apache:

Timeout 7200

На основе PHP и mod_fcgid: сбой ap_pass_brigade в функции handle_request_ipc Я сделал это:

FcgidOutputBufferSize 0

На основе mod_fcgid: сбой ap_pass_brigade в функции handle_request Я сделал это:

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 полностью совместимыми и эффективными? Это были настройки по умолчанию, когда я получил новый сервер.

9

Решение

Задача решена.

Решением было снизить апач Timeout значение до числа, равного 15. Как я понял, для запуска длинного сценария PHP (даже для часов) не нужно, чтобы этот тайм-аут был высоким, достаточно, чтобы PHP max_execution_time быть достаточно большим.

Обновить

Я также обновил до PHP 7.1 с FastCGI под PHP-FPM, и я изменил режим Apache MPM на событие как ESRA-ы предложил, и это работает как ад. Большое спасибо!

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]