php5-fpm: le serveur a atteint pm.max_children

41

J'ai Nginx + php5-fpm . Plusieurs fois par heure, mon site Web se bloque et dans le fichier journal, je vois ce qui suit:

AVERTISSEMENT: le serveur [pool www] a atteint le paramètre pm.max_children (5), envisagez de le surélever.

Le fichier /etc/php5/fpm/pool.d/www.conf contient la configuration suivante:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Serveur: AMD Opteron ™ 3280, DIMM 16 Go (Octo-Core, 8x 2,4 GHz), 16 Go (DDR3).

Je ne sais pas quels numéros dois-je mettre dans le fichier www.conf pour ce serveur. Puis-je aider quelqu'un? Merci

utilisateur1821484
la source

Réponses:

40

Il existe de nombreuses raisons pour lesquelles votre PHP-FPM atteindrait le max_children. Les plus communs sont:

  • Beaucoup de demandes parallèles de vos clients
  • Lente exécution des scripts PHP
  • Réglage très bas de la max_children

En regardant les spécifications de votre machine, en supposant qu'il n'y a rien d'autre que PHP + Nginx en cours d'exécution, je pense que vous pourriez le définir beaucoup plus haut que 5. Vous dites que vous avez 8 cœurs, généralement Nginx a besoin de beaucoup moins de temps que PHP, donc avec 5 enfants vous ne pourrez probablement jamais les utiliser toutes. Je le règle généralement sur quelque chose comme le nombre de cœurs x 2 ou le nombre de cœurs x 4 , en fonction de la consommation de mémoire de vos scripts PHP.

rejouer
la source
C’est un site de rencontres avec chat php et les utilisateurs envoient des millions de messages instantanés. Hier soir, lorsque j'avais ~ 300 utilisateurs en ligne, la commande netstat -an | grep 80 | wc - le résultat était presque 400.
user1821484
1
J'ai en fait un site de rencontres similaire. Je pense que vous avez certainement besoin de plus d'enfants PHP. Ma configuration est la suivante: 20 000 utilisateurs en ligne simultanés, 12 machines PHP avec 8 cœurs chacune, 32 ouvriers sur chacune des machines PHP. Ça marche plutôt bien. Vous devriez également regarder combien de mémoire libre vous avez, je suppose que vous en avez, à moins que votre PHP ne soit énorme. Si vous avez de la mémoire libre, pourquoi ne pas l’utiliser pour davantage de travailleurs?
rejouer
@ user1821484 C'est correct; pm.max_childrenest beaucoup trop bas . Une valeur de 10 est raisonnable pour un petit serveur VPS avec 1 Go de RAM; vous avez un serveur beaucoup plus grand. Augmentez cette valeur jusqu'à ce que vous cessez de recevoir les erreurs, puis relancez-la au cas où vous auriez un pic de trafic.
Michael Hampton
Merci pour les réponses. J'ai augmenté le paramètre pm.max_children à 10 et maintenant j'ai commencé à avoir cette erreur: AVERTISSEMENT: [pool www] semble occupé (vous devrez peut-être augmenter pm.start_servers, ou pm.min / max_spare_servers), engendrant 16 enfants, il y a 0 au repos, et 8 enfants au total. Quelqu'un peut-il me suggérer ce que je dois augmenter? Merci.
user1821484
les noyaux x 2 ou les noyaux x 4 sonne vraiment très bas pour moi. J'ai une machine avec 8 cœurs et 8 Go de RAM avec pm.max_children = 48 et nous avons toujours le serveur atteint avertissements pm.max_children . Cette machine est loin de ses limites de CPU ou de mémoire. Une meilleure approche serait d’optimiser ce paramètre en association avec les paramètres correspondants de nginx (ou apache) et de choisir une valeur après avoir déterminé la quantité de mémoire utilisée par chaque processus PHP.
S. Imp
19

J'ai constaté qu'en définissant la valeur pm.max_requests (commentée par défaut), nous avons pu résoudre ces erreurs. Ce paramètre force les requêtes enfants à réapparaître après l'exécution d'un certain nombre de requêtes et peut être utile en cas de fuite de mémoire quelque part dans votre code ou dans des bibliothèques tierces.

Dans /etc/php-fpm.d/www.conf :

pm.max_requests = 500
Tom Jowitt
la source
13

Ce lien peut être utile - il explique comment calculer le nombre de processus enfants en fonction de la quantité de mémoire stockée sur le système:

HTF
la source
7
Cette réponse sera inutile une fois que ce lien aura disparu.
miken32
2
En fait, le lien dit ... valeur appropriée pour pm.max_children peut être calculée comme suit: pm.max_children = RAM totale taille dédiée au processus fils serveur web / Max
jaywhy13