RSS
 

Cakefest #3 – Second jour de conférences

12 août

«»

Hautes performances avec CakePHP – Joël Perras

Voici donc la dernière conférence de ce CakeFest, sur un sujet on ne peut plus important pour toutes les personnes souhaitant utiliser le framework pour des applications critiques ou très sollicitées : la performance. Tout au long de cette présentation, Joël Perras a mentionné divers outils utiles pour effectuer des tests de performance et optimiser son application.

Il a commencé par dire la chose suivante : il ne faut pas croire ce que l’on vous présente et les méthodes d’optimisation données tant que vous ne les avez pas expérimentées et testées par vous même. Il n’existe pas de recette miracle pour optimiser une application, et cela dépend réellement du type d’application que l’on a. Par exemple, il ne sert à rien d’essayer de gagner des quarts de ms sur le côté serveur d’une application alors que le côté client (Javascript) est mal codé et ralenti l’affichage de la page : l’utilisateur ne fait pas de différence au final ! Vous êtes donc avertis … testez ce qui est présenté ici sur vos applications !

jperras-performance

Lorsque l’on doit gérer la mise à l’échelle d’une application il y a deux choix possibles : scalabilité verticale (ajouter un serveur supplémentaire) ou scalabilité horizontale (rajouter de la RAM sur le serveur existant). Si jamais vous avez les moyens de le faire et que cela vous permette de satisfaire vos attentes il ne faut pas hésiter, utilisez la solution de facilité ! Si jamais vous pensez qu’il vaut mieux travailler sur l’application en elle-même alors c’est parti !

En tant que développeur PHP, une des meilleures choses à comprendre lorsqu’il s’agit d’optimisation est le fonctionnement même de PHP. En effet, il est intéressant de bien comprendre ce qui se passe entre la lecture du fichier texte *.php et la génération du HTML correspondant. A partir de là il est plus simple de comprendre à quel endroit il faut agir pour optimiser son application, ou la benchmarker. Voici par exemple le fonctionnement simplifié trouvé sur Wikipédia :

Voici donc trois outils intéressants pour améliorer les performances de votre application :

  • APC : cache de code intermédiaire (opcode) pour PHP, il vous permet d’optimiser et de mettre en cache ce type de code afin d’accélérer certaines étapes de l’interpréteur PHP
  • MemCache : système permettant de mettre en cache les appels vers les bases de données afin de réduire encore une fois la charge serveur
  • Gearman : le système central permettant de répartir la charge sur vos serveurs lors d’applications distribuées

Afin de choisir le meilleur outil de cache, mieux vaut savoir exactement quelles parties de son application doivent être optimisées. C’est donc par là que tout commence si on ne veut pas travailler pour rien : trouver son point faible ! Pour cela, Joël a présenté l’outil Siege qui est l’outil par excellence à avoir dans votre boîte à outil pour réaliser des benchmarks ! Cette application se charge de générer des connexions simultanées sur votre site, permettant ainsi de déterminer comment votre application monte en charge. Un outil à peu près équivalent a également été mentionné : Apache AB. Voici un exemple d’appel à Siege pour tester les performances de Cakephp.org, et le résultat obtenu :

$ siege -e 25 -r 25 -i IM http://cakephp.org
[...]
Transactions:                 375 hits
Availability:              100.00 %
Elapsed time:               37.03 secs
Data transferred:           13.52 MB
Response time:                0.83 secs
Transaction rate:           10.13 trans/sec
Throughput:                0.37 MB/sec
Concurrency:                8.39
Successful transactions:         375
Failed transactions:               0
Longest transaction:            1.10
Shortest transaction:            0.78

Pour les utilisateurs de XDebug, un autre outil intéressant a été mentionné et complimenté : il s’agit du profiler intégré à XDebug qui permet de générer des rapports sur les points faibles de vos scripts PHP (voir cachegrind et valgrind). Encore un outil vraiment très utile !

