Для многих длительных процессов Apache в состоянии чтения без запросов через определенное время
я использую / 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, SSD 2X512 GB, память 32 GB, Debian 3.16.36-1, Apache 2.4.10, PHP 5.6.29, mod_fcgid, php-fpm, php5-cgi, prefork.
некоторые из моих apache2 не.настройки конфы:
Timeout 14400
KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 3
HostnameLookups Off
мой mpm_prefork.настройки конфы:
<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-процессах.
вопросы:
- почему так много статусов "R" без запросов?
- что они делают, как я могу узнать?
- почему они работают так долго?
обновление 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
через несколько часов сервер перестал отвечать:
Сервис Недоступен: сервер временно не может обслуживать запрос из-за простоя техники или проблемы пропускной способности. Пожалуйста, попробуйте снова позже.
в журналах я нашел несколько таких erros:
[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 полностью совместимыми и эффективными? Это настройки по умолчанию, когда я получил новый сервер.
1 ответов
проблема решена.
решение состояло в том, чтобы снизить Apache Timeout
значение числа, например 15. Как я понял, для запуска длинного PHP-скрипта (даже в течение нескольких часов) не нужно, чтобы этот тайм-аут был высоким, достаточно, чтобы PHP max_execution_time
чтобы быть большим.
обновление
Я также обновился до PHP 7.1 с FastCGI под PHP-FPM, и я изменил режим MPM Apache на event as учетные-с предложил, и он бежит, как черт. Большое спасибо!