Talk Performances au Human Talks

Les Human Talks ont eu la gentillesse de m’inviter à parler de la gestion des performances applicatives.

Et si on livrait demain, que se passerait t’il ? Nous allons voir ensemble comment aborder l’évaluation des performances applicatives dans un contexte Agile et Devops.

Les slides de la présentation :

Et la vidéo :

Du monitoring à la matière noire

J’ai participé au Breizhcamp cette année avec une présentation sur le monitoring.

Au passage merci aux organisateurs pour cette édition 2014. Les conférences sont toujours l’occasion de discussions passionnées sur les sujets les plus chaud du moment et puis c’est cool finalement de pouvoir assister à des conférences sans rien avoir à faire. Bravo aussi à l’initiative de faire un repas ouvert à tous le jeudi soir. On a ainsi pu partager les discussions passionnées des speaker diners avec d’autres passionnés.

Le but ce cette présentation est de revoir un peu nos idées reçues sur le monitoring. Même si le sujet n’est pas forcément très hype, Lean et Devops changent notre vision des mesures et les outils BigData viennent à notre secours.

La présentation se trouve .

Sébastien Brousse a twitté sur une partie de la présentation où je fais un détour par la matière noire. Je pense que le rapport avec le monitoring est peu évident sans les explications que j’ai donné de vive voix et le slide ne vous sera pas forcément d’une grande aide.

Pour ceux qui n’étaient là en attendant la vidéo voici les explications et même quelques infos supplémentaires.

Mais pourquoi la matière noire ?

Non, je n’ai pas changé de métier, la présentation parlait bien de monitoring.

Tout d’abord il y a peu de femmes dans l’informatique et donc dans les conférences, et c’était l’occasion d’avoir deux grandes dames avec nous, Margaret Burbidge et Vera Rubin, deux astrophysiciennes.

La première a imaginé le concept de matière noire, la seconde a poursuivi les travaux et mis au point une méthode pour prouver son existence.

Nous on est n’est pas des astrophysiciens, je vais rester à un niveau assez général. Pour les détails, sur la matière noire je vous renvoie à Wikipedia.

Des galaxies prises en excès de vitesse

Cette découverte a un rapport avec le monitoring parce que tout ça découle de problèmes de mesure.

Les astronomes avait constaté depuis longtemps que les galaxies spirales tournaient trop vite par rapport à la masse qu’elles sont supposées avoir d’après les mesures.

Plusieurs hypothèses ont été avancées pour expliquer cette bizarrerie en particulier l’imprécision des mesures.

Dans les années 1970, Margaret Burbidge a refait les mesures avec toute la précision des moyens de l’époque. Et là, ça ne collait toujours pas.

Plutôt que de remettre en cause les mesures, Margaret Burbidge a remis en cause le raisonnenment. Si la vitesse ne colle pas avec la masse, c’est que la masse n’est pas celle que l’on pense.

A cette époque on évalue la masse à partir des objets que l’on peut observer au téléscope, donc ceux qu’on peut voir parce qu’ils émettent de la lumière. Par conséquent, elle en a déduit qu’il y a dans les galaxies quelque chose qui a une masse mais que l’on ne voit pas parce que ça n’émet pas de lumière. C’est le concept de matière noire.

Vera Rubin qui travaillait avec Margaret Burbidge a apporté des éléments de preuve en mettant au point une méthode de calcul de la masse basée sur l’influence gravitationnelle de la galaxie sur son environnement, ce qu’on appelle la masse dynamique. A la différence de la masse lumineuse, la masse dynamique est compatible avec la vitesse de rotation des galaxie spirales. Et la masse dynamique basée directement sur l’effet de la masse n’a pas de raison d’être fausse, ce qui justifie qu’il y a un élément non visible ayant une masse.

Bon, d’accord mais moi je mesure des requêtes HTTP

Ok, nous on ne mesure pas des galaxies, mais même si on peut parfois regarder le serveur, enfin la boîte, finalement ce qu’on mesure est tout aussi peu visualisable.

Cette histoire montre que c’est important de mesurer de la bonne manière.

Si on mesure des effets indirects, on est dépendant d’un modèle. Ce modèle c’est l’idée qu’on se fait du fonctionnement du système et il peut être faux.

Dans un certain nombre de cas, cette mesure indirecte marche, par exemple la masse lumineuse convient pour les objets très lumineux comme les étoiles. Mais de temps en temps, ça ne marche pas.

