Dimensionamento PHP-FPM

Il dimensionamento di un server PHP è essenziale perché permette di ottimizzare le risorse interne ed evitare potenziali downtime del sistema. Di default, PHP-FPM ha una configurazione standard che dovrebbe essere regolata in base alle prestazioni del server, al numero di processi attivi e al consumo medio di un singolo processo.

Ogni worker PHP gestisce una richiesta alla volta, e quando tutte le risorse sono occupate, le nuove vengono messe in coda. Una volta superato il limite delle risorse, Nginx potrebbe restituire vari errori o, nei casi peggiori, il servizio potrebbe andare in down.

La prima cosa da valutare sono i parametri del server PHP che controllano quando e quanti processi vengono creati e mantenuti. All'avvio del servizio, viene inizializzato un numero fisso di server (definito nel parametro pm.start_servers). Quando i processi diventano inattivi, rimangono disponibili, quindi è utile configurare quanti server inattivi (minimo e massimo) vogliamo nella nostra infrastruttura. Avere un numero minimo di server inattivi aiuta a prevenire ritardi nella gestione delle richieste poiché possono essere assegnati immediatamente, mentre impostare un numero massimo di processi inattivi aiuta a evitare sprechi di memoria.

Per eseguire un dimensionamento corretto, è necessario prendere come riferimento i valori hardware del tuo server.

Una configurazione iniziale standard è utilizzare circa il 10-15% dei server come processi inattivi e il 20-30% come massimo. Con questi valori, otteniamo un numero iniziale di start_servers pari al 20% dei processi.

  pm = dynamic
  pm.start_servers = X
  pm.min_spare_servers = Y
  pm.max_spare_servers = X
  pm.max_requests = 500

Per calcolare il dimensionamento corretto dei singoli processi, devi prima determinare la dimensione media dei processi PHP:

ps aux | grep php-fpm | awk '{sum+=$6} END {print "Media MB:", sum/NR/1024}'

Ad esempio, se otteniamo una dimensione del processo di 100 MB, possiamo calcolare il numero di processi in base alla RAM disponibile. Fai attenzione a non sovraccaricare la RAM; lascia un margine per gestire tutti gli altri processi in background.

Esempio con 16 GB di RAM: Numero di processi = RAM (MB) / Dimensione Media Processo (MB)

Su un sistema con 16 GB di RAM, di solito alloco circa 2 GB per i processi in background.

Numero di processi → 14.000 / 100 = 140

min_spare_servers = 10%(140) = 14
max_spare_servers = 30%(140) = 40

  pm = dynamic
  pm.max_children = 140
  pm.start_servers = 28
  pm.max_requests = 500