Chaque worker PHP occupe de la mémoire, occupé ou non. Trop peu, et les requêtes font la queue les unes derrière les autres ; trop, et la machine manque de mémoire, se met à swapper, et devient plus lente qu'elle ne l'aurait été avec moins.

Mesurer un worker

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

Typiquement 30 à 80 Mo. Un framework lourd ou beaucoup d'extensions font monter ce chiffre, et c'est le vôtre qui compte, pas un chiffre typique.

Le calcul

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
Laissez de la marge. Un worker qui tombe sur une page lourde consomme plusieurs fois la moyenne, et un pool dimensionné pile à la limite la dépassera au moment où le trafic devient inhabituel - c'est-à-dire précisément quand vous avez besoin qu'il tienne.

static, dynamic ou ondemand

  • static - tous les workers démarrent au boot. Le plus rapide, et occupe la mémoire qu'il travaille ou non. Le bon choix pour une machine dédiée à charge constante.
  • dynamic - garde quelques workers en réserve et monte jusqu'à la limite. La valeur par défaut raisonnable.
  • ondemand - démarre à la demande et tue après un délai. Mémoire minimale, petite latence sur la première requête. Le bon choix pour beaucoup de petits sites sur une même machine.
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 est une assurance contre les fuites

Un worker est retiré après ce nombre de requêtes et un neuf prend le relais. Cela ne coûte presque rien et contient une fuite lente dans n'importe quelle bibliothèque qui ne vous appartient pas.

Vérifier si vous êtes à court

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

Cette ligne veut dire que des requêtes ont fait la queue. Si elle n'apparaît jamais, le pool est assez grand et l'augmenter n'accélérera rien.

Sur l'hébergement EGPHP, le pool est dimensionné et surveillé pour vous. Ceci vise un VPS que vous gérez vous-même, où la valeur par défaut convient rarement à la machine.