Configurare PHP-FPM [Guida]

Aiuti sui server Linux
Rispondi
Avatar utente
Martyn
Amministratore
Messaggi: 161
Iscritto il: 20/11/2013, 4:40
Contatta:

Configurare PHP-FPM [Guida]

Messaggio da Martyn »

Salve a tutti,
mi è capitato di recente di dover gestire un server LAMPP dove, ogni tanto, si bloccava Apache, ma, guardando i log e lanciando i tools di manutenzione, la macchina sembrava libera in attesa di input. Inoltre se provavi a raggiungere un sito installato su questa macchina, questi non caricava mai andando in "out of timeout".

Il problema risiedeva in PHP-PFM, infatti nel suo log compariva questa stringa:
WARNING: [pool www] server reached pm.max_children setting (3), consider raising it

Questo significa che il server ha un alto traffico dati (infatti gestisce un sito di E-Commerce) e non ha abbastanza processi PHP-FPM per soddisfare le richieste. Come agire allora?
In primo luogo bisogna verificare le risorse della macchina (a meno che non sappiate ciò):

Codice: Seleziona tutto

cat /proc/cpuinfo
Questo per sapere che tipo di processore avete (core, frequenza, bits, ecc.)

Codice: Seleziona tutto

 free -h
per valutare quanta memoria avete a disposizione.
La mia macchina è un processore Intel a 64bit, 3500MHz, mono-core con 4GB di ram di cui 1,6GB usati dal sistema (attenzione alla ram usata).

Adesso controlliamo quanta memoria ram richiedono i "processi figlio" (children) per eseguire le istruzioni. Lanciamo questo comando:

Codice: Seleziona tutto

ps -ylC php-fpm --sort:rss
nella colonna "rss" troviamo il valore espresso in Kbyte. Potete calcolare il carico medio di ogni singolo processo con questo comodo comando:

Codice: Seleziona tutto

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
Nel mio caso era di 50MB

Un semplice calcolo... "pm.max_children= Quantità di RAM / Dimensione del processo figlio"
Avremo così i "processi massimi" eseguibili con la nostra RAM. Nel mio caso il valore è 81,92. Attenzione però: non dimenticate che il php-fpm non è l'unico processo che usa la ram. Quindi dovete trovare un buon compromesso prestazionale affinché la macchina non si blocchi per mancanza di ram (anche se ha la swap), e il php-fpm funzioni liscio liscio senza intoppi.

Fatto ciò spostiamoci sul file di configurazione di PHP-FPM, questo varia da distribuzione a distribuzione, in Debian/Ubuntu lo trovate in /etc/php/*[¹]/fpm/php-fpm.conf, e cerchiamo la stringa pm.max_children = 3 e modifichiamola con un valore maggiore, nel nostro caso ho modificato in pm.max_children = 25

riavviate il servizio PHP-FPM con:

Codice: Seleziona tutto

service php*[¹]-fpm restart
Il server non avrà più problemi di processi bloccati.

Enjoy!

Note:
[¹] = questo valore può variare, nel mio caso era 7.0 usando php7.0
ATTENZIONE! WARNING! se lanciando il comando TOP la macchina presenta un alto consumo delle risorse, avete due strade: la prima, provate ad abbassare il valore di pm.max_children, magari è esagerato come valore. La seconda strada è che il server non ha abbastanza risorse per il compito, quindi valutate il caso di fare un "upgrade" della macchina con maggiori risorse specie in ambito processore/memoria.
Avatar utente
Martyn
Amministratore
Messaggi: 161
Iscritto il: 20/11/2013, 4:40
Contatta:

Re: Configurare PHP-FPM

Messaggio da Martyn »

Potete usare anche questo comando per calcolare la dimensione del singolo processo:

Codice: Seleziona tutto

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | grep php-fpm
vi restituirà un output "human readable" :D
Rispondi