Używam/status serwera do monitorowania procesów Apache. Podczas uruchamiania one wyglądać tak:Dla wielu długich procesów Apache w stanie READ bez zgłoszeń po pewnym czasie
_____W_K__K____________C_K________C_____________W_..............
................................................................
................................................................
Ale po kilku godzinach prowadzenia wyglądać następująco:
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............................................................
Istnieje zbyt wiele „czytać” stan (R), które trwało długo, a ja don nie wiem, co robią, bo nawet nie mają żadnych próśb. (Obecność, że istnieją dodatkowe stany które pominięte w przykładach powyżej, w sumie mam 2000 pozycji dostępne „”). W liście procesów mam około 40 procesy «R», jak ten:
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
nagłówek raportu wyglądają tak:
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
mam prywatny serwer z: procesora 4X3.6GHZ Xeon 2X512 GB SSD, 32 GB pamięci, Debian 3.16.36-1, Apache 2.4.10, PHP 5.6. 29, mod_fcgid, php-fpm, php5-cgi, prefork.
Niektóre z moich ustawień apache2.conf:
Timeout 14400
KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 3
HostnameLookups Off
moje ustawienia mpm_prefork.conf:
<IfModule mpm_prefork_module>
StartServers 50
MinSpareServers 25
MaxSpareServers 50
ServerLimit 2000
MaxRequestWorkers 2000
MaxConnectionsPerChild 1000
</IfModule>
Niektóre z moich ustawień fcgid.conf:
FcgidMaxRequestLen 1073741824
FcgidOutputBufferSize 1073741824
FcgidMaxProcesses 200
FcgidMaxProcessesPerClass 100
FcgidMinProcessesPerClass 0
FcgidProcessLifeTime 30
FcgidConnectTimeout 30
FcgidIOTimeout 14400
FcgidBusyTimeout 14400
FcgidIdleTimeout 3
FcgidIdleScanInterval 1
Mam pewne długo działające cronjobs na serwerach, dlatego potrzebuję tego dużego "14400" (= 4 godzin) limitu czasu na procesy Apache i PHP.
Pytania:
- Dlaczego istnieje tak wiele "R" statusy bez wniosków?
- Co robią, jak mogę się dowiedzieć?
- Dlaczego działają tak długo?
Aktualizacja 1:
A mają zmodyfikowane limity czasu do 7200 (= 2 godziny), to jest to minimum dla mnie można uruchomić moje cronjobs. Jednak nie miałem problemów z moimi cronjobsami.
FcgidIOTimeout 7200
FcgidBusyTimeout 7200
także dla Apache:
Timeout 7200
podstawie PHP and mod_fcgid: ap_pass_brigade failed in handle_request_ipc function Zrobiłem to:
FcgidOutputBufferSize 0
podstawie mod_fcgid: ap_pass_brigade failed in handle_request function Zrobiłem to:
FcgidMaxRequestsPerProcess 500
Po kilku godzinach serwer przestał odpowiadać:
Usługa niedostępna: Serwer jest tymczasowo niezdolny do obsługi żądania powodu przestoju maintanance lub pojemności problemów. Spróbuj ponownie później .
W logach znalazłem kilka erros jak tych dwóch:
[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
i grono tak (może dla każdego żądania):
[fcgid:warn] mod_fcgid: too much processes, please increase FCGID_MAX_APPLICATION
pytania 2:
- Co oznaczają te błędy? Jak mogę je poprawić?
- Dlaczego serwer przestaje odpowiadać? Prawdopodobnie z powodu błędów ...
- Czy mod_fcgid, php-fpm, php5-cgi, moduły prefork są w pełni kompatybilne i efektywne? To była domyślna konfiguracja, kiedy dostałem nowy serwer.
Kluczem jest tutaj twój komentarz "Mam kilka długich cykli na serwerach, dlatego potrzebuję tego dużego" 14400 "(= 4 godzin) limitu czasu na procesach Apache i PHP." Zatrzymaj ich, problem nadal występuje? Polecenia takie jak lsof pokaże Ci aktywne połączenia dla tych dzieci. Z drugiej strony, jeśli posiadasz mod_fcgid, nie potrzebujesz prefork i możesz przełączyć się na gwintowane zdarzenie podobne do mpm, które będzie znacznie lepsze. Otwarte gniazda odzwierciedlają dyrektywy dotyczące serwerów zapasowych. Żądania OPTIONS pochodzą od twojego, apache nie pinguje sam siebie. –
w każdym przypadku spróbuj zmniejszyć limity czasu oczekiwania do normalnych wartości, a zobaczysz, że to zachowanie się zatrzymuje. –
Twoje skrypty php wisi tam na zawsze, ponieważ z jakiegoś powodu mod_fcgid nie może spawnować więcej procesów, ponieważ to, co przeczytałem "FCGID_MAX_APPLICATION" jest wewnętrzną tabelą, którą można po prostu zmienić na źródle i ponownej kompilacji. Którą wersję mod_fcgid używasz? Jeśli nie ostatni, może powinieneś dokonać aktualizacji. Moja rekomendacja? Migracja do mod_proxy_fcgi -> php-fpm, pozwoli ci mieć apache z mpm_event i php-fpm jest dość wszechstronny i pozwala ci na bardzo różne izolowane konfiguracje. –