J'ai un serveur CentOS. Le système est nginx/php-fpm. Il a 16 Go de RAM. CPU: 8
Fréquence du processeur: 2660,203 MHz
Pourquoi ai-je cette erreur dans mon journal d'erreurs?
php-fpm/error.log :
[02-Aug-2014 17:14:04] AVERTISSEMENT: [pool www] semble occupé (vous devrez peut-être augmenter pm.start_servers ou pm.min/max_spare_servers), engendrant 8 enfants, il y a 0 inactif et 21 au total les enfants
Ceci est ma configuration php-fpm pour le pool www:
php-fpm/www.conf :
pm = dynamique
pm.max_children = 32768
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 10
pm.max_requests = 5000
Comment résoudre le problème?
C'est un cookie difficile car il pourrait y avoir de nombreux facteurs impliqués. Le premier problème avec votre configuration est que max_children est ridiculement élevé. Si chaque processus enfant utilise 50 Mo, 50 x 32 768 épuiserait facilement 16 Go.
Une meilleure façon de déterminer max_children est de savoir combien chaque processus enfant utilise, puis de prendre en compte le maximum RAM que vous aimeriez que php-fpm utilise, puis de diviser les valeurs. Par exemple, si j'ai un serveur de 16 Go, je peux exécuter la commande suivante pour déterminer combien de RAM chaque enfant php-fpm consomme:
ps -ylC php-fpm --sort:rss
Remarque! Il peut être nécessaire de spécifier explicitement l'utilisateur si php-fpm s'exécute sous un autre.
ps -ylC php-fpm --sort:rss -u www-data
où www-data est l'utilisateur sous lequel php-fpm est exécuté.
Vous êtes à la recherche de la colonne RSS; il indique la mémoire résidente et est mesuré en Ko. Si j'ai en moyenne 50 Mo par processus et que je souhaite utiliser un maximum de 10 Go pour les processus php-fpm, alors tout ce que je fais est 10000 Mo\50 Mo = 2. Donc, sur cette base, je peux utiliser 200 enfants pour ma consommation de mémoire déclarée.
Maintenant, en ce qui concerne les serveurs, vous voudrez définir les max_spare_servers à x2 ou x4 le nombre de cœurs. Donc, si vous avez un processeur à 8 cœurs, vous pouvez commencer avec une valeur de 16 pour max_spare_servers et aller jusqu'à 32.
La valeur start_servers doit représenter environ la moitié de la valeur max_spare_servers.
Vous devriez également envisager de réduire les max_requests à environ 500.
De plus, en plus de la dynamique, la valeur pm peut également être définie sur statique ou sur demande. Static aura toujours un nombre fixe de serveurs en cours d'exécution à un moment donné. C'est bien si vous avez un nombre constant d'utilisateurs ou si vous voulez garantir que vous ne violez pas la mémoire maximale. À la demande, les processus ne seront lancés qu'en cas de besoin. L'inconvénient est évidemment de devoir constamment démarrer/tuer les processus, ce qui se traduira généralement par un très léger retard dans le traitement des demandes. L'avantage, vous n'utilisez les ressources que lorsque vous en avez besoin. "Dynamique" démarre toujours X quantité de serveurs spécifiés dans l'option start_servers et crée des processus supplémentaires selon les besoins.
Si vous rencontrez toujours des problèmes de mémoire, envisagez de remplacer pm par à la demande.
Ceci est une directive générale, vos paramètres peuvent nécessiter des ajustements supplémentaires. Il s'agit vraiment de jouer avec les paramètres et d'exécuter des benchmarks pour des performances maximales et une utilisation optimale des ressources. C'est un peu fastidieux mais c'est le meilleur moyen de déterminer ces types de paramètres car chaque configuration est différente.