Bien sûr, on n’a pas toujours la possibilité de mesurer l’effet direct, et de temps en temps on doit se baser sur une mesure indirecte parce que c’est plus abordable. Dans ce cas il faut rester vigilant, et savoir remettre en cause le modèle qu’on se fait du système.

Notre matière noire

Qu’est ce que c’est notre matière noire à nous les informaticiens ?

Ce sont les caches, les buffers, les load balancers, les heuristiques sur les files d’attente, les optimisations de JVM, tout un tas de mécanismes internes au système qui le rendent plus performant, mais qui font aussi que certaines de nos mesures ont un comportement erratique ou n’ont plus de sens dans certaines situations.

Au final, mesurer correctement les performances d’un système ou d’une application informatiques est une activité qui réserve toujours des surprises. On ne peut pas se contenter de poser des sondes au petit bonheur la chance sans comprendre ce qu’on fait. Il faut comprendre le système et comment il fonctionne pour le mesurer correctement.

On a un peu plus de chances, en cas de doute on peut souvent se reporter à la documentation (quoique à la réflexion pas toujours) ou demander au développeur (enfin des fois … ).

Mais par contre, un cache c’est beaucoup moins beau sur les photos qu’une galaxie spirale.

Les images proviennent toutes de la galerie d’images de la Nasa.

Tests de performance au YaJUG

J’ai uploadé les slides de la présentation sur les tests de performance que j’ai faite au YaJUG fin Octobre.

Les présentations, la mienne, celle de Stéphane Landelle sur Gatling, et celle d’Antonio Gomes Rodrigues sur JMeter ont été filmées par le YaJUG et seront disponibles sur Parleys dans l’espace du YaJUG http://www.yajug.org/confluence/display/Public/Past+Events+2012.

A cette occasion je me suis rendue compte qu’on connait des petits trucs que les autres n’utilisent pas forcément.

Mon truc c’est d’utiliser les profils Firefox pour éviter la reconfiguration du proxy.

JMeter, comme la plupart des outils de test de charge, utilise un proxy HTTP pour enregister une séquence d’actions  que vous jouez dans votre navigateur et générer un squelette de scénario de test. Pour que cela fonctionne, il faut configurer un HTTP Proxy Server dans JMeter, puis aller dans la configuration du navigateur pour indiquer  le port du proxy et enregistrer le scénario. Si vous ne l’avez jamais fait, la procédure complète se trouve là http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf

Première chose, le HTTP Proxy Server n’est pas toujours sur un port pratique. Il est par défaut sur le port 8080, ce qui est ennuyeux si vous avez aussi un Tomcat sur la même machine. Le navigateur trouvera bien quelque chose sur le port 8080, mais ça n’est pas votre proxy.

Une fois le port changé et les options de filtrage configurées, je sauve cet élément en utilisant « Save Selection As … ». Ceci permet de le réimporter plus tard en utilisant la fonction « Merge » dans le menu. Donc voilà, mon port est 4567.

 

Ensuite, il faut créer un profil dans Firefox qui passera toujours par Proxy sur le port 4567.

Il faut activer le Profile Manager car il n’est pas actif par défaut. La procédure varie selon les OS. Pour MacOSX, la procédure se trouve ici, pour Windows il faut ajouter -ProfieManager à la fin de  la ligne de commande du raccourci.

Au prochain démarrage, Firefox vous proposera de choisir un des profils existants et vous pourrez créer un profil JMeter.

Il y a un autre intérêt à passer par un profil spécifique. Vous laisserez ce profil vierge de tout add-on et vous éviterez ainsi de devoir configurer des filtres au niveau du proxy pour ignorer les requêtes émises en continu par ces extensions.

La prochaine fois, il n’y a plus rien à faire. Vous importez l’élément HTTP Proxy Server sauvegardé, vous le démarrez, vous lancez Firefox avec le profil JMeter et tout marche.

L’Open World Forum 2012

logo open world forum 2012L’Open World Forum 2012 s’est tenu le week end dernier à Paris.

Certains blocs de sessions étaient pris en charge par l’OSDC, le FUDCon (Fedora), le PAUG, Ruby.rb et divers groupes FOSS. De la diversité mais un planning assez opaque et quand à trouver la bonne salle parmi 9 salles sur 3 étages plus un auditorium …

Même si on retrouve toujours un peu les mêmes, la communauté Java était peu représentée et c’était l’occasion de croiser d’autres communautés de langages ou de pratiques.

Les gros événements étaient les présentations Google TV et le PAUG Conf Day. Beaucoup de monde et j’étais en retard pour d’autres contraintes donc au final j’ai beaucoup picoré dans les sessions de l’OSDC qui avait fourni un planning détaillé et j’ai gardé deux des sessions pour faire ce post. Les sessions ont été filmées par le PAUG et l’OSDC et seront disponibles bientôt.

