Un exemple pour montrer comment Node.js est plus rapide que PHP

Je voulais voir ce qu’était tout ce battage médiatique à propos de Node.js,  ainsi j’ai décidé de conduire certains tests de chargement en face à face en utilisant Ghost (Node.js) et WordPress (php). Les résultats étaient incroyables avec Ghost, celui-ci étant sans aucun doute  meilleur que WordPress. C’était comme regarder un vaisseau spatial faire la course contre un avion (du moins ce  de la manière dont je l’imagine).

Il y a une nouvelle plateforme de blogs appelée Ghost qui a été récemment mise à disposition du grand public. Ce qu’il y a d’intéressant au sujet de Ghost, c’est qu’il est construit à partir de la plateforme Node.js. Si vous ne connaissez pas  Node.js vous devriez lire mon blog sur ce sujet ici. Si vous ne connaissez pas Ghost, vous pouvez lire  ce projet de lancement ici.

L’installation

Pour vous parler  un peu du contexte, Ghost est juste une plateforme pour blogs et rien de plus tandis que WordPress  est  un système complet de gestion de contenu (CMS). Je souhaitais faire cette comparaison le plus équitablement possible,  je limitais donc mon test de chargement de scripts à l’exécution  sur les pages de blog uniquement. Je voulais également tester l’expérience “prêt à l’emploi”,  donc je n’ai pas fait de changements de configuration depuis la plateforme (en plus de les brancher tous les deux jusqu’à MySQL). Je les ai renvoyées  à un simple 64-bit RHEL m1.large (référence serveur taille de l’image ci-dessus pour spécifications) exemple sur Amazon EC2 pour accueillir les deux plateformes de blogs.

Amazon Server Sizes

Je souhaitais tester les configurations les plus basiques ainsi j’ai utilisé NginX en amont de Ghost et Apache en amont de WordPress. Les deux plateformes partageaient la même structure de base de données MySQL exemple (Ghost livré avec SQLite par défaut mais je voulais m’assurer que je fournissais un niveau égal sur la structure).

J’avais à la fois Ghost (en écoute sur le port 80) et WordPress (en écoute sur port 8080) qui fonctionnaient au même moment mais uniquement lorsque le chargement était appliqué à une plateforme de blog à un moment donnée.

Cela me conduit à la   partie de la puissance de charge de cette petite expérience. J’ai  fait tourner un  autre cas de EC2 (64-bit ubuntu, size m1.medium – référence serveur taille de l’image ci-dessus pour spécifications) dans la même zone de disponibilité pour essayer de  minimiser l’impact du  réseau sur les résultats de test. J’ai demandé à mon collègue @dustinwhittle de me recommander une configuration de test de chargement et il m’a renvoyé vers son blog à propos des outils test de chargement et  m’a conseillé d’utiliser une combinaison de Siege et Sproxy.

Après avoir installé les plateformes de blog et vérifié  qu’elles fonctionnaient,  j’ai ajouté un série de 8 parties de blog en texte plein (sans image) à chaque site et enlevé tous les blogs préexistants. Dans WordPress, j’ai laissé la norme standard URL en place et n’est pas impliqué de liens permanents afin de ne pas ralentir les choses en utilisant cette fonction. Je n’ai changé aucune des technologies en  cache pour WordPress car  j’essayais de mesurer l’expérience « prêt à l’emploi ». En fait , je n’ai procédé à aucun réglage dans les  plateformes.

L’autre configuration majeure à noter, était que j’ai utilisé  la machine Application Dynamics  afin de collecter et paramétrer les graphiques OS  au cours de ces tests de chargement.

Les tests

