Nginx e PHP-FPM stanno esaurendo le connessioni


9

Continuo a imbattermi in errori come questi,

[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

Ho cambiato le mie impostazioni per php-fpm con queste,

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

Con il risultato di

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

Ho appena lanciato un nuovo sito Web che sta ottenendo una quantità considerevole di traffico su di esso. Questo traffico è legittimo e gli utenti ottengono 504 timeout del gateway quando viene raggiunto il limite.

Ho connessioni limitate al mio server con IPTABLES e sto eseguendo fail2ban e tengo traccia dei registri di accesso nginx. Il traffico è tutto legittimo, sto esaurendo lo spazio per gli utenti.

Attualmente sto correndo su una scatola dual core con Ubuntu 64 bit.

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

Il mio php.ini max_input_time = 60

La mia configurazione nginx è

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;
}

Cosa posso fare per smettere di rimanere senza connessioni? Perché questo continua a verificarsi? Sto monitorando il mio traffico su Google Analytics in tempo reale e quando il conteggio degli utenti supera circa 120 il mio php-fpm.log è pieno di questi avvisi.

Risposte:


5

Hai considerato di seguire i consigli forniti nel messaggio di log, aumentando il valore di pm.max_children? Hai un sacco di RAM libera per sistemarli.

Per rispondere alle tue domande:

  • Cosa posso fare per smettere di rimanere senza connessioni? Effettuare il provisioning di più connessioni o ridurre il numero di connessioni ricevute.
  • Perché questo continua a verificarsi? Perché continui a rimanere senza connessioni.

Spiacenti, l'errore è stato marcato con il timestamp dopo che l'ho aggiornato a 150 da 100 .... Sì, l'ho fatto. Con quale impostazione devo impostarlo per tutti i miei ram?
E3pO

Dovresti elevarlo a (free/mem_per_worker)+150, dov'è freela quantità di memoria che avrai dopo aver preso in considerazione le esigenze di altri processi i cui requisiti di memoria aumenteranno con più carico, ed mem_per_workerè la quantità massima di memoria che prevedi ogni processo di lavoro PHP richiesto.
womble

4

Abbiamo avuto lo stesso problema sui nostri server web.

Puoi provare a rigenerare il processo figlio ogni X richieste, per evitare perdite di memoria. Ha funzionato bene in Apache e FPM e sta iniziando a funzionare bene.

 pm.max_requests = 50000

Ciò riavvierà un processo figlio ogni 50k richieste

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.