L’Open World Forum c’était aussi la présence d’artistes et de sessions d’initiation à l’informatique pour les enfants. J’en parlerai dans un autre post sur le site de Duchess France.

Mais revenons en aux sessions techniques.

Choisir entre la corde et le poison

NoSql, cloud et montée en chargePierre Couzyosdc

Row of network servers in data centerPierre Couzy travaille chez Microsoft. Il est venu partager son expérience et les leçons qu’il a apprises sur le jeu Atlantis Fantasy. C’est un jeu Flash dont le back end est hébergé sur le cloud Azure qui utilise MongoDB en plus d’une base SqlServer classique.

Je n’aurais jamais cru écrire deux des mots de la phrase précédente sur ce site, mais en définitive les leçons qu’il a partagé sont valables sur beaucoup d’environnements Cloud.

Les jeux en ligne Facebook ont un cycle de vie en loi de Poisson avec un démarrage assez brutal lors de la propagation sur les réseaux sociaux, un plateau plus ou moins court selon l’attrait du jeu et un déclin en longue traîne au fur et à mesure que les joueurs se lassent. Les périodes critiques économiquement sont la croissance très rapide avant le plateau et le début du déclin. Dans les deux cas, la capacité doit s’adapter rapidement pour satisfaire les utilisateurs ou pour éviter des coûts disproportionnés. Le cloud est alors bien adapté pour gérer les phases de croissance et de maturité et ces jeux migrent souvent sur un hébergement classique moins couteux pour gérer le déclin. L’autre souci à gérer est qu’un jeu en ligne peut difficilement tolérer des arrêts pour maintenance et a très peu d’inactivité. Il marque seulement un creux dans la nuit. D’un autre coté des arrêts très brefs sont peu perçus par les joueurs car le client Flash les masque.

communication and internet network server roomLe premier constat est que sur un cloud toute opération disque devient une opération réseau car le stockage disque est fourni sous forme de service réseau de type EBS chez Amazon ou Azure Drives. Or la performance des bases de données dépend pour beaucoup des performances du stockage. Des défauts qui passent inaperçus sur des disques rapides locaux ressortent ici et sont difficiles à diagnostiquer car on raisonne toujours en volume d’écriture en mesurant la vitesse de transfert en bytes per second. Or c’est la latence du réseau qui bride le système pas le débit binaire du disque. C’est donc le nombre d’opérations, les IOPS qu’il faut surveiller. Elles plafonnent en général autour de 1000.

VenomLa deuxième recommandation est de diviser pour mieux régner. Les données sensibles comme les transactions financières sont restées sur un serveur SQL classique car il est impossible de garantir leur intégrité sur MongoDB. MongoDB est utilisé là où la souplesse du modèle est utile. Pour les données stockées dans MongoDB, Pierre Couzy recommande de partager les données entre plusieurs bases en fonction de leur cycle de vie pour pouvoir faire des optimisations plus agressives. Dans le cas du jeu, les données sont classées en trois catégories, l’état du jeu relativement stable, les données sociales assez volatiles, et des verrous logiques dont la durée de vie est très courte. Une des raisons de ce découpage est qu’il n’est pas utile de stocker physiquement des données à durée de vie très courte, l’autre est que les ralentissements sur les verrous doivent être absolument évités car ils ralentissent tout le reste du jeu.

Un troisième constat est que le multi-instance n’est pas la panacée. Lorsque l’instance MongoDB atteint sa limite de capacité, la première idée est de répartir la charge sur plusieurs instances. Mais une instance unique est plus efficace qu’une des instances du cluster. La réplication avec chacune des  autres instances mobilise une partie des ressources, à peu près autant que les écritures primaires dans ce cas. Elle entraîne aussi des risques d’incohérence qui demandent des mécanismes de contrôles eux-aussi coûteux. La réplication sur les 3 instances pendant que le jeu est à pleine charge prend des jours et peut pénaliser les temps de réponse du jeu. Les journaux de réplication dépassaient leur taille limite ce qui créait d’autres problèmes. A contrario, une instance unique peut se limiter au strict nécessaire sans Oplog et sans journalisation le temps de gérer l’installation en multi-instance. Risqué mais ça tient la charge. Mais attention, ces optimisations très agressives rendent le passage du cap vers le muti-instance encore plus difficile.