Afin d’utiliser Siege pour tester plusieurs connexions en simultanées envers de nombreux URL, j’ai crée une liste des URLs dans un fichier texte. Pour faire cela, j’ai utilisé Sproxy. Diapositives références 20-23 de la présentation suivante pour les détails à partir de Sproxy https://speakerdeck.com/dustinwhittle/agile-performance-testing-checklist. J’ai fait marcher Sproxy sur   Ghost et WordPress et j’ai obtenu  ma liste d’ URLs. J’ai modifié chacun de ces fichiers afin d’inclure les mêmes listes de blog et pour que  les tests de chargement soient aussi  similaires que possible. Vous pouvez voir les contenus de chaque fichier ci-dessous.

Ghost Load Test URLS

Wordpress Load Test URLS

Ainsi  j’étais prêt à faire fonctionner Siege et à  lancement le chargement sur chaque   blog . Siege est un bel outil qui vous permet de manipuler certains paramètres clés. Ceux  que j’ai utilisés le plus étaient le nombre de connexions simultanées (-c) et la durée (-d en secondes) entre les groupes de demande. Voici la commande pour votre référence… siege -v -c 100 -i -t 10M -f urls.txt -d 1

Les résultats

En un mot, stupéfiant! Je lançais Siege pendant  10 minutes avec 100 connexions en simultanées et une seconde de délai entre chaque groupe de demandes Web. Les résultats sont montrés ci-dessous…

Ghost Performance Under Heavy Load

Résultats test de chargement Siege pour Ghost avec Nginx sous chargement conséquent.

Wordpress Siege Results

Résultats test de chargement Siege pour WordPress et Apache sous chargement conséquent.

Comme vous pouvezvoir dans les résultats  ci-dessus, Ghost avec Nginx a dépassé  WordPress avec Apache d’environ 678%   pour un débit transactionnel total sur un test de 10 minutes. Impressionnant, le temps de réaction le plus long pour Ghost était de 2.62 secondes comparé aux déplorables  33.41 secondes pour WordPress. J’ai répété  ces tests  plusieurs fois et j’ai obtenu des résultats très proches,  je ne vais donc pas vous montrer le reste des résultats de test car ils sont superflus. Mon objectif ici n’était pas d’exécuter une analyse exhaustive de performance en variant les chargements mais de créer un chargement substantiel et voir comment chaque plateforme gérait cela.

Voici  quelques autres points de données intéressantes à noter. Au cours du test de chargement, Ghost fonctionnait avec uniquement 1 procédure et Nginx avait  un total de 2 procédures.  WordPress et Apache d’un autre côté engendrait un total de ~110 httpd procédures ce qui est logique puisque  Siege lançait 100 connexions simultanées pour cela. La partie intéressante se trouve dans la donnée CPU des tests de chargements. J’ai tracé l’utilisation Moyenne, Minimum, et Maximum du CPU sur les graphiques ci-dessous. Vous pouvez clairement voir que la consommation CPU de Ghost était d’environ 40% tandis que la consommation de WordPress était d’environ 70%.

Consommation CPU au cours du test de chargement Ghost montrant les valeurs Moyenne, Minimum, et Maximum..

Consommation CPU au cours du test de chargement WordPress montant valeurs Moyenne, Minimum, et Maximum.

Maintenant ne pensez pas que j’ai oublié les modèles de chargement  normaux. Comment les choses se présentent-elles avec un chargement modéré  comparé au très gros chargement que j’ai effectué sur ces plateformes avec un test de 100 connexions simultanées? Pour le savoir j’ai porté le nombre de connexions simultanées à 10 et fixé la durée de connections entre les groupes à  5 secondes. Les résultats sont montrés ci-dessous et s’avèrent une fois de plus impressionnants pour Ghost. WordPress était dépassé  dans chaque domaine possible. Ghost à un débit plus élevé et ce qui est encore plus important, est la réponse de  transaction qui était de .18 secondes par rapport à  aux 2.72 secondes pour WordPress. En ce qui concerne le  CPU,  Ghost consommait  uniquement ~4% en moyenne au cours de ce test tandis que WordPress consommait ~30% en moyenne.

Siege load test results for Ghost with Nginx under light load.

Résultat test de chargement Siege pour Ghost avec Nginx avec un chargement léger.

