6 votes

Fluctuations bizarres des performances avec php-fpm et nginx

J'effectue un test de charge sur un service web. Il s'agit d'une application php fonctionnant sur php-fpm et nginx, avec fastcgi. Il y a un backend MySQL qui est utilisé pour de petites lectures seulement.

Invariablement, j'observe un schéma particulier : les performances sont stables et augmentent de manière prévisible lorsque le trafic augmente, mais elles deviennent instables au moment du pic : l'utilisation de l'unité centrale fluctue constamment.

Voici le modèle de performance que j'observe (visualisé avec nmon ):

enter image description here

La chute coïncide toujours avec la brève pause que mon outil de test de charge - locust.io - marque lorsqu'il finit de monter en puissance jusqu'au niveau maximal que j'ai fixé pour le test.

Mon hypothèse : Pendant ce bref instant, le php-fpm Le maître pense que la charge a disparu et commence à tuer des travailleurs ; il n'est pas en mesure de réagir assez rapidement lorsque le trafic reprend de plus belle quelques instants plus tard.

Ce que je ne comprends pas, c'est pourquoi il n'arrive jamais à se remettre dans le bain : Je constate cette fluctuation indéfiniment sur les 4 serveurs d'application derrière l'équilibreur de charge.

Voici la configuration de mon pool php-fpm :

[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 100
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 100
pm.max_requests = 10000

J'ai déjà confirmé qu'il ne s'agit pas d'un problème avec la base de données - j'ai observé exactement le même comportement après avoir doublé le nombre d'esclaves de lecture MySQL.

Quelle en est la cause ? Comment puis-je l'arrêter ?

EDIT :

Voici un graphique qui illustre ce que je constate. Notez que le taux d'échec atteint généralement un pic juste au moment où le nombre d'utilisateurs atteint un pic, puis redescend progressivement.

user_count vs fail_ratio

1voto

Deex Points 129

Qu'en est-il de la gestion de la mémoire ? Ces dernières semaines, j'ai fait des tests similaires et j'ai amené un serveur à la limite. J'ai vu beaucoup de changements au niveau de la mémoire. Dans mon cas, une grande quantité de données a été transférée dans le swap au lieu de la RAM pour gérer la charge. Après un test, j'ai eu un résultat vraiment étrange, plus aucune RAM n'était utilisée et tout était parti dans le swap. C'est peut-être ce qui ralentit les requêtes suivantes.

Voici un exemple d'image de mon swap après un test de charge enter image description here

0voto

mc0e Points 5736

Que se passe-t-il avec les entrées-sorties de disque et le verrouillage ? On peut supposer que si votre processus est lié au CPU jusqu'à un point où cela change, c'est que quelque chose d'autre est occupé, et il est très probable que ce soit votre disque.

Atteignez-vous des limites de mémoire qui vous feraient commencer à échanger des données ? Quelle quantité de RAM vos processus PHP utilisent-ils (RSS) ? Quelle est la quantité de RAM disponible ? Les performances fluctuent-elles de la même manière si vous réduisez le nombre de processus PHP ? A quel niveau la fluctuation apparaît-elle ?

Il convient de noter que pm.max_children = 100 est probablement beaucoup trop élevé. À moins que vous n'ayez affaire à des demandes de longue durée, comme de gros téléchargements, il est probablement préférable de le réduire considérablement. J'hésite à préciser un chiffre sans savoir ce que fait le système, mais quelque chose de l'ordre de 5 à 40 fonctionnera probablement mieux. pm.max_requests est également susceptible d'être beaucoup trop élevé. Si ce qui est exécuté par php est très variable et consomme beaucoup de mémoire, ou si vous avez des fuites de mémoire, alors vous ferez mieux de le réduire encore un peu plus. Si vous ne savez vraiment pas ce qui fonctionne, commencez avec chacun de ces paramètres à environ 30 et expérimentez.

PHP génère-t-il des sessions ? Comment sont-elles stockées ? Si elles sont sur un système de fichiers, de quel type de système s'agit-il ? Dans certains cas, vous obtenez un goulot d'étranglement avec le verrouillage du répertoire dans lequel elles se trouvent. L'utilisation d'une structure de répertoire hachée pour elles ou l'utilisation de memcached, par exemple, peut aider à résoudre ce problème.

Qu'est-ce que strace exécute contre les processus PHP qui prennent du temps ? Vous pouvez regarder cela avec une commande composée de la manière suivante :

(ps wwaux | grep '^www-data.*php' |  awk '{print $2}' \
  | xargs -n 1 -P 32 strace -r -p ) 2>&1 
  | perl -ne '($n) = /^ *(\d*\.\d*)/; print "$n\t$_" if ((defined $n) and ($n > 0.01))'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X