Infinity clock. Vector illustrationLe sharding nécessite aussi un peu de réflexion. Par défaut, la shard key est l’id généré par MongoDB. Cet id est monotone et les données nouvelles partaient sur la même partition. La bonne clé dépend du cycle de vie des données. Si ces données sont répliquées par la suite le problème n’est que transitoire. La solution retenue a été de transformer l’id et déplacer des caractères de la fin vers le début pour forcer la clé à changer rapidement d’ordre de grandeur.

funambuleLe réglage a été un processus incrémental. Viser un objectif pas trop haut, trouver la bonne configuration, puis augmenter la charge. Les tests de performance se sont avérés quasiment impossibles car ils ne reproduisaient pas la réalité correctement. Sur du cloud il n’est pas nécessaire de prévoir la capacité totale du système, elle peut être augmentée avec un peu d’anticipation. Pour cela, les logs, le monitoring et des représentations visuelles de l’usage des ressources sont indispensables.

Pierre Couzy recommande aussi de choisir la taille de machine en fonction du facteur limitant que l’on préfère subir. Les petites configurations sont limitées par la mémoire, les moyennes par la CPU, les grandes par le réseau. Il préfère la limitation par la CPU car elle est simple à monitorer et qu’elle cause moins d’effets de bord que la mémoire et le réseau. Toutefois, même dans ce cas la limite de capacité créera des timeouts et des effets de cascade car les clients recommencent faute de réponse rapide. La durée des timeouts tend à mettre le système en résonance ce qui est identifiable par des courbes en zigzag.

Nous voilà parés pour le backend. Et côté client quoi de neuf ?

Les nettoyeurs de code Android

Pierre-Yves Ricau et Alexandre Thomas  – Android Annotations 

logo AndroidAnnotationsPierre-Yves et Alexandre nous ont présenté Android Annotations, qui comme son nom l’indique permet de remplacer de la plomberie un peu systématique dans la programmation Android par des annotations.

Cette session est essentiellement basée sur une démo de code donc je ne rentrerai pas dans le détail, il faudra aller la voir 😉

Une partie des annotations remplace les déclaration et les initialisations des extras, des vues, des ressources via de l’injection de dépendance. D’autres annotations permettent de remplacer les AsyncTasks en déclarant simplement par une annotation si la méthode tourne sur l’UI Thread ou en background. Enfin les annotations qui ont éliminées le plus de code sont celles qui remplacent les classes anonymes des event handlers. A l’arrivée un code plus court, plus lisible et qui marche toujours (si si on a vérifié).

Le surpoids est assez faible car le framework sépare la librairie embarquée sur le device de la librairie qui gère la génération des classes supplémentaires pour le code généré. Au final, le framework rajoute une classe pour chaque classe annotée et un peu de code.

logo AndroidKickStartrAlexandre Thomas nous a aussi rapidement présenté Android KickstartR qui regroupe tout un tas de librairies couramment utilisées dans un même bundle et permet d’initier rapidement un projet Android.

Présentation Performances à Toulouse et Bordeaux

Voici les slides de la présentation que j’ai faite aux JUGs de Toulouse et Bordeaux le 7 et 8 décembre.

 

Je voudrais remercier ces JUGs ainsi que les deux genigraph.fr qui a publié un compte rendu sur son blog. Le JUG de Toulouse a également fait un compte-rendu de la soirée.

Une session similaire a été enregistrée par le JUG de Lausanne.

Présentation « Performances » pour le Lyon JUG

Mardi 21 Décembre je ferai une présentation sur les performances, les tests et JMeter au Lyon JUG.

Pour les gens qui sont par là vous pouvez trouver les détails et vous inscrire ici : http://www.lyonjug.org/evenements/performances

Vous trouverez la présentation en SlideShare ici
Et la présentation en téléchargement et les exemples là Les éléments de la présentation.

Petit tour des nouveautés Jakarta JMeter 2.4

La version 2.4 est une version majeure qui apporte quelques fonctionnalités et corrige plusieurs bugs.
Côté scripting Web pas de changement profond :
  • le proxy d’enregistrement a maintenant une vrai gestion des sessions HTTPS. En 2.3, il faisait du spoofing, ce qui marchait dans la plupart des cas, mais pas toujours. Par ailleurs, il fallait penser à changer le protocole pour http: et souvent on oubliait ce détail et on galérait longtemps.
  • l’option par défaut du HTTP Redirect change. La valeur par défaut n’est plus « Follow Redirects » mais « Redirect Automatically » pour permettre la capture des cookies placés pendant les redirects. Cela n’affecte pas les scénarios existants, seulement les nouveaux HTTP Samplers