Dans tous les cas, lors de l’analyse des résultats obtenus, le point sur lequel Joël Perras a insisté est que c’est une erreur de se baser sur les valeurs moyennes de performances. L’utilisateur ne se rappellera que du temps de chargement de sa page et il faut donc évaluer les performances de son application en se basant sur les pires résultats obtenus.

Vient ensuite le moment tant attendu de l’optimisation ! Après avoir fait tous ces benchmarks vous devez avoir pu déterminer si l’application devait vraiment être optimisée ou non, et à quel niveau. Voici donc les différentes couches sur lesquelles vous pouvez travailler pour améliorer les performances de votre application :

  • Requêtes SQL : dans 80% des cas modifier une requête SQL (en utilisant notamment le Containable Behavior) pour l’optimiser vous fera faire un bond énorme dans les performances de votre application. De même il se peut que la modélisation de la base de données soit incorrecte et vous ralentisse, d’où l’intérêt de passer du temps sur la conception de celle-ci.
  • Mise en cache : il y a là encore différentes techniques de mise en cache des pages HTML générées
    • Mise en cache de la page entière : utiliser l’attribut $cacheAction du contrôleur
    • Mise en cache d’éléments
    • <cake:nocache> pour mentionner des portions de page qui ne seront pas mises en cache lorsque la page entière est cachée. Ceci a été très fortement déconseillé par Joël, cela sera même supprimé dans les futures versions du framework !
  • Cache OpCode : APC avait été présenté en début de conférence, il existe aussi XCache ou encore eAccelerator
  • Serveur web : le serveur peut également être amélioré pour gagner de précieuses microsecondes. Lighttpd a été présenté comme un serveur nettement plus performant que Apache, et Nginx a également été mentionné.
  • Autres micro-astuce PHP : vérifiez votre include_path afin que le chemin vers Cake soit en premier et qu’il n’y ait pas de chemins inutiles

Pour conclure la conférence un bémol a été émis quand à l’intérêt de vouloir à tout prix optimiser une application : attendez d’en avoir réellement besoin, et focalisez vous sur les parties les plus importantes ! N’oubliez jamais d’optimiser les scripts côté clients car ils sont au moins aussi importants que ceux côté serveur. Pour celà, vous pouvez utilisez les outils de Yahoo! ou Google à votre disposition : YSlow et PageSpeed

Une conférence vraiment très intéressante qui permet de rediriger vers de nombreux outils tous plus utiles les uns que les autres … maintenant, c’est à vous de tester ces outils sur vos applications ! Et n’hésitez pas à donner des retours ;)

Pensez à utiliser mon flux RSS pour vous tenir au courant des futurs articles ! Vous pouvez aussi me retrouver sur Twitter pour une actualité plus fréquente.

«»

 
3 Comments

Posted in En vrac

 

Tags: , , ,

  • http://www.gravisure.com/ Vanitom

    Bonsoir,

    Je viens de tester « siege ». C’est bien comme soft pour savoir où on en est.
    Car avant j’utilisais l’affichage réseau de FireBug et ce n’était pas très précis.
    Mais là c’est top, on peut tout paramètrer pour avoir une comparaison exact entre différente version.

    Par contre j’ai une question. Est’il possible de faire ces tests sur une page nécessitant une authentification ?

    Pour finir juste une petite remarque. As tu testé « siege » sur http://www.google.com/ . C’est impressionnant mais c’est Google.

    En tout cas merci pour ces articles intéressant.

  • http://www.pierre-martin.fr Pierre MARTIN

    Bonjour Vanitom,

    J’ai découvert siege lors de ce Cakefest, et ne l’ai utilisé que pour faire quelques tests et voir ce que celà donnait (d’ailleurs c’est vrai qu’on se rend bien compte des performances des grands sites omparés à d’autres plus modestes).

    Du coup je ne peux pas trop t’éclairer sur l’authentification … si ce n’est que leur site indique « Siege supports basic authentication, cookies, HTTP and HTTPS protocols » …

    Bonne continuation en tout cas pour tes tests de performance !
    Pierre

  • Pingback: CakePHP n’est pas mort !