FR  EN

Performances des versions de PHP

L'arrivée de la machine HipHop par Facebook (HHVM) a réveillé le projet PHP et a instauré une saine compétition entre les différents projets. Ainsi, vous allez constater que la performance est maintenant un objectif important au point que les temps d'exécution ont été divisés par trois entre la version de PHP 5.3.10 et la version PHP 5.6.4.

Cependant, l'effet négatif de cette compétition est l'apparition de tests biasés ou peu réalistes. En effet, beaucoup de tests comparent les performances des différents runtime avec le calcul de la suite de Fibronaci, de l'encodage json ou avec la lecture d'un article de WordPress (base quasiment vide et sans plugin). Cela peut intéresser certains projets, mais la plupart des gens veulent plutôt savoir ce que valent les différentes alternatives avec une application réelle et composite. On constate alors qu'il faut nuancer les vitesses d'exécution annoncées dans le cas des toutes dernières versions.

Méthodologie

Nous avons créé un script JMeter que vous pouvez trouver sur le dépôt du projet. Afin d'exclure une partie des temps réseau, les composants statiques (JS, CSS, images, etc.) ne sont pas téléchargés, car nous nous intéressons seulement au temps de calcul des différents moteurs PHP. De même, le test d'effectuera pas d'écriture en base de données.

La base a été chargée avec 2000 utilisateurs et 7000 demandes de congé (voir le fichier Excel dans le répertoire donné en lien).

Nous avons utilisé un VPS hébergé par OVH avec un VCPU et 1 Go de RAM. Nous avons limité le test à 30 utilisateurs simultanés et des pauses de moins de 10 secondes entre les étapes. Ces limites ont été calculées de manière à rester en dessous de 60% de temps CPU, autrement dit le serveur n'a jamais été en situation de saturation. Les machines PHP sont lancées avec leur configuration par défaut en tant que serveur FastCGI.

Le test dure environ 30 minutes et les temps de réponse comparés sont ceux du 90ème centile. Dit simplement, on compare ce qui se passe dans 90% des cas en excluant les échantillons les plus extrêmes.

Vous pouvez vous reporter à la conclusion de l'article pour plus d'informations techniques.

Synthèse des résultats

On constate une amélioration significative des performances à partir de la version 5.4 de PHP. D'une part, les temps de réponse des versions antérieures sont médiocres et, d'autre part, les dernières versions consomment moins de puissance CPU pour un résultat plus rapide.

Nous préconisons l'installation de Jorani avec la version 5.6 de PHP. Nous vous encourageons vivement à mettre à jour votre environnement dans le cas d'une version antérieure.

La version 7 est encore en cours de développement et ses performances pourraient être améliorées d'ici sa sortie (prévue en fin d'année 2015). Cependant, il ne faut pas s'attendre à une compression importante des temps de réponse.

Transaction PHP 5.3.10 PHP 5.4.41 PHP 5.5.25 PHP 5.6.4 PHP 7-dev HHVM
  -331% -105% -47% base -5% -31%
Login Form 3188 2431 2369 2117 2102 2919
Login Action 3179 1254 908 376 383 344
Home 893 406 204 136 155 175
List of leaves 1399 714 506 298 326 402
Export leaves 2652 998 492 173 286 188
View counters 1393 623 238 144 173 192
View calendar 1252 624 313 201 228 300
Leaves feed for FullCalendar 1146 471 182 110 146 133
Show day offs in calendar 1037 389 188 118 140 152
tabular calendar 2292 1104 647 415 434 476
Show organization 1376 635 371 230 251 323
Root node of organization 1629 508 199 142 138 166
List of employees in a node 1256 397 180 110 133 138
Supervisor of a node 977 359 172 106 135 134
Request List 2166 1440 1417 1027 986 1429
View a leave 1198 588 215 144 177 200
ICS of day offs 2417 756 625 290 293 317
ICS of global calendar 1945 749 604 399 376 371
Logout 1600 734 396 245 298 317
API get access token 701 395 203 139 175 154
API get list of employees 2014 1371 1715 1365 1385 1985

Matrice des composants techniques

Comme expliqué précédemment, les benchmarks existant concernent rarement une application complète et composée de plusieurs dépendances externes au projet. Si cela peut vous aider dans votre propre projet, nous listons ici les différentes bibliothèques tierces utilisées par les différentes transactions.

Transaction BCRYPT phpseclib PHPExcel Oauth2 VObject (json)
Login Action        
Export leaves          
Root node of organization          
List of employees in a node          
ICS of day offs          
ICS of global calendar          
API get access token          
API get list of employees          

Conclusion

À propos des tests de charge

Attention au fait que le test de performance employé dans cet article n'est pas représentatif des conditions réelles d'utilisation de Jorani. Le script met l'application en situation de stress et sollicite des fonctionnalités pas forcément utilisées dans votre organisation (l'API par exemple) et à des fréquences d'appel élevées. Il s'agit d'un benchmark — ou test technique de comparaison.

Cependant, vous pourriez vous inspirer du script JMeter mis à disposition afin de créer votre propre test de charge. Tester la performance de l'application est important — entre autres objectifs — pour valider le dimensionnement de votre hébergement.

Paramètres d'exécution

Cela n'a pas d'importance dans l'interprétation des résultats, mais le serveur utilisé était nginx et le serveur de données était mariadb touts deux dans leur dernière version et sur le même serveur (l'overhead de ces deux composants était de l'ordre de 5%).

HHVM a été lancé en mode serveur.

hhvm --mode server -vServer.Type=fastcgi -vServer.Port=9000

PHP a été lancé en mode serveur avec 4 workers pour les versions 5.3 à 5.6, tandis que la version 7 a nécessité 8 workers (sans quoi elle plantait).

PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
/usr/bin/php-cgi  -b 127.0.0.1:9000

Il est possible d'optimiser les différents paramètres et l'environnement d'exécution (par exemple en utilisant une socket), mais il est difficile de trouver de la documentation. En particulier pour HHVM où le tuning des environnements n'est pas très bien expliqué par le projet. Pour PHP, la situation est différente, car la lacune de documentation vient des changements importants survenus dans les dernières versions. En effet, beaucoup de documents et articles ont été rendu obsolètes par les dernières versions.

N'hésitez pas à contribuer en partageant vos astuces d'optimisation.

— Benjamin BALET

 
 
Étiquettes :    configurer 
Soutenez le projet !




Vous aimerez aussi

Comment gérer la liste de ses demandes d'heures supplémentaires ?

Jorani permet de gérer la liste de ses demandes d'heures supplémentaires avec la possibilité de les modifier du moment qu’elles sont encore au statut Planifié.

Page calendrier annuel

Jorani permet d'afficher les demandes de congés sous la forme d'un calendrier. Dans ce cas, toutes les absences d'un employé sur l'année.

Comment enregistrer les arrêts maladie?

Comment gérer les absences imprévues des employés? Par exemple, les les arrêts pour maladie. Comment les lister, les exporter, etc.

Page du rapport de liste des congés pris

Comment obtenir la liste des congés acceptés durant un mois et pour un groupe d'employés de votre organisation, puis l'exporter vers Excel.

Amélioration des performances dans la version 0.4.2

Nous avons optimisé le code applicatif et beaucoup travaillé sur la compatibilité avec PHP7 afin d'offrir des performances explosives.

comments powered by Disqus