php5-fpm: il server ha raggiunto pm.max_children


41

Ho Nginx + php5-fpm . Più volte all'ora il mio sito Web si blocca e nel file di registro vedo quanto segue:

ATTENZIONE: il server [pool www] ha raggiunto l'impostazione pm.max_children (5), considerare di aumentarlo.

Il file /etc/php5/fpm/pool.d/www.conf contiene la seguente configurazione:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Server: AMD Opteron ™ 3280, Octo-Core, 8x 2,4 GHz, DIMM 16 GB (DDR3).

Non ho idea di quali numeri dovrei inserire nel file www.conf per questo server. Posso aiutare qualcuno? Grazie

Risposte:


40

Ci sono molte possibili ragioni per cui il tuo PHP-FPM dovrebbe raggiungere il max_children. I più comuni sono:

  • Molte richieste parallele dai tuoi clienti
  • Esecuzione lenta degli script PHP
  • Impostazione molto bassa del max_children

Osservando le specifiche della tua macchina, supponendo che non ci sia nient'altro che PHP + Nginx in esecuzione, penso che potresti impostarlo molto più in alto di 5. Dici di avere 8 core, di solito Nginx ha bisogno di molto meno CPU di PHP, quindi con 5 figli probabilmente non sarai mai in grado di usarli tutti. Di solito lo sto impostando su qualcosa come il numero di core x 2 o il numero di core x 4 , a seconda del consumo di memoria degli script PHP.


È un sito di incontri con chat php e gli utenti inviano milioni di messaggi istantanei. Ieri sera quando avevo ~ 300 utenti online, il comando netstat -an | grep 80 | wc - il risultato era quasi 400.
user1821484

1
In realtà ho un sito Web di incontri simile. Penso che tu abbia sicuramente bisogno di più figli PHP. La mia configurazione è la seguente: 20k utenti online simultanei, 12 macchine PHP con 8 core ciascuna, 32 lavoratori su ciascuna delle macchine PHP. Funziona abbastanza bene. Dovresti anche guardare a quanta memoria libera hai, sospetto che tu ne abbia, a meno che il tuo PHP non sia enorme. Se hai memoria libera, perché non usarla per qualche altro lavoratore?
replica il

@ user1821484 Questo è corretto; pm.max_childrenè troppo basso . Un valore di 10 è ragionevole per un piccolo server VPS con 1 GB di RAM; hai un server molto più grande. Aumentare questo valore fino a quando non si interrompe la ricezione degli errori, quindi aumentarlo nuovamente nel caso si verifichi un picco di traffico.
Michael Hampton

Grazie per le risposte Ho aumentato l'impostazione pm.max_children a 10 e ora ho iniziato a ricevere questo errore: ATTENZIONE: [pool www] sembra occupato (potrebbe essere necessario aumentare pm.start_servers o pm.min / max_spare_servers), generando 16 figli, ci sono 0 inattivo e 8 bambini totali. Qualcuno può suggerirmi cosa devo aumentare? Grazie.
user1821484,

core x 2 o core x 4 suona davvero basso per me. Ho una macchina con 8 core e 8 GB di RAM con pm.max_children = 48 e otteniamo ancora che il server raggiunga gli avvisi pm.max_children . Questa macchina non si trova vicino ai limiti della CPU o della memoria. Un approccio migliore secondo me sarebbe quello di ottimizzare questa impostazione insieme alle corrispondenti impostazioni nginx (o apache) e scegliere un valore dopo aver determinato la quantità di memoria consumata da ciascun processo PHP.
S. Imp

19

Ho scoperto che impostando il valore pm.max_requests (che è commentato per impostazione predefinita) ha aiutato a correggere questi errori. Questa impostazione forza le richieste figlio a rigenerarsi dopo aver eseguito un certo numero di richieste e può essere utile se ci sono perdite di memoria da qualche parte nel codice o librerie di terze parti.

In /etc/php-fpm.d/www.conf :

pm.max_requests = 500

13

Questo collegamento può essere utile: spiega come calcolare il numero di processi figlio in base alla quantità di memoria nel sistema:


7
Questa risposta sarà inutile una volta che il collegamento scompare.
miken32,

2
Fondamentalmente, il link dice ... Il valore appropriato per pm.max_children può essere calcolato come: pm.max_children = RAM totale dedicata al server web / Dimensione massima del processo figlio
jaywhy13
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.