Ricerca nel sito web

Come impedire a PHP-FPM di consumare troppa RAM in Linux


Se hai distribuito un LEMP (Linux, NGINX, MySQL/MariaDB e PHP), probabilmente stai utilizzando il proxy FastCGI all'interno di NGINX (come server HTTP), per l'elaborazione PHP. PHP-FPM (acronimo di FastCGI Process Manager) è un'implementazione alternativa di PHP FastCGI ampiamente utilizzata e ad alte prestazioni.

Ecco le guide utili sulla configurazione di LEMP Stack in Linux.

  • Come installare lo stack LEMP con PhpMyAdmin in Ubuntu 20.04
  • Come installare il server LEMP su CentOS 8
  • Come installare LEMP sul server Debian 10

Recentemente, tutti i nostri siti web PHP su uno dei nostri server web LEMP sono diventati lenti e alla fine hanno smesso di rispondere quando si accedeva al server. abbiamo scoperto che il sistema stava esaurendo la RAM: PHP-FPM aveva consumato la maggior parte della RAM, come indicato nello screenshot seguente (sguardi – strumento di monitoraggio del sistema).

glances

In questo articolo, mostreremo come evitare che PHP-FPM consumi troppa o tutta la memoria di sistema (RAM) in Linux. Alla fine di questa guida imparerai come ridurre il consumo di memoria PHP-FPM del 50% o più.

Riduci l'utilizzo della memoria PHP-FPM

Dopo aver effettuato alcune ricerche su Internet, abbiamo scoperto che dovevamo riconfigurare il gestore del processo PHP-FPM e alcuni suoi aspetti per ridurre il consumo di memoria di PHP-FPM nel file di configurazione del pool.

Il pool predefinito è www e il suo file di configurazione si trova in /etc/php-fpm.d/www.conf (su CentOS/RHEL/Fedora) o /etc/php/7.4/fpm/pool.d/www.conf (su Ubuntu/Debian/Mint).

sudo vim /etc/php-fpm.d/www.conf             [On CentOS/RHEL/Fedora]
sudo vim /etc/php/7.4/fpm/pool.d/www.conf    [On Ubuntu/Debian/Mint]

Trova le seguenti direttive e imposta il loro valore in base al tuo caso d'uso. Per le direttive commentate, è necessario rimuoverle dal commento.

pm = ondemand
pm.max_children = 80
pm.process_idle_timeout = 10s
pm.max_requests = 200

Spieghiamo brevemente le direttive di cui sopra e i loro valori. La direttiva pm determina come il gestore dei processi controllerà il numero di processi figli. Il metodo predefinito è dinamico, il che significa che il numero di figli (processi figli) viene impostato dinamicamente in base ad alcune altre direttive tra cui pm.max_children che definisce il numero massimo di figli che possono essere vivi allo stesso tempo.

Il gestore di processi più ideale è lo schema ondemand in cui nessun processo figlio viene creato all'avvio ma viene generato su richiesta. I processi secondari vengono biforcati solo quando si connettono nuove richieste in base a pm.max_children e pm.process_idle_timeout che definiscono il numero di secondi dopo i quali un processo inattivo verrà terminato.

Ultimo ma non meno importante, dobbiamo impostare il parametro pm.max_requests che definisce il numero di richieste che ogni processo figlio dovrebbe eseguire prima del respawn. Tieni presente che questo parametro può essere utilizzato anche come soluzione alternativa per perdite di memoria nelle librerie di terze parti.

Dopo aver effettuato le configurazioni di cui sopra, ho notato che l'utilizzo della RAM ora funziona correttamente sul nostro server. Hai qualche pensiero da condividere relativo a questo argomento o domande? Raggiungeteci tramite il modulo di feedback qui sotto.