Attention pour les gens qui aiment les sasfepu, JMeter nécessite maintenant Java 5.
Les évolutions ont plutôt porté sur les autres protocoles et l’outillage :
  • l’ajout de protocoles mail supplémentaires
  • des améliorations sur le protocole JMS (support des Topics et des Queues et en Publish/Subscribe et corrections de bugs)
  • le support des samplers en JUnit4
  • l’intégration de la JSR 223 – Scripting for the JavaTM Platform
  • l’amélioration des listeners qui reportent les résultats (ResultTree, outils de statistiques)
La liste complète des changements et des corrections se trouve sur la release note http://jakarta.apache.org/jmeter/changes.html
Passons à l’expérimentation
Toujours le même problème de menus à moitié en anglais et à moitié en français si on choisit la langue anglais sur un OS en français.
Enregistrons un script vite fait pour une recherche sur Google. Le proxy d’enregistrement, n’a pas changé. Le script généré non plus.

view Results Tree - réponse en affichage texte

Une nouvelle assertion la Comparison Assertion qui permet de lever une erreur s’il y a un écart trop grand entre un relevé initial de référence et les suivants, sur la base du contenu ou du temps de réponse.
Quelques surprises du côté du view Results Tree (arbre de résultats). Tiens au passage changer la langue fait un clear des résultats. Heureusement que mon test dure 10s.
Un nouveau mode d’affichage du résultat du sample en tableau (mode décodé ou parsed en anglais).
Pas de changement pour la requête.
Pour la réponse, une fonctionnalité de recherche dans le résultat a été ajoutée.  Elle permet de rechercher un texte dans le résultat en mode exact ou en expression régulière (voir schéma ci-dessus).

view Result Tree - réponse en HTML

Bon , là  je me suis demandée pendant un bon moment où était la case à cocher pour afficher en HTML, parce que quand même c’est pratique pour vérifier ce qu’on a reçu.
En fait, le sélecteur à été déplacé sous la liste des samples. Il permet de choisir entre HTML, JSON, XML, texte brut et un testeur de RegExp (schéma à droite). Attention, les fichiers manipulés et générés sont stockés dans le répertoire où est lancé jmeter. C’est un peu le bazar à la longue.
Tiens, tiens, un évaluateur d’expressions régulières. Ce truc là devrait être bien pratique pour tester les expressions régulières des assertions et des extractions de texte dans les résultats sans aller chercher des outils externes comme QuickREx.

Testeur d'expressions régulières

Les Aggregate report et Summary report ne semblent pas avoir changé, ni la vue tableau. JMeter annonce des optimisations de consommation de ressources sur ces composants. Je n’utilise jamais les autres vues car je ne suis jamais en mode GUI pendant les tests et je fais toujours les stats et les courbes avec R à partir du log.
Que fait le nouveau listener JSR 223 ? Il permet d’utiliser du code de script dans le traitement des résultats. C’est l’équivalent des listeners BeanShell et BSF mais en plus standard, avec le support de plus de langage et en particulier Groovy.
Vous trouverez là un article très complet sur le scripting dans JMeter en JSR 223 dans les différents composants et les prérequis : http://blog.zenika.com/index.php?post/2009/07/29/INTEGRATION-DU-SUPPORT-DU-JSR223-DANS-JMETER
J’ai aussi trouvé un autre article en français sur JMeter 2.4 en cherchant des informations sur la JSR 223 dans JMeter. Il est plus général et couvre certains aspects que je n’ai pas couvert parce que je ne les utilise pas en ce moment : http://blog.milamberspace.net/index.php/2010/07/14/apache-jmeter-2-4-est-sorti-694.html
Le format d’enregistrement des résultats en mode non-gui est resté identique.
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">

<httpSample t="207" lt="57" ts="1279471780513" s="true" lb="/search" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="54101"/>
<sample t="1209" lt="752" ts="1279471780049" s="true" lb="Contrôleur Transaction" rc="200" rm="Number of samples in transaction : 8, number of failing samples : 0" tn="Thread Group 1-1" dt="" by="190509"/>

</testResults>

Si cet article vous a intéressé, vous trouverez ici d’autres articles de ce site qui peuvent vous intéresser

Présentation JMeter



Le 25 mars 2010, j’ai fais une présentation dans le cadre des cours du soir Valtech.

Le but était de présenter JMeter (des gens ne savent pas qu’on peut enregistrer un scénario avec JMeter), mais aussi de comprendre les pièges qui influent sur la pertinence et la communication des résultats des tests de performance.

Les slides utilisés pendant le cours sont en Creative Commons sur SlideShare.