Ogni worker PHP tiene memoria, che sia occupato o fermo. Troppo pochi e le richieste si mettono in fila una dietro l'altra; troppi e alla macchina finisce la memoria, comincia a fare swap e diventa più lenta di quanto sarebbe stata con meno.

Misuri un worker

ps -ylC php-fpm8.3 --sort:rss | awk '{sum+=$8; n++} END {print sum/n/1024 " MB average"}'

In genere 30-80 MB. Un framework pesante o molti plugin fanno salire la cifra, e quello che conta è il suo numero, non uno tipico.

Il conto

max_children = (RAM available to PHP) / (average worker size)

# 8GB box, 2GB for the database and the system, 50MB a worker:
# 6000 / 50 = 120 - then be conservative and use 80
Lasci margine. Un worker che capita su una pagina pesante consuma parecchie volte la media, e un pool dimensionato esattamente sul limite lo supererà nel momento in cui il traffico esce dall'ordinario - cioè proprio quando le serve che tenga.

static, dynamic oppure ondemand

  • static - tutti i worker partono all'avvio. Il più veloce, e occupa la memoria sia che lavori sia che no. Giusto per una macchina dedicata sotto carico costante.
  • dynamic - ne tiene qualcuno di scorta e cresce fino al limite. È il default sensato.
  • ondemand - parte su richiesta e chiude dopo un timeout. Memoria minima, piccola latenza sulla prima richiesta. Giusto per molti siti piccoli su una sola macchina.
pm = dynamic
pm.max_children = 80
pm.start_servers = 12
pm.min_spare_servers = 8
pm.max_spare_servers = 24
pm.max_requests = 500

max_requests è un'assicurazione contro le perdite

Dopo quel numero di richieste il worker viene congedato e ne subentra uno fresco. Non costa quasi nulla e argina una perdita lenta in qualunque libreria che non è sua.

Controlli se sta finendo

grep "server reached pm.max_children" /var/log/php8.3-fpm.log

Quella riga vuol dire che delle richieste si sono messe in coda. Se non compare mai, il pool è abbastanza grande e alzarlo non renderà nulla più veloce.

Sull'hosting EGPHP il pool viene dimensionato e sorvegliato per lei. Questo riguarda un VPS che gestisce da sé, dove il valore predefinito raramente è quello giusto per quella macchina.