2017-01-12 32 views
9

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:

  1. Dlaczego istnieje tak wiele "R" statusy bez wniosków?
  2. Co robią, jak mogę się dowiedzieć?
  3. 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:

  1. Co oznaczają te błędy? Jak mogę je poprawić?
  2. Dlaczego serwer przestaje odpowiadać? Prawdopodobnie z powodu błędów ...
  3. 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.
+2

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. –

+1

w każdym przypadku spróbuj zmniejszyć limity czasu oczekiwania do normalnych wartości, a zobaczysz, że to zachowanie się zatrzymuje. –

+1

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. –

Odpowiedz

5

Problem rozwiązany.

Rozwiązaniem było Opuścić Apache Timeout wartość do liczby jak 15. Jak już realizowany za uruchomienie skryptu długo PHP (nawet do godziny) nie muszą tego timeout jako wysokość, to wystarczających że PHP max_execution_time być wystarczająco dużym.

Aktualizacja

Mam również uaktualniony do PHP 7.1 z FastCGI pod PHP-FPM i zmieniłem tryb MPM Apache do imprezy jak esra-s zasugerował, i działa jak cholera. Wielkie dzięki!

+0

Czy możesz rozwinąć ten temat? Czy mówisz, że PHP 7.1 może teraz działać w ramach mpm Apache i jest bezpieczny dla wątków? –