Ce billet, au titre racolleur, s’inscrit dans le cadre d’une série d’article visant à expliquer comment j’ai réussi à diviser par 2 le temps de réponse de notre application Symfony2 sans toucher au côté applicatif.
Dans la série:
- Part1. MySQL vs MariaDB
- Part2. Apache2 vs Nginx
- Part3. L’impact de la migration sur les performances
Apache vs Nginx (PHP5-FPM)
L’application tournait avec Apache 2.2
+ PHP 5.4.6
+ APC
. J’ai décidé de migrer sur du nginx 1.6
+ php-fpm 5.5.15
+ APCu
+ OPCache
Le Hardware
Avant :
Nom | Reference |
---|---|
CPU | Intel Xeon L3426 4c/8t @ 1,8Ghz |
RAM | 16 Go |
Hard Drive | 2x1,8To @ 7200rpm |
Network | 400Mbps |
Après :
Nom | Reference |
---|---|
CPU | Intel Xeon E5-1620v2 4c/8t @ 3,8Ghz |
RAM | 32 Go DDR3 ECC 1600MHz |
Hard Drive | 3x 160Go SSD Intel DCS3500 SATA3 6Gbps (Raid 1) |
Network | 1 Gbps Public network + 1 Gbps Private network |
Tuning nginx 1.6.x
La configuration nginx :
La configuration du vhost:
Configuration de php-fpm:
Autres tweaks:
- Augmentation de la limite de fichiers ouvert en simultané
ulimit
- Augmentation dans le kernel du maximum de connexion par socket autorisé
net.core.somaxconn
Performance avant migration
Notre application Symfony2 est assez gourmande de base, notamment sur le nombre de sub request qu’elle génère afin de rendre des blocs de contenus.
Pour le premier test de montée de charge, j’ai été un peu gourmand, j’ai demandé à loader.io de balancer en continu sur 60 secondes de 50 jusqu’à 100 user en simultané. Le verdict tombe comme une guillotine :
- 50% d’erreurs (status HTTP != 200) où le serveur n’a rien répondu
- En moyenne, 17.2 secondes de temps de réponse
- Le test s’est arrêté à 70 user / seconde
Alors j’ai décidé de grandement réduire mes exigences avec 25 users/secondes progressif:
- 0% d’erreurs (status HTTP != 200)
- En moyenne, 4.2 secondes de temps de réponse
Performance après migration
Puis, avec mon pool de 2 serveurs load balancé, j’ai refais les même scénarios.
Jusqu’à 100/user par seconde en continu:
- 0% d’erreurs (status HTTP != 200)
- En moyenne, 3.6 secondes de temps de réponse
Jusqu’à 25/user par seconde en continu:
- 0% d’erreurs (status HTTP != 200)
- En moyenne, 1.3 seconde de temps de réponse
PHP 5.5 et la gestion de la mémoire.
La grande nouveauté de PHP 5.4, c’était la gestion de la mémoire améliorée et d’ailleurs nombre d’entre vous ont publiés des benchmark interessant montrant le gain de consomation mémoire. Du coup voilà un comparatif de la consommation mémoire entre PHP 5.4 vs PHP 5.5. On peux constater qu’il y à une légère amélioration de la consommation.
Résultat
Remarque: J’ai été surpris de voir à quel point PHP était CPU depandant. Quand j’ai remarqué que tous les CPU étaient a 100% pendant le load test et que la mémoire consommée par PHP est montée à peine à 3Go sur les 32Go disponibles, je me suis même demandé si je n’avais pas oublié quelque chose…
Voilà l’impact, dans l’usage réel de l’application du gain de performance sur les request per minutes.
Allez, en bonus un petit scénario jusqu’à 300 utilisateurs. Avec 5 secondes de moyenne de temps de réponse, ce n’est bien sûr pas acceptable pour une application web, mais Varnish viendra dans quelques mois faire exploser ces statistiques.
Les performances globales de l’application après la migration vous seront présentés dans le prochain billet (on fait durer le suspense…)
-
Previous
MySQL vs MariaDB, réduire par 2 le temps de réponse d'une application -
Next
L'impact de la migration - performances doublées