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
):
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.