Faire des tests de charge sur son site avec Blitz.io

27 Juillet 2011

Aujourd'hui avec Twitter, Google+ et les réseaux sociaux il faut être capable de tenir la charge d'un afflux de plusieurs centaines d'internautes. En effet, on est pas à l'abri de voir un de ses tweets RT par un bloggeur "influent", du coup il faut pouvoir tester la tenue en charge de son serveur. Heureusement, il existe différentes applis pour tester cela et Blitz.io est un nouveau venu dans ce type d'outils...

Introduction

Blitz.io est donc un site développé avec node.js qui propose de faire des tests de performances sur son site. Il essaye de rendre les tests de charge plus fun en parlant de sport et quelques références de Foot US dans le wording et l'interface du webservice.

Capture de la home de Blitz.io

Voici l'interface que l'on obtient une fois que l'on s'est connecté à Blitz.io avec un compte Google (ou Facebook). Il propose directement de faire un test afin de vérifier la vitesse de chargement. Mais ce n'est pas la seule chose que propose Blitz.io, il permet également de faire des tests de charges concurrent ainsi qu'une API, mais nous verrons cela dans la suite...

Le "sprint" ou test de vitesse

Bien que la capture montre que je suis connecté, il n'est pas nécessaire d'être inscrit pour lancer ce test. Le principe est le même que l'on retrouve sur tous les autres outils du genre, on précise une URL et un test est lancé quelque part dans le monde.

Capture du résultat du test de chargement sur blitz.io

Mon test a été lancé du Japon, mais il est possible en modifiant les options de faire un test d'Irlande, de Singapour, de Californie et de Virginie. Il n'y a pas grand chose à dire pour cette fonctionnalité, si ce n'est que 1,44 secondes pour un visiteur du Japon ce n'est pas si mal !

Le "rush" ou test de charge

La partie la plus intéressante de Blitz.io est celle qui permet de faire des tests de charge en accès concurrent. Pour cette fonction, il faut toujours saisir une URL dans le champ de test mais il faut également fournir des paramètres. Ainsi la requête de test devient : --pattern 1-250:60 http://www.johanbleuzen.fr. Cette requête va faire un test de 60 secondes avec jusqu'à 250 accès concurrents sur le site mentionné, de quoi vérifier correctement la tenue en charge de son serveur.

Mais pour pouvoir exécuter ce test, il faut faire une petite manipulation sur son serveur histoire de montrer à Blitz.io que l'on est bien le propriétaire du serveur, sinon Blitz.io pourrait servir à faire des attaques de DDoS. La capture suivante montre la page d'explication que l'on obtient lorsque lance le test mais que son serveur n'est pas authentifié par le service :

Capture de la page d'autorisation

Il faut donc créer un fichier avec le nom qui est donné sur la page à la racine de son serveur et se débrouiller pour qu'il retourne uniquement la valeur 42. Le snippet suivant montre comment faire en PHP (c'est très facile à faire dans d'autres langages) :

<?php
echo '42';
?>

Une fois que le fichier qui retourne 42 est dispo sur votre serveur, alors Blitz.io va être sur que vous êtes le propriétaire du site et va pouvoir lancer le test "Rush". Les résultats s'affichent "en live" sur la page et l'on obtient un joli graphique qui montre comment son serveur gère le test :

Capture du graphique de test en concurrence

Tout c'est bien passé sur mon test, sur les 6 368 requêtes effectuées sur le serveur, il n'y a eu que 3 timeouts, ce qui est satisfaisant pour un blog perso... Mais si vous voulez avoir plus d'informations sur le test qui vient d'être exécuté, il y a l'onglet Highlights qui va vous fournir d'avantage de données qui peuvent être plus ou moins intéressantes pour identifier un problème ou vérifier des hypothèses techniques.

Capture des statistiques du test de rush

La "condition" ou intégration des tests

Avoir besoin de son navigateur pour faire des tests n'est pas ce qu'il y a de plus pratique. Blitz.io fournit également un gem ruby qui permet de facilement lancer des tests en ligne de commande. Peu de configuration à faire et un réel intérêt si vous voulez faire des tests de charge quotidien sur les performances de votre webapp en cours de développement. Le gem s'installe ainsi :

$> gem install blitz
$> blitz api:init
Enter your blitz credentials:
User-ID: your-email
API-Key: your-api-key

Les "credentials" s'obtiennent en allant dans les Settings de la webapp et dans la partie Et il devient super simple de lancer un test "rush" avec la commande suivante pour obtenir une sortie des tests plus "conventionnelle" :

$> blitz curl -r ireland -p 1-250:60 http://www.johanbleuzen.fr
rushing from ireland...
+-----------+----------+----------+------------+--------------+--------+----------+
|  time (s) |    users | hits/sec | kbytes/sec | latency (ms) | errors | timeouts |
+-----------+----------+----------+------------+--------------+--------+----------+
|         2 |       11 |        3 |         46 |          107 |      0 |        0 |
|         5 |       23 |       12 |        620 |          110 |      0 |        0 |
|         5 |       23 |       12 |        620 |          110 |      0 |        0 |
|         8 |       35 |       25 |       1505 |          109 |      0 |        0 |
|        11 |       47 |       33 |       2559 |          108 |      0 |        0 |
|        14 |       59 |       45 |       4006 |          110 |      0 |        0 |
|        17 |       71 |       57 |       5839 |          110 |      0 |        0 |
|        20 |       84 |       66 |       7945 |          115 |      0 |        0 |
|        22 |       96 |       79 |      10316 |          114 |      0 |        0 |
|        25 |      108 |       91 |      13112 |          111 |      0 |        0 |
|        28 |      121 |       97 |      15925 |          124 |      0 |        0 |
|        31 |      133 |      110 |      19362 |          117 |      0 |        0 |
|        34 |      145 |      119 |      22733 |          134 |      0 |        0 |
|        37 |      157 |      127 |      26367 |          136 |      0 |        0 |
|        40 |      169 |      144 |      30749 |          152 |      0 |        0 |
|        43 |      181 |      149 |      34914 |          146 |      0 |        0 |
|        46 |      193 |      166 |      39909 |          128 |      0 |        0 |
|        49 |      206 |      168 |      44618 |          174 |      0 |        0 |
|        52 |      218 |      179 |      49929 |          152 |      0 |        0 |
|        55 |      230 |      182 |      55481 |          211 |      0 |        0 |
|        58 |      242 |      194 |      61412 |          175 |      0 |        0 |
|        61 |        7 |      129 |      63667 |          207 |      0 |        0 |
+-----------+----------+----------+------------+--------------+--------+----------+

Je pense que l'on puisse faire plus simple et plus pratique... Dans cet article, je ne couvre pas toutes les possibilités du gem, il y a d'autres options à découvrir avec le gem blitz, par exemple faire des tests avec une base couchDB, mais je n'ai pas testé...

Conclusion

Blitz.io est très complet, il suffit de saisir la commande--help dans le champ de test pour voir les nombreuses options de cet utilitaire qui mérite de prendre place aux cotés de WebPageTest et autre GTMetrix...

Le service est gratuit avec certaines limitations, mais il est possible d'aller jusqu'à 1 000 000 d'accès concurrents à condition de payer une petite somme rondelette. Si jamais vous vouliez essayer ce service j'apprécierai que vous passiez par ce lien, ainsi je pourrais augmenter le nombre d'accès concurrents jusqu'à 750.

Et puis sinon, c'est rassurant de voir que le blog tiens la charge à 250 users... :)

Charger les commentaires…