{"id":95,"date":"2008-09-21T13:31:33","date_gmt":"2008-09-21T13:31:33","guid":{"rendered":"http:\/\/blog.milamberspace.net\/?page_id=95"},"modified":"2012-08-02T18:03:57","modified_gmt":"2012-08-02T17:03:57","slug":"jmeter-test-de-charges-a-distance-distributed-testing","status":"publish","type":"page","link":"https:\/\/blog.milamberspace.net\/index.php\/jmeter-pages\/jmeter-test-de-charges-a-distance-distributed-testing","title":{"rendered":"JMeter : Test de charge distribu\u00e9 (distributed testing)"},"content":{"rendered":"<p>JMeter permet de faire des tests de charge distribu\u00e9s sur plusieurs robots de tests. L&rsquo;id\u00e9e \u00e9tant de r\u00e9partir la charge de test de JMeter sur plusieurs robots de tests. Pourquoi ? Car, si on essaye de faire un tir de charge avec un tr\u00e8s grand nombre d&rsquo;unit\u00e9s <em>(utilisateurs virtuels)<\/em> sur une m\u00eame machine JMeter, on risque de saturer la machine au niveau r\u00e9seau (c&rsquo;est-\u00e0-dire la bande passante), la CPU ou bien la m\u00e9moire. On peut m\u00eame saturer le disque lors de l&rsquo;\u00e9criture des r\u00e9sultats en particulier si on choisit le format XML. Tout cela pour dire que : la r\u00e9partition d&rsquo;un tir de charge sur plusieurs machine est une solution \u00e0 ce type de test.<\/p>\n<p><span style=\"text-decoration: underline;\">Voici un tutoriel qui explique la d\u00e9marche.<\/span><\/p>\n<p>Tout d&rsquo;abord, voyons l&rsquo;architecture \u00e0 mettre en place : une instance de JMeter que nous appellerons le \u00ab <strong>contr\u00f4leur<\/strong> \u00bb. C&rsquo;est \u00e0 partir de ce poste que l&rsquo;on contr\u00f4lera les instances de JMeter \u00ab distantes \u00bb. Ces derni\u00e8res seront nomm\u00e9es \u00ab <strong>injecteurs<\/strong> \u00bb.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"vertical-align: middle;\" src=\"\/wp-content\/images\/jmeter09-img\/00-jmeter-schema-remote-test.png\" alt=\"Sch\u00e9ma de test distribu\u00e9 JMeter\" width=\"569\" height=\"456\" \/><\/p>\n<p>Pour r\u00e9aliser un tir de charge \u00ab distribu\u00e9 \u00bb qui correspond \u00e0 ce sch\u00e9ma, voici ce qu&rsquo;il faut faire.<\/p>\n<p>Tout d&rsquo;abord au niveau du contr\u00f4leur de tir (192.168.1.10), il faut installer un JMeter (ici version 2.4-dev r922088).<\/p>\n<p>Ensuite, sur le contr\u00f4leur, on \u00e9dite le fichier <em>user.properties<\/em> (situ\u00e9 dans <em>JMETER_HOME\/bin\/<\/em>), on ajoute la ligne suivante \u00e0 la fin :<\/p>\n<pre>remote_hosts=injec1,injec2<\/pre>\n<p>Puis enregistrer et quitter.<\/p>\n<p>Afin d&rsquo;avoir la correspondance nom&lt;-&gt;IP, on modifiera le fichier <em>hosts<\/em> de la machine contr\u00f4leur (sous Linux : <em>\/etc\/hosts<\/em>, sous Windows : <em>C:\\Windows\\System32\\drivers\\etc\\hosts<\/em>) en y ajoutant les lignes suivantes :<\/p>\n<pre>192.168.1.11\t injec1\r\n192.168.1.12\t injec2<\/pre>\n<p><em>(NB. On peut se passer de la modification du fichier hosts, en mettant directement les adresses IP dans la ligne <strong>remote_hosts=192.168.1.11,192.168.1.12<\/strong>. Pour ma part, je pr\u00e9f\u00e8re utiliser des noms car c&rsquo;est plus simple que les adresses IP &#8211; dans ma perception des choses.)<\/em><\/p>\n<p>Ensuite, lancer le JMeter de la machine <strong>Contr\u00f4leur<\/strong>, puis en parcourant le menu <strong>Lancer<\/strong> &gt; <strong>D\u00e9marrage distant<\/strong> vous trouverez la liste des deux injecteurs.<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" src=\"\/wp-content\/images\/jmeter09-img\/01-jmeter-controleur-remote-injec.png\" alt=\"JMeter d\u00e9marrage distant\" \/><\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Passons donc du cot\u00e9 des injecteurs :<br \/>\n<\/strong><\/span><\/p>\n<p>Pour chacun, il suffit de :<\/p>\n<ol>\n<li>Installer JMeter (il est pr\u00e9f\u00e9rable (fortement) d&rsquo;avoir la m\u00eame version que le contr\u00f4leur)<\/li>\n<li>Lancer JMeter en mode \u00ab <strong><em>server<\/em><\/strong> \u00bb avec la commande :<\/li>\n<\/ol>\n<pre>JMETER_HOME\/bin\/jmeter-server <em>(sous Linux)<\/em>\r\nJMETER_HOME\\bin\\jmeter-server.bat <em>(sous Windows)<\/em><\/pre>\n<p>Ce mode va d\u00e9marrer une instance de JMeter qui se mettra en \u00e9coute sur le port Java RMI (1099). C&rsquo;est \u00e0 travers ce dernier que le contr\u00f4leur va envoyer les commandes de tirs.<\/p>\n<p><em>(NB. Le mode serveur est un mode non-gui, c&rsquo;est \u00e0 dire que vous ne verrez pas l&rsquo;interface graphique de JMeter.)<\/em><\/p>\n<p><strong><span style=\"text-decoration: underline;\">Revenons sur le contr\u00f4leur :<br \/>\n<\/span><\/strong><\/p>\n<p>Pour lancer le tir \u00e0 distance, il faut bien entendu un sc\u00e9nario de tir. Il n&rsquo;y a pas de diff\u00e9rence entre un fichier de sc\u00e9nario \u00ab mono \u00bb instance JMeter et un sc\u00e9nario pour un tir \u00e0 distance.<\/p>\n<p>Ainsi on ouvre le sc\u00e9nario dans le JMeter Contr\u00f4leur. Dans la partie <strong>Groupe d&rsquo;unit\u00e9s<\/strong> on trouve le nombre d&rsquo;unit\u00e9s \u00e0 5, une dur\u00e9e de mont\u00e9e en charge de 1 seconde, et un nombre d&rsquo;it\u00e9rations de 1000 (par utilisateur).<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" src=\"\/wp-content\/images\/jmeter09-img\/02-jmeter-remote-test-thread-group.png\" alt=\"JMeter Groupe d'unit\u00e9s\" \/><\/p>\n<p>Ces param\u00e8tres seront utilis\u00e9s \u00ab tels quels \u00bb <span style=\"text-decoration: underline;\">sur <strong>chaque<\/strong> injecteur<\/span>. C&rsquo;est \u00e0 dire que si on lance le tir sur 2 injecteurs, on aura de mani\u00e8re <span style=\"text-decoration: underline;\">cumul\u00e9e<\/span> : 10 unit\u00e9s, avec une p\u00e9riode de mont\u00e9e en charge de 1 seconde et une boucle de 1000 ex\u00e9cutions (soit 10 000 it\u00e9rations de l&rsquo;\u00e9chantillon HTTP Request de notre exemple avec deux injecteurs).<\/p>\n<p>Dans le sc\u00e9nario, il y a un fichier d&rsquo;enregistrement des r\u00e9sultats qui se chargera de r\u00e9colter l&rsquo;ensemble des temps de r\u00e9ponses des injecteur. Par exemple ici,\u00a0 un \u00e9l\u00e9ment <strong>Enregistreur de donn\u00e9es<\/strong>. Ce fichier sera cr\u00e9\u00e9 <span style=\"text-decoration: underline;\">uniquement sur le Contr\u00f4leur<\/span>.<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" src=\"\/wp-content\/images\/jmeter09-img\/03-jmeter-simple-data-writer.png\" alt=\"Element Simple Data Writer\" \/><\/p>\n<p>Le meilleur format pour ce type de tir est un fichier CSV plut\u00f4t que XML car chaque injecteur va transmettre au contr\u00f4leur ses r\u00e9sultats, c&rsquo;est donc plus \u00ab verbeux\/lourd \u00bb et n\u00e9cessite de de la bande passante entre le contr\u00f4leur et ses injecteurs.<\/p>\n<p>Le <strong>Contr\u00f4leur<\/strong> centralise donc les r\u00e9sultats, c&rsquo;est sur ce poste que l&rsquo;on trouvera donc le fichier de r\u00e9sultats \u00ab consolid\u00e9s \u00bb apr\u00e8s le tir, dans le r\u00e9pertoire et fichier configur\u00e9s (ici : \/tmp\/remote-test.csv)<\/p>\n<p><strong><span style=\"text-decoration: underline;\">Lancement du tir<\/span><\/strong><\/p>\n<p>Il reste \u00e0 d\u00e9marrer le tir \u00e0 distance. Pour lancer le tir sur <strong>tous<\/strong> les injecteurs en m\u00eame temps, il suffit de choisir le menu <strong>Run<\/strong> &gt; <strong>Remote Start All<\/strong>.<\/p>\n<p>Et hop le tir est d\u00e9marr\u00e9&#8230; pas exactement, la premi\u00e8re \u00e9tape que fait JMeter, c&rsquo;est de transf\u00e9rer le fichier JMX (script JMeter) du tir vers les injecteurs. Ce qui signifie que cela peut prendre un peu de temps si le fichier JMX de sc\u00e9nario est volumineux (plusieurs Mo).<\/p>\n<p>On notera que pendant l&rsquo;ex\u00e9cution du tir, le petit carr\u00e9 est vert, mais les indicateurs du nombre de VU sont \u00e0 0.<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" src=\"\/wp-content\/images\/jmeter09-img\/04-jmeter-remote-test-running.png\" alt=\"Jmeter Test de charge \u00e0 distance\" \/><\/p>\n<p>Une fois le test de charge termin\u00e9, il ne reste plus qu&rsquo;\u00e0 r\u00e9cup\u00e9rer le fichier de r\u00e9sultats qui se trouve sur le Contr\u00f4leur. Si vous avez choisi le format CSV, vous pouvez exploiter les r\u00e9sultats en suivant la fin de <a href=\"http:\/\/blog.milamberspace.net\/index.php\/jmeter-tir-de-charges-par-paliers-et-exploitation-des-resultats\/insertion-des-resultats-dans-access-2007-et-generation-dun-graphique\" target=\"_blank\">ce tutoriel<\/a>.<\/p>\n<p><strong><span style=\"text-decoration: underline;\">Quelques recommandations (importantes) :<\/span><\/strong><\/p>\n<p><strong>1\/ Mode ligne de commande :<\/strong> L&rsquo;utilisation de Jmeter en mode graphique pour le contr\u00f4leur n&rsquo;est pas recommand\u00e9e car tr\u00e8s consommateur de ressources (en particulier si vous utilisez un r\u00e9cepteur <strong>Arbre de r\u00e9sultats<\/strong> (il y aun risque d&rsquo;erreur de type OutOfMemoryError sur le JMeter Contr\u00f4leur).<\/p>\n<p>Le mode ligne de commande est ainsi plus adapt\u00e9e car il ne consomme pas de ressource m\u00e9moire pour l&rsquo;affichage des r\u00e9sultats. Voici la ligne \u00e0 saisir (pour Linux, les options restant les m\u00eames pour Windows, il faut simplement adapter les chemins) :<\/p>\n<pre>JMETER_HOME\/bin\/jmeter -n -r -X -t \/home\/milamber\/monscenario.jmx<\/pre>\n<ul>\n<li>Le \u00ab -n \u00bb c&rsquo;est l&rsquo;activation du mode texte (non graphique)<\/li>\n<li>Le \u00ab -r \u00bb c&rsquo;est le mode \u00e0 distance (tous les serveurs de la ligne remote_hosts)<\/li>\n<li>Le \u00ab -X \u00bb est une option permettant demander \u00e0 JMeter (contr\u00f4leur) de stopper les instances de JMeter des injecteurs \u00e0 la fin du tir. (c&rsquo;est plus propre que de faire un kill du processus en fin de tir ;-))<\/li>\n<\/ul>\n<p><strong>2\/ Firewall :<\/strong> il faut penser \u00e0 d\u00e9sactiver les pare-feux sur le poste Contr\u00f4leur et sur les injecteurs. Sinon, soit rien va ne se lancer quand vous allez d\u00e9marr\u00e9 le tir distribu\u00e9. Ainsi dans le cas d&rsquo;un firewall unidirectionnel sur le contr\u00f4leur, vous verrez le tir se lancer sur les injecteurs dans les logs, mais ensuite plus rien, car l&rsquo;injecteur n&rsquo;arrive pas \u00e0 contacter le contr\u00f4leur pour transmettre les r\u00e9sultats.<\/p>\n<p><strong>3\/ Logs des injecteurs :<\/strong> pour suivre l&rsquo;avancement du tir depuis un injecteur, vous pouvez regarder le fichier <em>JMETER_HOME\/bin\/jmeter-server.log<\/em>. Ce dernier contiendra les lignes de d\u00e9marrage des unit\u00e9s (les Utilisateurs Virtuels \/ VU) et les lignes d&rsquo;arr\u00eat.<\/p>\n<p>Exemple :<\/p>\n<pre>2008\/09\/21 10:43:36 INFO  - jmeter.threads.JMeterThread: Thread Thread Group 1-10 started\r\n2008\/09\/21 10:45:47 INFO  - jmeter.threads.JMeterThread: Thread Thread Group 1-1 is done\r\n2008\/09\/21 10:45:47 INFO  - jmeter.engine.StandardJMeterEngine: Ending thread Thread Group 1-1<\/pre>\n<p><strong>4\/ Version Java \/ JDK :<\/strong> il est pr\u00e9f\u00e9rable d&rsquo;avoir la m\u00eame version de Java pour les injecteurs et le contr\u00f4leur. Sachant que pour JMeter version 2.3.2, le JDK 1.5 est recommand\u00e9. (Notamment \u00e0 cause de l&rsquo;impl\u00e9mentation du protocole RMI qui sert de support de communication entre les injecteurs et le contr\u00f4leur.)<\/p>\n<p><strong>5\/ Injecteurs et contr\u00f4leur, Syst\u00e8me d&rsquo;exploitation :<\/strong> On pr\u00e9f\u00e9rera avoir le m\u00eame OS pour tout le monde (pour \u00e9viter les probl\u00e8mes). N\u00e9anmoins, j&rsquo;ai d\u00e9j\u00e0 effectu\u00e9 des tirs de charges \u00e0 distance avec un contr\u00f4leur Windows (XP ou Vista) et des injecteurs Linux (Ubuntu Server), ou bien le contraire, ceci sans probl\u00e8me.<\/p>\n<p><strong>6\/ Format fichier de r\u00e9sultats :<\/strong> comme d\u00e9j\u00e0 indiqu\u00e9, il est pr\u00e9f\u00e9rable de choisir le format CSV. On notera \u00e9galement que JMeter propose d&rsquo;ajouter le nom d&rsquo;h\u00f4te (d&rsquo;injecteur) pour chaque requ\u00eate au niveau de la ligne CSV. Ce qui est pratique pour v\u00e9rifier que tous les injecteurs ont bien fonctionn\u00e9 durant le tir.<\/p>\n<p>Exemple de r\u00e9sultats CSV :<\/p>\n<pre>timeStamp;elapsed;label;responseCode;threadName;success;failureMessage;bytes;Latency;Hostname\r\n\"2008-09-21;10:56:34\";34;01 \/servlets-examples\/index.html;200;Thread Group 1-1;true;;5343;10;injec1\r\n[...]\r\n\"2008-09-21;10:57:15\";8;01 \/servlets-examples\/index.html;200;Thread Group 1-10;true;;5343;8;injec2\r\n\"2008-09-21;10:57:14\";3;01 \/servlets-examples\/index.html;200;Thread Group 1-10;true;;5343;2;injec1\r\n\"2008-09-21;10:57:14\";3;03 \/servlets-examples\/index.html;304;Thread Group 1-3;true;;0;0;injec1\r\n\"2008-09-21;10:57:15\";7;04 \/servlets-examples\/servlet\/SessionExample;200;Thread Group 1-3;true;;1270;7;injec2\r\n\"2008-09-21;10:57:14\";6;03 \/servlets-examples\/index.html;304;Thread Group 1-1;true;;0;0;injec1<\/pre>\n<p><strong>7\/ Nombre d&rsquo;injecteurs :<\/strong> Il n&rsquo;y a pas de limite au nombre d&rsquo;injecteurs que peut g\u00e9rer le contr\u00f4leur dans la th\u00e9orie. Dans la pratique, c&rsquo;est la performance du contr\u00f4leur ainsi que la bande passante disponible entre lui et les diff\u00e9rents injecteurs, qui le limite.<\/p>\n<p>.\/<\/p>\n<p><em>[Ajout 26\/03\/2009] :<\/em> un <a href=\"http:\/\/blog.milamberspace.net\/index.php\/2009\/03\/26\/jmeter-faire-un-test-distribue-avec-des-injecteurs-a-deux-cartes-reseaux-247.html\">billet<\/a> sur la mise en place d&rsquo;un test distribu\u00e9 avec des injecteurs ayant deux cartes r\u00e9seaux.<\/p>\n<p><em>[Mise \u00e0 jour 19\/04\/2010] <\/em>: Utilisation de captures de JMeter en fran\u00e7ais (version 2.4-dev), diff\u00e9rentes corrections sur le style d&rsquo;\u00e9criture et corrections de fautes d&rsquo;orthographe<\/p>\n","protected":false},"excerpt":{"rendered":"<p>JMeter permet de faire des tests de charge distribu\u00e9s sur plusieurs robots de tests. L&rsquo;id\u00e9e \u00e9tant de r\u00e9partir la charge de test de JMeter sur plusieurs robots de tests. Pourquoi ? Car, si on essaye de faire un tir de charge avec un tr\u00e8s grand nombre d&rsquo;unit\u00e9s (utilisateurs virtuels) sur une m\u00eame machine JMeter, on &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/jmeter-pages\/jmeter-test-de-charges-a-distance-distributed-testing\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">JMeter : Test de charge distribu\u00e9 (distributed testing)<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":85,"menu_order":5,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-95","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages\/95","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/comments?post=95"}],"version-history":[{"count":10,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages\/95\/revisions"}],"predecessor-version":[{"id":1196,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages\/95\/revisions\/1196"}],"up":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages\/85"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=95"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}