W Nginx i PHP-FPM brakuje połączeń

9

Ciągle napotykałem takie błędy,

[02-Jun-2012 01:52:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 19 idle, and 49 total children
[02-Jun-2012 01:52:05] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 19 idle, and 50 total children
[02-Jun-2012 01:52:06] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 19 idle, and 51 total children
[02-Jun-2012 03:10:51] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 18 idle, and 91 total children

Zmieniłem ustawienia php-fpm na te,

pm.max_children = 150 (It was at 100, i got a max_children reached and upped to 150)
pm.start_servers = 75
pm.min_spare_servers = 20
pm.max_spare_servers = 150

Wynikające z

[02-Jun-2012 01:39:19] WARNING: [pool www] server reached pm.max_children setting (150), consider raising it

Właśnie uruchomiłem nową stronę internetową, która generuje znaczny ruch. Ten ruch jest uzasadniony, a użytkownicy osiągają 504 przekroczenia limitu czasu bramy po osiągnięciu limitu.

Mam ograniczone połączenia z moim serwerem za pomocą IPTABLES i uruchamiam fail2ban i śledzę dzienniki dostępu nginx. Cały ruch jest legalny, po prostu kończy mi się miejsce dla użytkowników.

Obecnie korzystam z dwurdzeniowego urządzenia z 64-bitowym Ubuntu.

free
             total       used       free     shared    buffers     cached
Mem:       6114284    5726984     387300          0     141612    4985384
-/+ buffers/cache:     599988    5514296
Swap:       524284       5804     518480

Mój php.ini max_input_time = 60

Moja konfiguracja Nginx to

worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 19000;
    # multi_accept on;
}
worker_rlimit_nofile    20000;  #each connection needs a filehandle (or 2 if you are proxying)

client_max_body_size 30M;
client_body_timeout   10;
client_header_timeout 10;
keepalive_timeout     5 5;
send_timeout          10;

    location ~ \.php$ {
    try_files $uri /er/error.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 16k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_max_temp_file_size 0;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/tmp/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

Co mogę zrobić, aby przestać brakować połączeń? Dlaczego tak się dzieje? Monitoruję mój ruch w Google Analytics w czasie rzeczywistym, a gdy liczba użytkowników przekracza 120, mój php-fpm.log jest pełen tych ostrzeżeń.

E3pO
źródło

Odpowiedzi:

5

Czy rozważałeś zastosowanie się do drobnych rad zawartych w komunikacie dziennika, podnosząc wartość pm.max_children? Masz mnóstwo wolnej pamięci RAM, aby je pomieścić.

Aby odpowiedzieć na twoje pytania:

  • Co mogę zrobić, aby przestać brakować połączeń? Zapewnij więcej połączeń lub zmniejsz liczbę odbieranych połączeń.
  • Dlaczego tak się dzieje? Ponieważ ciągle brakuje Ci połączeń.
womble
źródło
Przepraszamy, ten błąd został oznaczony znacznikiem czasu po tym, jak zaktualizowałem go do 150 ze 100 .... Tak, mam. Jakie ustawienie powinienem ustawić dla całego mojego barana?
E3pO
Powinieneś go podnieść do (free/mem_per_worker)+150, gdzie freejest ilość pamięci, którą będziesz mieć po uwzględnieniu potrzeb innych procesów, których wymagania pamięci wzrosną wraz z większym obciążeniem, i mem_per_workerjest to maksymalna ilość pamięci, którą przewidujesz każdy proces roboczy PHP wymagający.
womble
4

Na naszych serwerach mieliśmy ten sam problem.

Możesz spróbować odrodzić proces potomny co X żądań, aby uniknąć wycieków pamięci. Działa dobrze w Apache i FPM, zaczyna też dobrze działać.

 pm.max_requests = 50000

Spowoduje to ponowne uruchomienie procesu potomnego co 50 000 żądań

Ali Alwash
źródło