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
Codice: Seleziona tutto
free -h
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
Codice: Seleziona tutto
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
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
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.