Cada trabajador de PHP ocupa memoria, esté ocupado o parado. Con muy pocos, las peticiones se ponen en fila unas detrás de otras; con demasiados, la máquina se queda sin memoria, empieza a hacer swap y se vuelve más lenta de lo que habría sido con menos.

Mida un trabajador

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

Normalmente entre 30 y 80 MB. Un framework pesado o muchos plugins suben esa cifra, y lo que importa es su número, no uno típico.

La cuenta

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
Deje margen. Un trabajador que da con una página pesada consume varias veces la media, y un pool dimensionado al límite exacto lo rebasará en cuanto el tráfico se salga de lo normal, que es justo cuando necesita que aguante.

static, dynamic u ondemand

  • static: todos los trabajadores arrancan al inicio. El más rápido y ocupa la memoria esté trabajando o no. Adecuado para una máquina dedicada con carga estable.
  • dynamic: mantiene algunos de reserva y crece hasta el límite. El valor por defecto sensato.
  • ondemand: arranca cuando hace falta y mata tras un tiempo de espera. Mínima memoria, pequeña latencia en la primera petición. Adecuado para muchos sitios pequeños en una misma máquina.
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 es un seguro contra fugas

El trabajador se jubila tras ese número de peticiones y uno nuevo toma el relevo. No cuesta casi nada y contiene una fuga lenta en cualquier biblioteca que no controle usted.

Compruebe si se está quedando corto

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

Esa línea significa que hubo peticiones en cola. Si no aparece nunca, el pool es lo bastante grande y subirlo no hará nada más rápido.

En el alojamiento de EGPHP el pool se dimensiona y se vigila por usted. Esto es para un VPS que lleva usted mismo, donde el valor por defecto rara vez encaja con la máquina.