Siege load test results for WordPress with Apache under light load.

Résultat test de chargement Siege pour WordPress avec Apache avec un chargement léger.

Mise à jour le 10/18/2013 – Ce n’est pas équitable!!! Pommes et  Oranges!!!

Certaines personnes ont dit que je comparais des pommes et des oranges. Vous avez raison ! Dans ce message, j’ai décidé de comparer  les combinaisons communes de Nginx + Ghost et Apache + WordPress. Je les compare dans leurs formes les plus basiques, aucun réglage, aucun cache, juste ce que vous obtenez en principe. Mais je comprends les protestations  et j’ai décidé   d’égaliser le niveau de jeu. Certains personnes pensait qu’Apache était un goulot d’étranglement alors  j’ai décidé d’utiliser Apache comme serveur frontal du web  pour Ghost et effectuer de nouveaux tests.  J’ai fait de nouveaux tests  mais ils étaient tous très cohérents, je ne vais donc montrer que les résultats de l’un d’entre eux.

Apache and Ghost Siege Results

Résultats tests de chargement pour Apache + Ghost.

Load test results for Nginx + Ghost for easy comparison with the results above.

Résultat tests de chargement pour Nginx + Ghost pour comparaison facile avec les résultats ci-dessus.

Les résultats présentés ci-dessus sont intéressants. Apache + Ghost étaient en réalité légèrement PLUS RAPIDES  qu’en utilisant Ghost avec Nginx. Ghost reste encore très rapide  indépendamment de l’utilisation d’Apache où Nginx en tant que serveur Web.

La Conclusion

Ghost est beaucoup plus rapide et peut gérer d’avantage de chargement que WordPress tout en consommant également beaucoup moins de ressource CPU (Ghost a également beaucoup moins de fonctionnalités que WordPress mais cela n’est pas pertinent pour l’objectif de ce test). Il devrait être intéressant de faire tourner Ghost suivant une deuxième procédure de groupe Node.js et voir quelle différence cela fasuivant le débit et l’utilisation de CPU. Hum, cela semble être un très bon sujet pour un autre blog…

Un autre sujet intéressant dont je ne parle pas ici est de surveiller à la fois ces deux plateformes. Dans mon esprit,  il n’est pas suffisant d’observer les comportements de ces plateformes depuis l’extérieur. Je veux voir ce qui se passe à l’intérieur. Dans un prochain blog,  je vais surveiller Ghost avec Nodetime et surveiller WordPress avec AppDynamics. Il me tarde  de voir comment  ils fonctionnent en interne!

Mise à jour le 11/14/2013: En raison d’un intérêt croissant, j’ai réalisé plus  de tests, cette fois avec un opcode cache pour PHP. Vous pouvez lire tout à son propos dans Un exemple en quoi Node.js est plus rapide que PHP – Partie 2

Annexe

Voici les liens  d’informations que j’ai utilisés  pour construire mon blog et tester les plateformes (J’ai utilisé des parties significatives de chaque article  car  ma configuration était différente de la description faitedans chaque article):

Comment installer Node.js: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

Comment installer Ghost: http://docs.ghost.org/installation/

Comment installer MySQL: http://www.cyberciti.biz/faq/how-to-install-mysql-under-rhel/

Comment installer et configurer NginX ainsi qu’utiliser MySQL: http://0v.org/installing-ghost-on-ubuntu-nginx-and-mysql/#.Ul26n2RATL4

Où trouver Siege: http://www.joedog.org/siege-home/

Où trouver Sproxy: http://www.joedog.org/sproxy-home/

Plus  d’informations pertinentes sur l’utilisation de Siege et Sproxy: http://www.euperia.com/linux/tools-and-utilities/speed-testing-your-website-with-siege-part-two/771

Cet article est la traduction du texte original en anglais. Ci-joint le texte original: http://www.appdynamics.com/blog/nodejs/an-example-of-how-node-js-is-faster-than-php/#sthash.OhyixugX.dpuf