{"id":56,"date":"2007-12-21T00:27:58","date_gmt":"2007-12-21T00:27:58","guid":{"rendered":"http:\/\/blog.milamberspace.net\/index.php\/2007\/12\/21\/tir-de-charges-quand-les-problemes-ne-viennent-pas-du-serveur-dapplications-56.html"},"modified":"2009-07-12T07:24:56","modified_gmt":"2009-07-12T06:24:56","slug":"tir-de-charges-quand-les-problemes-ne-viennent-pas-du-serveur-dapplications","status":"publish","type":"post","link":"https:\/\/blog.milamberspace.net\/index.php\/2007\/12\/21\/tir-de-charges-quand-les-problemes-ne-viennent-pas-du-serveur-dapplications-56.html","title":{"rendered":"Tir de charges : Quand les probl\u00e8mes ne viennent pas du serveur d&rsquo;applications"},"content":{"rendered":"<p>Pour les \u00ab grands \u00bb tirs de charges dont l&rsquo;objectif est de tester une nouvelle application J2EE (ou JEE) avant sa mise en production, et afin d&rsquo;\u00e9viter les crashs le jour du lancement, on mobilise en g\u00e9n\u00e9ral une \u00e9quipe des diff\u00e9rents \u00ab corps de m\u00e9tier \u00bb informatiques.<\/p>\n<p style=\"\">On aura ainsi :<\/p>\n<ul>\n<li>les \u00ab tireurs \u00bb ceux qui vont faire le tir de charges avec un outil d\u00e9di\u00e9,<\/li>\n<li>les fonctionnels qui assistent les tireurs pour la sc\u00e9narisation du tir,<\/li>\n<li>les pr\u00e9parateurs de donn\u00e9es qui sont charg\u00e9s de fournir des donn\u00e9es aux injecteurs pour le tir,<\/li>\n<li>les gens du r\u00e9seau pour la surveillance du trafic et de la bande passante,<\/li>\n<li>les DBA pour la surveillance de l&rsquo;activit\u00e9 de la base de donn\u00e9es,<\/li>\n<li>les superviseurs des serveurs d&rsquo;applications pour monitorer l&rsquo;activit\u00e9 de l&rsquo;application,<\/li>\n<li>l&rsquo;\u00e9quipe de d\u00e9veloppement de l&rsquo;application qui croisent les doigts,<\/li>\n<li>et bien sur les chefs du fonctionnel et les chefs de la technique<\/li>\n<\/ul>\n<p style=\"\">Tout cela fait beaucoup de monde, on ajoutera en g\u00e9n\u00e9ral un responsable g\u00e9n\u00e9ral, charg\u00e9 entre autre de synchroniser toutes les actions, et donner le GO du lancement.<\/p>\n<p style=\"\">Une fois que le tir lanc\u00e9 et termin\u00e9, l&rsquo;exp\u00e9rience montre que c&rsquo;est en g\u00e9n\u00e9ral du cot\u00e9 du serveur d&rsquo;applications J2EE que les probl\u00e8mes sont visibles. O\u00f9 s&rsquo;ils ne sont pas visibles, on pense \u00e0 lui en premier car c&rsquo;est lui qui supporte l&rsquo;application. Alors quand c&rsquo;est vous le responsable de la supervision du cluster de serveurs d&rsquo;applications, tout ce beau monde se retourne vers vous pour avoir l&rsquo;explication, le comment du pourquoi, afin de comprendre la raison du non succ\u00e8s du tir de charge&#8230;<\/p>\n<p style=\"\">Pourtant vous avez fait une configuration des serveurs d&rsquo;applications clust\u00e9ris\u00e9s <em>aux petits oignons<\/em> :<\/p>\n<ul>\n<li>configuration de la taille minimum et maximum id\u00e9ale pour ce type d&rsquo;application<\/li>\n<li>modification des param\u00e8tres de JVM pour avoir notamment un fonctionnement du Garbage Collector en (quasi) parall\u00e8le (Concurrent Mark Sweep)<\/li>\n<li>r\u00e9glage des unit\u00e9s d&rsquo;ex\u00e9cution min et max, temps d&rsquo;inactivit\u00e9<\/li>\n<li>r\u00e9glage du pool de connexions \u00e0 la base de donn\u00e9es, avec activation du cache des requ\u00eates SQL pr\u00e9par\u00e9es<\/li>\n<li>r\u00e9glage du gestionnaire de sessions<\/li>\n<li>activation du monitoring,<\/li>\n<li>et d&rsquo;autres petits r\u00e9glages <em>de derri\u00e8re les fagots<\/em> : taille des files d&rsquo;attente TCP, nombre des requ\u00eates keep-alive, etc<\/li>\n<\/ul>\n<p style=\"\">Alors avec ce tunning <em>de folie<\/em>, difficile de comprendre pourquoi le serveur d&rsquo;applications souffre lors du tir de charges&#8230;<!--more--><\/p>\n<p style=\"\">Voici quelques cas, dont le probl\u00e8me est visible sur le serveur d&rsquo;applications, mais l&rsquo;origine est ailleurs :<\/p>\n<p style=\"\">1\/ le serveur d&rsquo;applications explose en OutOfMemory&#8230; C&rsquo;est en g\u00e9n\u00e9ral de la faute \u00e0 l&rsquo;application d\u00e9velopp\u00e9e ou de l&rsquo;utilisation du framework de persistence (genre Hibernate). Un exemple, c&rsquo;est le chargement de plusieurs fois un million d&rsquo;enregistrement dans la m\u00e9moire (car plusieurs centaines d&rsquo;utilisateurs simul\u00e9s et non plus les quelques d\u00e9veloppeurs et testeurs de la recette). On aura ainsi par exemple, 100 fois 10 Mo dans la m\u00e9moire soit au moins 1Go, donc des OutOfMemory si la taille maximum de la m\u00e9moire JVM est \u00e0 1024 Mo.<\/p>\n<p style=\"\">2\/ le nombre maximal des unit\u00e9s d&rsquo;ex\u00e9cution est atteint. C&rsquo;est en g\u00e9n\u00e9ral de la faute de l&rsquo;application d\u00e9velopp\u00e9e ou bien de la base de donn\u00e9es. En effet si le nombre max est atteint, mais que la CPU du serveur n&rsquo;est pas utilis\u00e9e, on peut en d\u00e9duire que les unit\u00e9s d&rsquo;ex\u00e9cution sont en attente de quelque chose&#8230; Et souvent c&rsquo;est de r\u00e9sultat de la base de donn\u00e9es. Soit cette derni\u00e8re est surcharg\u00e9e, soit il manque quelques index quelque part ou tout simplement il faut r\u00e9g\u00e9n\u00e9rer les statistiques de la base de donn\u00e9es.<\/p>\n<p style=\"\">3\/ Tout va bien sur le serveur d&rsquo;application, sur la base de donn\u00e9es, etc, mais l&rsquo;application est \u00ab lente \u00bb \u00e0 la r\u00e9ponse. Et bien l\u00e0 on peut se poser la question du r\u00e9seau. Il convient de s&rsquo;assurer que toutes les cartes r\u00e9seaux soient configur\u00e9es en 100 Mbits\/s Full Duplex (ou en gigabit), que les switchs d&rsquo;interconnexion \u00e9galement (port par port), et les routeurs si il y a lieu. Le mieux est de faire un test FTP (via un client classique vers le serveur, ou via JMeter). En effet, on verra que si l&rsquo;une des interfaces est en 10 Mbits\/s half duplex, par exemple celle du r\u00e9partiteur de charges, et l&rsquo;ensemble des serveurs derri\u00e8re ne seront pas surcharg\u00e9s, mais l&rsquo;application sera d\u00e9sesp\u00e9r\u00e9ment lente (goulot d&rsquo;\u00e9tranglement sur le lien r\u00e9seau). (pour l&rsquo;histoire, une interface r\u00e9seau peut basculer en 10 Mbits\/s HD tout simplement car l&rsquo;auto n\u00e9gociation de vitesse avec le switch a \u00e9chou\u00e9, et ainsi la carte prend la valeur la plus basse&#8230;<\/p>\n<p style=\"\">4\/ Les pages de l&rsquo;application affichent des erreurs 500&#8230; c&rsquo;est en g\u00e9n\u00e9ral un probl\u00e8me applicatif engendr\u00e9 par un probl\u00e8me externe. Par exemple l&rsquo;atteinte du nombre maximum autoris\u00e9 de fichiers ouverts pour un processus, ou bien la base de donn\u00e9es n&rsquo;accepte plus de nouvelles connexions&#8230;<\/p>\n<p style=\"\">Par ailleurs, on peut aussi avoir un cumul de ces probl\u00e8mes, et chaque tir de charges montrent un nouveau probl\u00e8me&#8230;<\/p>\n<p style=\"\">Mais quand tout est bien r\u00e9gl\u00e9, c&rsquo;est \u00e0 dire que l&rsquo;ensemble des composants de la solution est bien param\u00e9tr\u00e9, avec de la logique, et bien le tir de charges se passe \u00e0 merveille !<\/p>\n<p style=\"\"> .\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour les \u00ab grands \u00bb tirs de charges dont l&rsquo;objectif est de tester une nouvelle application J2EE (ou JEE) avant sa mise en production, et afin d&rsquo;\u00e9viter les crashs le jour du lancement, on mobilise en g\u00e9n\u00e9ral une \u00e9quipe des diff\u00e9rents \u00ab corps de m\u00e9tier \u00bb informatiques. On aura ainsi : les \u00ab tireurs \u00bb &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/2007\/12\/21\/tir-de-charges-quand-les-problemes-ne-viennent-pas-du-serveur-dapplications-56.html\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Tir de charges : Quand les probl\u00e8mes ne viennent pas du serveur d&rsquo;applications<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,36,57,34],"tags":[332,331,59],"class_list":["post-56","post","type-post","status-publish","format-standard","hentry","category-non-classe","category-performance","category-supervision","category-tests-de-charges","tag-performance","tag-tests-de-charges","tag-tir-de-charges"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/56","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"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=56"}],"version-history":[{"count":1,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/56\/revisions"}],"predecessor-version":[{"id":415,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/56\/revisions\/415"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/categories?post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/tags?post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}