<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; Performance</title> <atom:link href="http://blog.xebia.fr/tag/performance/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/11/08/revue-de-presse-xebia-2011-46/</link> <comments>http://blog.xebia.fr/2011/11/08/revue-de-presse-xebia-2011-46/#comments</comments> <pubDate>Tue, 08 Nov 2011 09:35:49 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Agile]]></category> <category><![CDATA[Cassandra]]></category> <category><![CDATA[EC2]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Harmony]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Xtend]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8982</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. Actualité éditeurs / SSII Apache Harmony: l&#8217;accord final Eclipse souffle ses 10 bougies! Et un nouveau langage, un! Agilité ﻿﻿Jeux agiles, c&#8217;est sérieux Le coin de la technique Benchmarking de Cassandra avec Amazon EC2 Evénements de notre communauté en France et à l&#8217;étranger Velocity [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="#RevuedePresseXebia-ApacheHarmony%3Al%27accordfinal">Apache Harmony: l&#8217;accord final</a></li><li><a
href="#RevuedePresseXebia-Eclipsesouffleses10bougies%21">Eclipse souffle ses 10 bougies!</a></li><li><a
href="#RevuedePresseXebia-Etunnouveaulangage%2Cun%21">Et un nouveau langage, un!</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="#RevuedePresseXebia-%EF%BB%BF%EF%BB%BFJeuxagiles%2Cc%27ests%C3%A9rieux">﻿﻿Jeux agiles, c&#8217;est sérieux</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="#RevuedePresseXebia-BenchmarkingdeCassandraavecAmazonEC2">Benchmarking de Cassandra avec Amazon EC2</a></li></ul><p><strong>Evénements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="#RevuedePresseXebia-VelocityEurope%C3%A0Berlinle8et9novembre">Velocity Europe à Berlin le 8 et 9 novembre</a></li></ul><h3><a
name="RevuedePresseXebia-Actualit%C3%A9%C3%A9diteurs%2FSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="RevuedePresseXebia-ApacheHarmony%3Al%27accordfinal"></a>Apache Harmony: l&#8217;accord final</h4><p><a
href="http://article.gmane.org/gmane.comp.java.classpath.devel/5521" rel="nofollow">Lancé en 2005</a>, le projet <a
href="http://harmony.apache.org/" rel="nofollow">Harmony</a> avait pour finalité de créer un JDK distribué sous licence Apache.</p><p>Le but était noble, mais le chemin, semé d&#8217;embûches: craignant sans doute que la concurrence d&#8217;une implémentation open-source et non-virale du JDK ne lui fasse de l&#8217;ombre, Sun a toujours opposé une fin de non-recevoir aux demandes adressées <a
href="http://www.apache.org/jcp/sunopenletter.html" rel="nofollow">depuis 2006</a> par la Fondation Apache afin d&#8217;obtenir un accès au <a
href="http://jcp.org/en/resources/tdk" rel="nofollow">TCK (Technology Compatibility Kit)</a>, le précieux sésame indispensable pour qu&#8217;Harmony puisse bénéficier du label Java.</p><p><a
href="http://blog.xebia.fr/2009/04/20/oracle-rachete-sun/" rel="nofollow">L&#8217;acquisition de Sun par Oracle en 2009</a> marqua un tournant dans le monde Java, mais n&#8217;a pas vraiment changé l&#8217;ostracisme dont souffrait Harmony.</p><p>2010 fut l&#8217;année des défections: <a
href="http://blog.xebia.fr/2010/10/12/revue-de-presse-xebia-180/#IBMrejointleprojetOpenJDK" rel="nofollow">IBM d&#8217;abord</a>, son sponsor principal, puis <a
href="http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/#ApplevacollaborerauprojetOpenJ" rel="nofollow">Apple</a>, ont tous deux décidé d&#8217;<a
href="http://blog.xebia.fr/2010/10/26/revue-de-presse-xebia-182/#LeJDKdApplecestfini" rel="nofollow">orienter leurs développements</a> vers le projet OpenJDK, l&#8217;implémentation open-source mise en avant par Oracle – mais cette fois-ci, il s&#8217;agit d&#8217;une licence GPL, licence bel et bien virale bien qu&#8217;adoucie par l&#8217;<a
href="http://en.wikipedia.org/wiki/GPL_linking_exception#The_classpath_exception" rel="nofollow">exception de classpath</a>. <a
href="http://blog.xebia.fr/2010/10/26/revue-de-presse-xebia-182/#DurififiauJCP" rel="nofollow">C&#8217;en fut trop</a> pour la Fondation Apache, qui <a
href="http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/#OracleetApachedeleaudanslegaz" rel="nofollow">menaça</a> d&#8217;abord de claquer la porte du JCP (<em>Java Community Process</em>) – puis, un mois plus tard, mit ses menaces <a
href="http://blog.xebia.fr/2010/12/14/revue-de-presse-xebia-189/#JavaCommunityProcesslaFondatio" rel="nofollow">à exécution</a>.</p><p>L&#8217;année 2011 démarre sous de meilleurs auspices: c&#8217;est la réconciliation, entre Oracle et la communauté Java d&#8217;une part; entre Oracle et ses partenaires d&#8217;autre part. Mais voilà que cette réconciliation se fit autour du projet OpenJDK, paré désormais de <a
href="http://blog.xebia.fr/2011/02/08/revue-de-presse-xebia-197/#Nouvellesrglesetgouvernancedup" rel="nofollow">nouveaux statuts fédérateurs</a> et du titre d&#8217;implémentation de référence de <a
href="http://blog.xebia.fr/2011/08/02/revue-de-presse-xebia-222/#Java" rel="nofollow">Java 7</a>. Le projet Harmony se trouva alors <a
href="http://blog.xebia.fr/2011/06/15/revue-de-presse-xebia-215/#LavenirdeJavasejouemaintenant" rel="nofollow">définitivement hors-jeu</a>. Google, le seul à avoir misé sur Harmony dont il équipa son système d&#8217;exploitation Android, <a
href="http://blog.xebia.fr/2010/08/17/revue-de-presse-xebia-172/#OraclepoursuitGooglepourviolat" rel="nofollow">en fait encore les frais</a>: le procès-fleuve qui l&#8217;oppose à Oracle est en effet <a
href="http://fosspatents.blogspot.com/2011/10/oracle-google-trial-postponed-beyond.html" rel="nofollow">loin de se terminer</a>.</p><p><a
href="http://blog.xebia.fr/2011/03/22/revue-de-presse-xebia-203/#ApacheHarmonyencoredescouacs" rel="nofollow">En présentant sa démission</a> en mars dernier, Tim Ellison, alors président du PMC (<em>Project Management Committee</em>) du projet Apache Harmony, avait déjà évoqué l&#8217;hypothèse funeste d&#8217;un déplacement du projet déjà moribond vers le <a
href="http://attic.apache.org/" rel="nofollow">mouroir des projets Apache</a>. Voilà qui est malheureusement chose faite aujourd&#8217;hui: le 29 octobre dernier un vote fut lancé, et le 3 novembre, la décision fut <a
href="http://markmail.org/thread/zmd22hkyukfbibh5" rel="nofollow">validée à 20 voix contre 2</a> : c&#8217;est donc officiellement <a
href="http://www.infoq.com/news/2011/11/apache-harmony-finale" rel="nofollow">la fin du projet Harmony</a>.</p><h4><a
name="RevuedePresseXebia-Eclipsesouffleses10bougies%21"></a>Eclipse souffle ses 10 bougies!</h4><p>Nos confrères d&#8217;InfoQ <a
href="http://www.infoq.com/news/2011/11/eclipse-10" rel="nofollow">n&#8217;ont pas manqué de célébrer cette première décennie du célèbre IDE</a> et retracent sa passionnante histoire, des débuts dans le giron d&#8217;IBM, en passant par la création de la Fondation Eclipse en 2004 puis par la &laquo;&nbsp;révolution&nbsp;&raquo; OSGi, et jusqu&#8217;au succès grandissant des rassemblements annuels EclipseCon en Amérique et en Europe. Il en ressort un constat admiratif: que l&#8217;on en soit adepte ou bien détracteur, Eclipse a bel et bien marqué de son empreinte le développement logiciel de ces dernières années.</p><h4><a
name="RevuedePresseXebia-Etunnouveaulangage%2Cun%21"></a>Et un nouveau langage, un!</h4><p>Et justement, parlons-en d&#8217;Eclipse! Edité par la Fondation Eclipse, <a
href="http://www.eclipse.org/Xtext/xtend/" rel="nofollow">Xtend</a> est un langage de programmation à typage statique basé sur Java (même système de typage, support complet des generics) mais qui améliore certains de ses concepts. Ce dernier n’a pas pour ambition de détrôner Java, mais d&#8217;en étendre les capacités là où il pèche. En effet, il diminue notamment les éléments de syntaxe inutiles et rend le code plus lisible et maintenable grâce à:</p><ul><li>L’inférence de types sur les déclarations de variables, les types de retour, les boucles <code>for</code> et les closures;</li><li>L’invocation des getters et setters en accédant directement à la propriété de l’objet;</li><li>Les point-virgules deviennent optionnels mais aussi les parenthèses pour les méthodes sans arguments. Le mot clé <code>return</code> devient lui aussi optionnel, la dernière expression de la méthode est implicitement considérée comme une valeur de retour.</li></ul><p>Techniquement, le code Xtend est compilé en Java et non en <em>bytecode</em> via une compilation incrémentale. De ce fait, le code compilé peut être aisément lu et compris par un développeur Java et être utilisé pour développer sous Android ou GWT par exemple.</p><p>Aussi, Xtend vient directement avec un support IDE poussé (Eclipse naturellement), qui offre une expérience de développement quasi similaire au développement en Java standard avec les IDE modernes (coloration syntaxique, navigation, compilation incrémentale, refactoring, etc.). Il est aussi possible de naviguer depuis du code Xtend vers du Java et vice et versa.</p><p>Enfin, preuve que Xtend n’a pas pour vocation de remplacer Java mais de le moderniser, le langage est capable de produire uniquement des classes. Pour le reste (interfaces, enums et annotations), il s’appuie sur sur le modèle éprouvé de Java.</p><p>Côté &laquo;&nbsp;sucres syntaxiques&nbsp;&raquo;, voici ceux proposé par le langage:</p><ul><li>Les <a
href="http://www.eclipse.org/Xtext/xtend/#closures" rel="nofollow">closures</a>, qui restent à ce jour l’une des fonctionnalités les plus attendues pour le langage Java. La documentation montre plusieurs manières de les mettre en oeuvre.</li><li>Un <a
href="http://www.eclipse.org/Xtext/xtend/#switchexpression" rel="nofollow">bloc <code>switch</code></a> amélioré: plus aucun risque d’enchaîner les <code>case</code> par oubli du mot-clé <code>break</code>, le <code>switch</code> à la mode Xtend n&#8217;évalue qu&#8217;un seul bloc <code>case</code> tout au plus. Il offre aussi la possibilité de lui passer presque n’importe quel type d’objet (exceptés le type primitif boolean et son wrapper). De plus, l’instruction <code>case</code> a été améliorée et peut désormais effectuer toute sorte de tests sur l’objet évalué, et non plus un simple test d’égalité :</li></ul><pre class="brush: java; title: ; notranslate">
switch myString {
 case myString.length &gt; 5 : 'a long string.'
 case 'foo' : 'It's a foo.'
 default : 'It's a short nonfoo string.'
}
</pre><p>Le langage offre aussi la possibilité de typer les instructions <code>case</code> en les préfixant par un type, dans le cas où l’objet passé en paramètre du <code>switch</code> serait étendu par d’autres classes. Dès lors, un opérateur <code>instanceof</code> est évalué et un cast implicite est effecuté pour accéder aux propriétés et méthodes de l’objet:</p><pre class="brush: java; title: ; notranslate">
var Object x = ...;
switch x {
 String case x.length() &gt; 0 : x.length()
 List&lt;?&gt; : x.size()
 default : 1
}
</pre><ul><li>Les <a
href="http://www.eclipse.org/Xtext/xtend/#templateexpression" rel="nofollow">Template expressions</a> qui permettent entre autres de déclarer une chaîne de caractères sur plusieurs lignes sans utiliser l’opérateur de concaténation, mais aussi de déclarer la chaîne avec des guillemets simples (<em>single quotes</em>) pour éviter de multiplier les caractères d’échappement. Cette fonctionnalité permet aussi de formater/indenter et de gérer les whitespaces des outputs aisément.</li><li>Les <a
href="http://www.eclipse.org/Xtext/xtend/#extensionmethods" rel="nofollow">Méthodes d’extension</a> : Xtend tient son nom de sa capacité à étendre les types via des méthodes d’extensions. Ces méthodes d&#8217;extension permettent d’ajouter des méthodes à des types existants sans les modifier.</li><li>Le <a
href="http://www.eclipse.org/Xtext/xtend/#multipledispatch" rel="nofollow">Multiple dispatch</a>: plus connu sous le nom de surcharge de méthode. Par défaut, Java ou même Xtend lient les méthodes surchargées à la compilation en se basant sur les types statiques des arguments. En déclarant le mot clé <code>dispatch</code> dans la signature de la méthode, le langage permet de définir un ensemble de méthodes surchargées basé sur les types des arguments au runtime.</li></ul><p>A noter que Xtend a été développé avec <a
href="http://www.eclipse.org/Xtext/" rel="nofollow">Xtext</a>, un framework pour le développement de <a
href="http://en.wikipedia.org/wiki/Domain_specific_language" rel="nofollow">Domain Specific Langages</a>, et est basé sur <a
href="http://www.eclipse.org/Xtext/#xbase" rel="nofollow">Xbase</a>, un ensemble prédéfini d&#8217;expressions qui peuvent être utilisées simplement pour développer n&#8217;importe quel langage avec Xtext.</p><h3><a
name="RevuedePresseXebia-Agilit%C3%A9"></a>Agilité</h3><h4><a
name="RevuedePresseXebia-%EF%BB%BF%EF%BB%BFJeuxagiles%2Cc%27ests%C3%A9rieux"></a>﻿﻿Jeux agiles, c&#8217;est sérieux</h4><p>Le buzz de cet automne ce sont les jeux agiles. Le mouvement <a
href="http://www.aubryconseil.com/post/L-engouement-pour-le-jeu-agile-et-innovation" rel="nofollow">prend de l&#8217;ampleur</a> et de plus en plus d&#8217;agilistes en France se tournent vers ce type d&#8217;ateliers ludiques mais véritablement efficaces pour leur travail au quotidien, des exemples récents <a
href="http://www.agilex.fr/2011/06/lamelioration-avec-un-speed-boat/" rel="nofollow">ici</a>, ou encore <a
href="http://www.qualitystreet.fr/2011/10/14/souviens-toi-du-futur-mon-ombre-et-moi-mettre-lexperience-utilisateur-au-coeur-du-jeu/" rel="nofollow">là</a> le démontrent. Chez Xebia nous utilisons aussi des <em><a
href="http://www.innovationgames.com" rel="nofollow">Innovation Games</a></em>(R) pour cadrer un projet, résoudre des situations de blocage chez nos clients, ou simplement animer une rétrospective de sprint. Mais les jeux sont aussi un moyen d&#8217;apprentissage puissant. Lors de son passage il y a 2 semaines pour une formation Kanban chez Xebia, David Anderson nous a fait jouer à <a
href="http://getkanban.com/" rel="nofollow">getKanban</a>, un jeu qui permet de simuler la mise en oeuvre d&#8217;une gestion de projet façon Kanban. Pendant le jeu, le formateur est là pour nous éclairer sur nos prises de décisions et répondre à nos interrogations, les stagiaires sont acteurs de leur acquisition de connaissance et l&#8217;erreur est possible, voire encouragée. Si vous êtes curieux de ces techniques et souhaitez participer à une mise en oeuvre, notez dans vos agendas la <a
href="http://www.meetup.com/frenchsug/events/37782582/" rel="nofollow">SCRUM Night</a> organisée par le French SUG le 7 Décembre et dont le programme sera composé uniquement d&#8217;ateliers ludiques et de jeux sérieux (l&#8217;agenda est en cours de construction). De son côté, Xebia présentera un sujet intitulé &laquo;&nbsp;Ludification du travail&nbsp;&raquo; le 10 Novembre prochain à l&#8217;EPITA lors de sa 24ème semaine de Conférences Technologiques.</p><h3><a
name="RevuedePresseXebia-Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="RevuedePresseXebia-BenchmarkingdeCassandraavecAmazonEC2"></a>Benchmarking de Cassandra avec Amazon EC2</h4><p>Les personnes qui étaient aux derniers ateliers <a
href="http://blog.xebia.fr/tech-event/" rel="nofollow">Xebia Tech Event</a> auront remarqué l&#8217;utilisation d&#8217;Amazon EC2 afin d&#8217;équiper les participants en environnements de travail virtuels. Le site Netflix propose un retour d&#8217;expérience de l&#8217;utilisation d&#8217;Amazon EC2 dans le cadre de tests de charge du système NoSQL d&#8217;Apache, Cassandra.<br
/> La charge est produite par l&#8217;outil de <b>stress test</b> distribué fourni avec Cassandra, sur des instances créées sur Amazon EC2.</p><p>Les outils développés par Netflix sont capables de créer, en une heure, un cluster comprenant :</p><ul><li>288 instances de tailles de type M1 Extra Large (m1.xl) réparties sur trois continents;</li><li>60 instances pour le client de stress test (type m2.4xl) sur un seul continent.</li></ul><p>Netflix précise qu&#8217;Amazon a mis environ 15 minutes pour créer les 348 instances! Les 45 autres minutes de préparation de l&#8217;infrastructure ont été prises par le temps de démarrage de Linux, les JVM des injecteurs, de Cassandra et la création de l&#8217;anneau du cluster.<br
/> Le test a duré 2 heures, pour un coût total de quelques centaines de dollars. L&#8217;avantage mis en avant par Netflix d&#8217;utiliser Amazon EC2 est de pouvoir réaliser des tests à très grande échelle, en quelques heures, sans aucun pré-requis matériel ou même impacter l&#8217;infrastructure de production. Ce test aurait certainement été plus lent et plus coûteux à organiser dans un datacenter privé d&#8217;entreprise.</p><p>Netflix a mesuré deux éléments :</p><ul><li>la persistance sur le disque pour l&#8217;écriture;</li><li>la performance de cache en mémoire pour la lecture.</li></ul><p>Les tests ont été lancés avec 48, puis 96, 144 et enfin 288 instances, avec 10,20,30 et 60 clients. Vous retrouverez dans <a
href="http://techblog.netflix.com/2011/11/benchmarking-cassandra-scalability-on.html" rel="nofollow">leur billet</a> les configurations matérielles utilisées lors de ces tests. Un tableau récapitulatif donne une estimation du coût du test de charge entre chaque tir.<br
/> Etant donné que les injecteurs de tests étaient sur un continent (Amérique), et les clusters sur trois (Europe, Asie, Amérique), 2/3 du trafic était intercontinental.</p><p>Chaque injecteur génère 20 000 requêtes par seconde. Le client est connecté à 3 noeuds Cassandra. Le principe du LOCAL QUORUM est ici utilisé (on attend la réponse de N/2 + 1 noeuds pour la confirmation). Le débit d&#8217;écriture a atteint 1,1 million d&#8217;écritures par seconde sur tout le système. Avec la réplication entre chaque noeud, on arrive à 3,3 million d&#8217;écritures par seconde.<br
/> Les mesures effectuées prouvent une montée en charge linéaire de 48 à 288 instances sans identifier de goulet d&#8217;étranglement. Les mesures unitaires de chaque noeud montrent une activité équivalente, preuve que le cluster distribue correctement la charge.</p><p>Cela démontre bien les nouvelles possibilités offertes par les systèmes d&#8217;infrastructure sur demande, et les défis que cela nous permet de relever.</p><h3><a
name="RevuedePresseXebia-Ev%C3%A9nementsdenotrecommunaut%C3%A9enFranceet%C3%A0l%27%C3%A9tranger"></a>Evénements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="RevuedePresseXebia-VelocityEurope%C3%A0Berlinle8et9novembre"></a>Velocity Europe à Berlin le 8 et 9 novembre</h4><p>Velocity Europe organise mardi 8 et mercredi 9 une conférence à Berlin sur le thème Web Performance et Operations.<br
/> Les <a
href="http://velocityconf.com/velocityeu/public/schedule/presentations" rel="nofollow">présentations</a> abordent de nombreux sujets passionnants.<br
/> Voici quelques unes des sessions sur les performances Web :</p><ul
type="square"><li><a
href="http://velocityconf.com/velocityeu/public/schedule/detail/21874" rel="nofollow">Know Your Engines: How to Make Your JavaScript Fast</a></li><li><a
href="http://velocityconf.com/velocityeu/public/schedule/detail/22069" rel="nofollow">Mobile UI Performance</a></li><li><a
href="http://velocityconf.com/velocityeu/public/schedule/detail/21823" rel="nofollow">Performance Automation 101</a></li></ul><p>Et sur les operations :</p><ul
type="square"><li><a
href="http://velocityconf.com/velocityeu/public/schedule/detail/21669" rel="nofollow">Be Fast Or Stay Behind &#8211; Building A Continuous Delivery Platform</a></li><li><a
href="http://velocityconf.com/velocityeu/public/schedule/detail/21708" rel="nofollow">HTTP Connection Management, From 10 Users To 100 million</a></li><li><a
href="http://velocityconf.com/velocityeu/public/schedule/detail/21637" rel="nofollow">NoSQL Performance In The Real World</a></li></ul><p>Des keynotes auront également lieu avec des speakers venus de Google, Amazon, Dynatrace, New Relic, etc.<br
/> Il est important de préciser que certaines présentations sont retransmises en <a
href="http://velocityconf.com/velocityeu/public/content/video" rel="nofollow">direct</a>, mais pas forcément celles qu&#8217;on voudrait <img
src="/confluence/images/icons/emoticons/sad.gif" height="20" width="20" align="absmiddle" alt="" border="0" /> .</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/08/revue-de-presse-xebia-2011-46/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>14 Avril &#8211; Soirée Monitoring Pragmatique d&#8217;Applications Java avec le Fondateur et CTO d&#8217;AppDynamics</title><link>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/</link> <comments>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/#comments</comments> <pubDate>Mon, 04 Apr 2011 11:48:30 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[AppDynamics]]></category> <category><![CDATA[java]]></category> <category><![CDATA[monitoring]]></category> <category><![CDATA[soirée]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7362</guid> <description><![CDATA[Cyrille Le Clerc et Pablo Lopez ont le plaisir de vous inviter Jeudi 14 Avril à 19h00 pour une &#171;&#160;Soirée Monitoring d&#8217;Applications Java avec le Fondateur et CTO d&#8217;AppDynamics&#160;&#187; . Nous avons profité du passage en Europe de Jyoti Bansal pour organiser avec les équipes d&#8217;AppDynamics un événement autour du monitoring de la &#171;&#160;vraie vie&#160;&#187; [...]]]></description> <content:encoded><![CDATA[<p>Cyrille Le Clerc et Pablo Lopez ont le plaisir de vous inviter Jeudi 14 Avril à 19h00 pour une <strong>&laquo;&nbsp;Soirée Monitoring d&#8217;Applications Java avec le Fondateur et CTO d&#8217;<a
title="AppDynamics" href="http://www.appdynamics.com/">AppDynamics</a>&nbsp;&raquo; </strong>.</p><p>Nous avons profité du passage en Europe de Jyoti Bansal pour organiser avec les équipes d&#8217;AppDynamics un événement autour du monitoring de la &laquo;&nbsp;<em>vraie vie</em>&nbsp;&raquo; .</p><p>A l&#8217;heure où l&#8217;architecture des applications d&#8217;entreprise devient de plus en plus complexe et distribuée, l&#8217;outillage dans le domaine du monitoring et du troubleshooting est un élément clé du système d&#8217;information. Notre objectif est que <strong>chacun en retire des idées immédiatement applicables et se forge une vision des problématiques que les systèmes de monitoring gèrent aujourd&#8217;hui et traiteront demain</strong>.</p><p>Après avoir consulté des Dev et des Ops des secteurs Telcos, Finance, Retail et Voyage, nous avons établi un programme reprenant des cas de notre vie quotidienne illustrés dans une application transactionnelle de eCommerce &laquo;&nbsp;réaliste&nbsp;&raquo; (1) que nous avons déployée en cluster sur 5 serveurs Amazon EC2., que nous soumettrons à diverses déconvenues courantes.</p><p><u><strong>Programme</strong></u></p><ul><li>15 minutes de <strong>présentation de la nouvelle génération de systèmes de monitoring d&#8217;applications</strong> Java (AppDynamics, dynaTrace, JXInsight)</li><li>60 minutes de démonstration de <strong>cas concrets de monitoring</strong> :<ul><li>Installation et configuration : mise en place du monitoring, auto découverte, déclaration d&#8217;indicateurs applicatifs, ajout de nouveaux serveurs au cluster,</li><li>Mise en place de <strong>tableaux de bord pour les équipes d&#8217;exploitation mais aussi de marketing et de développement</strong>,</li><li><strong>Monitoring durant les situations de crise</strong> : tableaux de bord &laquo;&nbsp;sur mesure&nbsp;&raquo; temporaires pour le management, le marketing et les équipes de troubleshooting,</li><li><strong>Monitoring au service du marketing</strong> : nous simulerons la mise en place de la sécurisation <a
title="3-D Secure" href="http://fr.wikipedia.org/wiki/3-D_Secure">3-D Secure</a> des paiements carte bleue en mode <a
title="AB Testing" href="http://en.wikipedia.org/wiki/A/B_testing">A/B Testing</a>,</li></ul></li><li><strong>La place dans l&#8217;infrastructure</strong> du système de monitoring : synergies et chevauchement avec les serveurs d&#8217;application, les systèmes de gestion de logs, etc</li><li><strong>La vision de Jyoti Bansal</strong> sur les tendances du monitoring d&#8217;application, ce à quoi nous devons nous attendre</li><li><strong>Les internes des systèmes de monitoring</strong> de nouvelles génération :<ul><li>&laquo;&nbsp;java agent embarqué&nbsp;&raquo; versus &laquo;&nbsp;agent autonome&nbsp;&raquo; versus &laquo;&nbsp;sans agent&nbsp;&raquo;,</li><li>les tableaux de bords, comment faciliter leur développement et leur utilisation à l&#8217;heure des <a
title="widgets Open Social" href="http://en.wikipedia.org/wiki/OpenSocial">widgets Open Social</a> ?</li><li>scalabilité des systèmes de monitoring à l&#8217;heure où le nombre de serveurs s&#8217;envole.</li></ul></li><li><strong>Coktail avec Jyoti et son équipe.</strong></li></ul><p>N&#8217;hésitez pas à nous proposer des questions ou des cas d&#8217;utilisation que nous ajouterons à nos préparations (cleclerc@xebia.fr et plopez@xebia.fr).</p><p><strong><u>Bio</u></strong></p><p><strong><a
title="Jyoti Bansal" href="http://www.linkedin.com/in/jyotibansal">Jyoti Bansal</a></strong> est fondateur, CEO et CTO d&#8217;AppDynamics. Il a auparavant été <em>Principal Architect</em> de Wily Introscope.</p><p><strong><a
title="AppDynamics" href="http://www.appdynamics.com/">AppDynamics</a></strong> a été fondé en 2008. Cette solution de monitoring est utilisée par des clients de la génération Internet aux infrastructures avant-gardistes comme NetFlix (1700 JVM sur Amazon EC2) mais aussi des clients plus traditionnels comme l&#8217;opérateur télécoms Swisscom, l&#8217;assureur Provinzial Insurance ou l&#8217;agence de voyage <a
title="Pricelinecom" href="http://www.priceline.com/">Priceline.com</a>.</p><p><strong><u>Organisation de la soirée</u></strong></p><p>La soirée se déroulera dans les locaux de Xebia au 156, boulevard Haussmann, 75008 Paris, à partir de 19h00.<br
/> Les inscriptions peuvent se faire :</p><ul><li>Par mail : <a
title="infoxebiatrainingfr" href="mailto:info@xebia-training.fr">info@xebia-training.fr</a></li><li>Par téléphone : 01.53.89.99.93</li></ul><p>(1) Nous avons retenu Spring Travel enrichie par les <a
title="Spring Payment Services" href="http://www.springsource.org/spring-payment">Spring Payment Services</a> et une brique &laquo;&nbsp;Anti Fraude&nbsp;&raquo; pour montrer les appels inter applications java. Le code source est disponible sous licence Apache <a
title="ici" href="http://xebia-france.googlecode.com/svn/training/production-ready-application/trunk/">ici</a> .</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/feed/</wfw:commentRss> <slash:comments>30</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/</link> <comments>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#comments</comments> <pubDate>Tue, 29 Jun 2010 05:50:07 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Gorm]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[MuleSoft]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[Tomcat Stats]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4971</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Outils Helios, Eclipse 3.6 SOA Tomcat Stats: administrer Tomcat depuis son iPhone Le coin de la technique Articles sur Groovy/Spring et Grails/Hibernate Un nouveau top 10 orienté performance Agilité Happy birthday Post-It ! Outils Helios, Eclipse 3.6 Après avoir épuisé les principales lunes de [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Outils</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HeliosEclipse">Helios, Eclipse 3.6</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#SortiedeTomcatStatsladministra">Tomcat Stats: administrer Tomcat depuis son iPhone</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#ArticlessurGroovySpringetGrail">Articles sur Groovy/Spring et Grails/Hibernate</a></li><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#Unnouveautoporientperformance">Un nouveau top 10 orienté performance</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HappybirthdayPostIt">Happy birthday Post-It !</a></li></ul><h3><a
name="Outils"></a>Outils</h3><h4><a
name="HeliosEclipse"></a>Helios, Eclipse 3.6</h4><p>Après avoir épuisé les principales lunes de Jupiter (Callisto, Europa, Ganymède, Galileo), voici venu le tour d&#8217;<a
title="Helios" href="http://www.eclipse.org/">Helios</a> pour incarner la version annuelle d&#8217;Eclipse. Cette livraison ne contient pas moins de 39 projets de la fondation Eclipse et les supports pour Windows7, Ubuntu 10.04 et PowerPC 64 bit ont été ajoutés.</p><p>Pour ceux qui aiment ajouter une multitude de plugins à leur Eclipse, au lieu de passer par le &laquo;&nbsp;Install new software&#8230;&nbsp;&raquo;, un lien direct vers le Marketplace permet très facilement d&#8217;installer ces plugins, un peu à la manière d&#8217;un plugin Firefox (tout comme le redémarrage obligatoire). L&#8217;ancienne méthode marche toujours pour les applications qui ne se trouvent pas sur le Marketplace. Et sûrement que les fans de DVCS (Distributed Version Control System) vont se précipiter sur le plugin EGit/JGit pour gérer ses sources sous Git, JGit étant l&#8217;implémentation <em>full java</em> utilisée également sur d&#8217;autre projets alors qu&#8217;EGit est sa surcouche pour Eclipse. Le résultat est assez prometteur.</p><p>En ce qui concerne uniquement Java, quelques petites améliorations ont été apportées:</p><ul><li>Les options du <em>formatter</em> acceptent plus de sémantiques comme les annotations, la déclaration de méthodes ou la possibilité de désactiver le <em>formatter</em> d&#8217;une partie du code (intéressant pour aider des merges compliqués).</li><li>Les fonctionnalités sur le breakpoint, comme l&#8217;ajout d&#8217;une condition ou le compteur, sont à présent directement accessibles dans le panel <em>breakpoints</em> et non plus en passant par un menu contextuel dans le code.</li></ul><p>La version 3.7 devrait surtout se concentrer sur Java7. Ian Bull d&#8217;Eclipse propose un <a
title="top ten" href="http://eclipsesource.com/blogs/2010/06/23/top-10-eclipse-helios-features/">top ten</a> intéressant pour faire le tour des fonctionnalités. Arrive en tête l&#8217;application Xtext qui permet d&#8217;écrire son propre DSL puis de générer à partir de celui-ci son propre éditeur Eclipse contenant la complétion et différents outils pour coder dans ce nouveau langage. Une affaire à suivre.</p><p>Mais malgré toutes les nouvelles fonctionnalités, Helios sera surtout scruté pour les multiples bugs corrigés, sa gourmandise en RAM et sa stabilité, ce que seule une pratique intensive pourra valider. Alors à vos souris !</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SortiedeTomcatStatsladministra"></a>Tomcat Stats: administrer Tomcat depuis son iPhone</h4><p><a
title="MuleSoft" href="http://www.mulesoft.com">MuleSoft</a>, plus connu pour son ESB Open Source <a
title="Mule" href="http://www.mulesoft.com/mule-esb-open-source-esb">Mule</a>, a récemment annoncé la sortie de <a
title="Tomcat Stats" href="http://www.mulesoft.com/mulesoft-introduces-iphone-app-apache-tomcat">Tomcat Stats</a>, la première application de monitoring Tomcat pour iPhone. Cette application gratuite vient enrichir l&#8217;<a
title="offre de support" href="http://www.mulesoft.com/free-apache-tomcat-support">offre de support</a> également gratuite, proposée par MuleSoft depuis maintenant presque une année. L&#8217;application permet à un administrateur de gérer à distance plusieurs instances de Tomcat, qu&#8217;elles soient installées au sein de l&#8217;infrastructure propre de l&#8217;entreprise ou dans le Cloud. L&#8217;ensemble des informations critiques des serveurs administrés pourra alors être consulté depuis l&#8217;application, notamment l&#8217;utilisation mémoire, les statistiques sur le traffic Web, ainsi que le statut du serveur.</p><p>Pour télécharger l&#8217;application, rien de plus simple il suffit de se rendre sur l&#8217;App Store, directement depuis son mobile, ou sur iTunes à l&#8217;adresse suivante : <a
title="Tomcat Stats By MuleSoft Inc" href="http://itunes.apple.com/us/app/tomcat-stats/id376646649?mt=8">Tomcat Stats By MuleSoft Inc.</a></p><p>Bien qu&#8217;un peu gadget, et pas vraiment indispensable, cette application iPhone offrira toujours aux administrateurs la possibilité de prolonger leur pause café sans avoir à culpabiliser.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="ArticlessurGroovySpringetGrail"></a>Articles sur Groovy/Spring et Grails/Hibernate</h4><p><a
title="IBM developerWorks" href="http://www.ibm.com/developerworks/">IBM developerWorks</a> nous a récemment gratifié d&#8217;un  article en 2 parties intitulé &laquo;&nbsp;GroovierSpring&nbsp;&raquo;.  Dans <a
title="la premire partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring1.html">la première partie</a>, nous  apprenons à définir des beans Spring en Groovy. Quatre méthodes  sont à notre disposition:</p><ul><li>Utilisation de classes Groovy compilées en .class normaux</li><li>Utilisation de classes Groovy directement sous forme de .groovy</li><li>Utilisation de  scripts Groovy en ligne,  écrits dans la configuration Spring</li><li>Utilisation  de <a
title="Bean Builder" href="http://www.grails.org/Spring+Bean+Builder">Bean Builder</a> de Grails</li></ul><p>Cette  dernière possibilité permet de créer des beans dynamiquement, à  partir de code Groovy. Cela  sous entend que l&#8217;on peut, par le code, adapter les beans obtenus selon le contexte, les créer en utilisant des boucles, de la  logique&#8230; C&#8217;est d&#8217;ailleurs une solution utilisée dans Grails.</p><p>Une  fois les beans correctement  définis, nous pouvons les utiliser comme n&#8217;importe quel bean Java  défini plus classiquement. Le fait que les beans soient à  l&#8217;origine en Groovy est  complètement transparent à l&#8217;application.<br
/> <a
title="La seconde partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring2.html">La seconde partie</a> de l&#8217;article  va plus loin en explorant le rechargement à chaud des beans Groovy. C&#8217;est une plus-value  importante: qui n&#8217;a jamais rêvé de pouvoir changer facilement certains  bouts de code soumis aux désirs changeants des clients (ou à des bugs récurrents  !) ? De plus, l&#8217;article propose une implémentation permettant de  stocker son code Groovy en  base de donnée, car il n&#8217;est pas toujours évident d&#8217;accéder au système  de fichier des applications en production. C&#8217;est une idée assez peu  conventionnelle ! D&#8217;ailleurs, le paragraphe de fin, intitulé &laquo;&nbsp;When Groovy scripts go bad&nbsp;&raquo;,  constitue une mise en garde pour ne pas abuser de ces possibilités, et  être conscient des problèmes de sécurité soulevés.</p><p>Tant que nous  somme dans le monde de Groovy,  il nous semble intéressant de vous indiquer un article <a
title="du blog de SpringSource" href="http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/">du blog de SpringSource</a> qui s&#8217;intitule &laquo;&nbsp;GORM Gotchas (Part 1)&nbsp;&raquo;. Il pointe du  doigt des comportements de GORM (la couche de  persistance de Grails basée sur Hibernate) pouvant sembler bizarres. Les habitués d&#8217;Hibernate n&#8217;apprendront pas grand choses, mais l&#8217;article éclairera sans doutes  ceux qui, attirés par la simplicité de Grails, se sont  mis à l&#8217;utiliser sans expérience préalable d&#8217;Hibernate. Ils comprendront ainsi pourquoi leurs objets ne sont pas toujours sauvegardés immédiatement malgré un appel à &laquo;&nbsp;save()&nbsp;&raquo;, et pourquoi ils le sont parfois en l&#8217;absence d&#8217;appel à cette même méthode. <a
title="Un autre article" href="http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/">Un autre article</a> traitant de Grails et Hibernate nous vient de Ted Naleid.  Celui-ci explique comment il a pu améliorer les performances de son batch en <em>flushant</em> la session Hibernate et en vidant une Map de validation utilisée par Grails en interne. Ces 2 opérations exécutées régulièrement au cours du batch lui ont permis de démultiplier les performances. Grails s&#8217;appuie sur Hibernate, et il est parfois bon de se remémorer le fonctionnement de celui-ci pour expliquer et remédier à des problèmes observés coté Grails !</p><h4><a
name="Unnouveautoporientperformance"></a>Un nouveau top 10 orienté performance</h4><p>Ce top10 se trouve <a
title="sur le blog de lditeur Dynatrace" href="http://blog.dynatrace.com/2010/06/15/top-10-performance-problems-taken-from-zappos-monster-and-co/">sur le blog de l&#8217;éditeur Dynatrace</a>. A travers ce que ses consultants ont pu voir chez leur client (on parle donc d&#8217;un top 10 sélectif, chez des clients qui avaient conscience d&#8217;avoir des problèmes et qui pouvaient se permettre de les diagnostiquer avec un outil comme Dynatrace), il dresse un panorama qu&#8217;il est bon de toujours avoir à l&#8217;esprit durant nos développements. Nous nous sommes permis de le compléter avec nos propres retours d&#8217;expérience.</p><ul><li>une base de données trop sollicitée, ce qui inclut des données requetées trop grandes, ou requetées plusieurs fois, ou encore de trop nombreuses requêtes pour rapatrier une seule donnée (problème des mauvais usage des ORM).</li><li>une mauvaise programmation concurrente, avec un excès de synchronisation.</li><li>un manque de compréhension des appels <em>remote</em> et donc un trop grand nombre d&#8217;appels.</li><li>un mauvais usage des frameworks de mapping objet &#8211; relationnel. Ce point est largement répandu chez nos clients, en couvrant un large spectre, du simple problème de paramétrage à l&#8217;utilisation la plus hors de propos de la librairie.</li><li>l&#8217;existence de fuite mémoire (mais pourquoi ce point n&#8217;a t&#8217;il pas été placé en premier ?)</li><li>une librairie tierce coupable de mauvaises performance. Avec la multiplication des composants dans nos applications, le risque d&#8217;introduire des librairies moins robustes et moins performantes existe. Nous avons toujours trouvé étonnant de voir partir en production certains projets basés sur des librairies en béta&#8230;</li><li>une mauvaise utilisation des ressources machine (CPU, I/O&#8230;). Un traitement prend 50 % de CPU pendant 2 ms. Pas de quoi fouetter un chat ? Multipliez le par 1000 utilisateurs, une consommation mémoire excessive entraînant de fréquents GC, et nous en reparlerons.</li><li>des sites web trop chargés. La bande passante ne cesse d&#8217;augmenter, mais ce n&#8217;est pas une raison pour surcharger vos frontaux avec de nombreuses images trop volumineuses, des appels AJAX incessants, en ignorant joyeusement les stratégies de cache navigateur et/ou serveur.</li><li>une mauvaise gestion de caching des objets en mémoire. Surchargez votre mémoire pour alléger votre base, et c&#8217;est le Garbage Collector qui vous rappellera à l&#8217;ordre.</li><li>la sérialisation coute cher. Attention donc, si vous multipliez les appels RMI ou SOAP, à ne pas sérialiser trop d&#8217;objets, ou des objets trop volumineux.</li></ul><p>Nous avons échangé les places du point n°10 et du point bonus. Le point n°10, même si il a une réalité tangible, nous paraissait un peu trop marketing (mais c&#8217;est en partie la raison de vivre d&#8217;un blog éditeur) et nous préférons le déplacer en bonus :</p><ul><li>le problème intermittent, invisible. C&#8217;est celui dont il faut se prémunir en multipliant les tests (fonctionnels, de charge) ou en étant idéalement outillé.</li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="HappybirthdayPostIt"></a>Happy birthday Post-It !</h4><p>Et pour conclure cette revue de presse, nous ne résistons pas à l&#8217;envie de partager avec vous cette nouvelle d&#8217;importance: les Post-It, ces fameuses petites notes collantes multicolores, <a
title="fêtent leurs 30 ans" href="http://www.journaldunet.com/economie/industrie/fabrication-de-post-it/">fêtent leurs 30 ans</a>. Rappelons que l&#8217;utilisation de Post-It est devenue partie intégrante de la pratique de Scrum. Comment mettre à jour facilement la liste des tâche d&#8217;un Sprint sans Post-It ?! Alors pour leur rendre hommage, <a
title="regardons quelques photos" href="http://www.touilleur-express.fr/2009/03/30/3-exemples-de-tableaux-scrum/">regardons quelques photos</a> ou encore cette <a
title="magnifique vido de laquelle ils sont les acteurs majeurs" href="http://vimeo.com/4587652">magnifique vidéo de laquelle ils sont les acteurs majeurs</a>. Bon anniversaire les p&#8217;tits gars !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/</link> <comments>http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#comments</comments> <pubDate>Tue, 01 Jun 2010 05:36:54 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Ehcache]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Oracle]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Terracotta]]></category> <category><![CDATA[Threads]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4836</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Où sont passées les stars de Sun ? Le coin de la technique Nouvelle version pour EhCache jucProfiler Maven Enforcer Actualité éditeurs / SSII Où sont passées les stars de Sun ? Un an après le rachat de Sun par [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#OsontpasseslesstarsdeSun">Où sont passées les stars de Sun ?</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#NouvelleversionpourEhCache">Nouvelle version pour EhCache</a></li><li><a
href="http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#jucProfiler">jucProfiler</a></li><li><a
href="http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#MavenEnforcer">Maven Enforcer</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="OsontpasseslesstarsdeSun"></a>Où sont passées les stars de Sun ?</h4><p>Un an après le rachat de Sun par Oracle, qu&#8217;est il advenu des stars de Sun ? La réponse est plutôt radicale : elles se sont envolées vers des cieux plus cléments. Avant d&#8217;entrer dans plus de détails, on peut d&#8217;abord noter que la différence &laquo;&nbsp;génétique&nbsp;&raquo; entre Sun, moteur d&#8217;innovation proche d&#8217;une entreprise de recherche, et Oracle, éditeur logiciel centré sur le business, augurait de nombreux chocs culturels.<br
/> Certains ont été violents, et la rupture a été amère. C&#8217;est le cas pour James Gosling, qui a été le plus prolixe (<a
href="http://blogs.sun.com/jag/entry/javame_is_not_dead" title="sur son blog" >sur son blog</a>) au sujet de son départ, évoquant une démission qui l&#8217;a occupé à plein temps pendant plusieurs semaines. De manière comparable, Tim Bray a rejoint Google, en ne détaillant pas les raisons qui l&#8217;ont poussées à quitter Oracle mais en laissant transparaître une certaine amertume.<br
/> D&#8217;autres sont partis car Oracle ne leur donnait pas de garanties sur leur technologie : Charles Nutter et Thomas Enebo ont rejoint <a
href="http://www.engineyard.com/" title="Engine Yard" >Engine Yard</a> pour continuer à développer JRuby. Kohsuke Kawaguchi a monté sa société pour porter Hudson.<br
/> Enfin, certains n&#8217;ont pas reçu d&#8217;offre d&#8217;Oracle. C&#8217;était attendu pour Jonathan Schwartz et Scott McNealy qui étaient quasiment condamnés par leur position au sommet de la hiérarchie de Sun. C&#8217;était plus surprenant pour Simon Phipps, responsable de l&#8217;open source, qui occupe un poste équivalent chez <a
href="http://forgerock.com/" title="ForgeRock" >ForgeRock</a> (qui entend développer -OpenSSO- pardon OpenAM, le nom OpenSSO étant déposé).<br
/> Alors, cette vague de départs sera t&#8217;elle préjudiciable à Oracle ? Sur le plan de l&#8217;innovation, certainement. Sur un plan purement business, on peut en douter, aucun des &laquo;&nbsp;sous&nbsp;&raquo;-produits (sans que nous portions de jugement de qualité) de Sun n&#8217;étant stratégiques pour la firme de Larry Ellison. D&#8217;ailleurs, si l&#8217;on jette rapidement un œil à ceux qui sont restés, on note John Fowler, Cindy Reese, et Mike Splain, tous trois impliqués dans la branche hardware. De là à dire que c&#8217;était la principale visée d&#8217;Oracle (avec la JVM)&#8230; &laquo;&nbsp;Malheureusement&nbsp;&raquo;, Oracle a aussi hérité de bébés bien encombrants, comme les JUG (voir <a
href="http://blog.loof.fr/2010/05/oracle-et-les-jugs.html" title="larticle de Nicolas de Loof  ce sujet" >l&#8217;article de Nicolas de Loof à ce sujet</a>).</p><p><a
href="http://www.infoworld.com/d/the-industry-standard/suns-stars-where-are-they-now-and-why-did-they-leave-765?source=footer" title="Via infoWorld" >Via infoWorld</a></p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="NouvelleversionpourEhCache"></a>Nouvelle version pour EhCache</h4><p>Terracotta maintient le rythme des évolutions Ehcache, en nous livrant cette nouvelle version numérotée 2.1.<br
/> Après un mois de maturation en bêta, l&#8217;éditeur officialise donc la dernière mouture stable de son célèbre cache.<br
/> C&#8217;est surtout l&#8217;occasion d&#8217;étoffer son offre produit en ajoutant notamment un plugin de monitoring permettant de surveiller en temps réel les métriques essentielles du cache. Grâce à lui, les développeurs pourront affiner la configuration du cache, par contre pour l&#8217;utiliser en production il vous faudra une version payante.<br
/> Le support Websphere a bénéficié lui aussi d&#8217;améliorations pour garantir à ses utilisateurs l&#8217;accès à toutes les fonctionnalités du produit.<br
/> Cela inclut tout naturellement, le support la solution Terracotta Web Session, un cluster de session web à haute disponibilité, déjà disponible pour Weblogic, JBoss, Tomcat et Jetty.<br
/> L&#8217;utilisation de JTA a aussi été largement améliorée, les configurations standalone et Hibernate sont à présent supportées, ce qui permet de couvrir l&#8217;intégralité des stratégies Hibernate.<br
/> En dernier point d&#8217;amélioration, le développement a été axé vers de meilleures performances et un paramétrage fin des SLAs. C&#8217;est par exemple la fonctionnalité <a
href="http://ehcache.org/documentation/non_stop_cache.html" title="NonStopCache" >NonStopCache</a> qui permet de contrôler le timeout des opérations sur le cache, voire même de passer automatiquement d&#8217;un cache sur disque à un cache en mémoire vive en cas d&#8217;indisponibilité. Par ailleurs le <a
href="http://ehcache.org/documentation/unlocked_reads_view.html" title="UnlockedReadsView" >UnlockedReadsView</a> offre une vue non consistante du cache. Dans les faits, elle ignore les verrous d&#8217;écriture et ne pose pas de verrou de lecture, l&#8217;équivalent d&#8217;un READ_UNCOMITTED avec des performances très largement accrues.</p><ul><li><a
href="http://www.terracotta.org/news/pr/2010-05-25-ehcache-2.1" title="Lannonce Terracotta" >L&#8217;annonce Terracotta</a></li><li><a
href="http://dsoguy.blogspot.com/2010/04/ehcache-21-beta-lots-of-stuff-still.html" title="Un article plus pouss par Steve Harris" >Un article plus poussé par Steve Harris</a></li><li><a
href="http://ehcache.org/" title="La page daccueil du projet" >La page d&#8217;accueil du projet</a></li></ul><h4><a
name="jucProfiler"></a>jucProfiler</h4><p>Il y a quelques années, <a
href="http://blog.xebia.fr/2007/11/29/chroniques-de-la-performance-a-propos-de-contentions/" title="certains se sont arrachés les cheveux pour détecter les contentions dans un programme massivement parallélisé" >certains se sont arrachés les cheveux pour détecter les contentions dans un programme massivement parallélisé</a>. Malheureusement pour les amoureux des nœuds au cerveau, les développeurs de chez IBM se sont penchés sur le sujet et proposent un outil pour diagnostiquer ce type de problèmes : <a
href="http://aminoprj.blogspot.com/2010/01/jucprofiler-javautilconcurrent-locks.html" title="jucProfiler" >jucProfiler</a> (pour java.util.concurrent). Le principe est simple : instrumenter le bytecode de certaines classes de <code>java.util.concurrent.locks</code> et tracer les appels à <code>java.util.concurrent.locks.LockSupport</code> et <code>java.util.concurrent.locks.AbstractQueuedSynchronizer</code>.<br
/> L&#8217;outil génère ensuite un rapport permettant d&#8217;identifier deux types de problèmes sur les thread, consomateurs de temps :</p><ul><li>du temps de contention : un verrou est réservé par un autre thread.</li><li>du temps d&#8217;attente : le thread est en <code>wait</code>.</li></ul><p>Et cerise sur le gâteau, pour ceux d&#8217;entre vous lassés de devoir diagnostiquer des problèmes de performances en analysant des fichiers texte de trois pieds de long, un éditeur graphique est même fourni.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/06/juc.jpg" border="0" alt="" /></div><p>Comme le dit justement la conclusion de l&#8217;article, la généralisation de la programmation parallèle nous oblige à nous armer de meilleurs outils. Il semblerait que jucProfiler en fasse partie. Si l&#8217;un de nos lecteurs a eu l&#8217;opportunité de l&#8217;utiliser en condition réelle, nous sommes bien sûr preneurs d&#8217;un retour d&#8217;expérience.</p><h4><a
name="MavenEnforcer"></a>Maven Enforcer</h4><p>Sonatype a récemment mis en ligne une présentation en deux parties (<a
href="http://www.sonatype.com/people/2010/05/sonatypes-maven-training-on-youtube/" title="ici" >ici</a> et <a
href="http://www.sonatype.com/people/2010/05/maven-enforcer-plugin-tutorial-part-2/" title="là" >là</a>) sur le plugin <a
href="http://maven.apache.org/enforcer/index.html" title="Maven Enforcer" >Maven Enforcer</a>.<br
/> Ce plugin permet de définir des règles afin d&#8217;obtenir un build Maven reproductible sur différents environnements. Il permet entre autres :</p><ul><li>de spécifier une version ou une plage de versions de Maven,</li><li>de spécifier une version ou une plage de versions du JDK,</li><li>de spécifier une architecture (OS/CPU) sur laquelle s&#8217;exécute le build,</li><li>de s&#8217;assurer que le projet ne contient pas de dépendances (transitives) vers des versions non explicites (SNAPSHOT, LATEST ou RELEASE),</li><li>de s&#8217;assurer que le projet n&#8217;utilise pas de plugins ayant une version non explicite (SNAPSHOT, LATEST ou RELEASE),</li><li>de bannir des dépendances,</li><li>de définir ses propres règles (en Java ou avec un script BeanShell).</li></ul><p>La présentation met l&#8217;accent sur la nécessité de fixer les versions des dépendances et des plugins afin d&#8217;éviter qu&#8217;un build ne devienne instable suite à la publication d&#8217;une nouvelle version d&#8217;une dépendance ou d&#8217;un plugin. Il préconise notamment l&#8217;emploi de Maven en version supérieure à 2.0.9 pour laquelle le POM parent n&#8217;utilise plus que des versions explicites des plugins.</p><p>Elle recommande aussi de spécifier une version du JDK (1.5.x par exemple) afin d&#8217;éviter différentes problématiques telles que l&#8217;utilisation d&#8217;API non supportées ou la différence de comportement de certains plugins Maven en fonction de la version de la JVM sur laquelle ils sont exécutés.</p><p>Une fois les bonnes pratiques exposées, la configuration des différentes règles permettant d&#8217;effectuer les vérifications est abordée.</p><p>Le plugin Maven Enforcer est encore peu connu mais gagnerait à être utilisé pour éviter des problèmes récurrents. Cette présentation est un bon point de départ pour aborder sa mise en place.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Kirk Pepperdine : Java Performance Tuning</title><link>http://blog.xebia.fr/2010/05/04/kirk-pepperdine-java-performance-tuning-2/</link> <comments>http://blog.xebia.fr/2010/05/04/kirk-pepperdine-java-performance-tuning-2/#comments</comments> <pubDate>Tue, 04 May 2010 09:24:40 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[optimisation]]></category> <category><![CDATA[tuning]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4546</guid> <description><![CDATA[Xebia-training a le plaisir d’accueillir Kirk Pepperdine, un référent de la communauté Java EE pour une formation d’optimisation des performances Java EE (Java performance tuning) les 7, 8, 9 et 10 juin dans nos locaux. Cette formation approfondie de 4 jours vous permettra d’obtenir les compétences nécessaires pour optimiser la performance de vos applications Java. [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://training.xebia.fr">Xebia-training</a> a le plaisir d’accueillir Kirk Pepperdine, un référent de la communauté Java EE pour une formation d’optimisation des performances Java EE <em>(Java performance tuning)</em> les 7, 8, 9 et 10 juin dans nos locaux.</p><p>Cette formation approfondie de 4 jours vous permettra d’obtenir les compétences nécessaires pour optimiser la performance de vos applications Java. Vous aborderez pendant cette formation tous les aspects de la performance : l’outillage nécessaire, les méthodologies à appliquer, les concepts d’architecture sous jacents à la performance, les meilleures pratiques, le benchmarking et la gestion de mémoire.</p><p>A l’issue de cette formation, vous serez en mesure :</p><ul><li>D’identifier rapidement et régler les problèmes de performance de vos applications.</li><li>D’identifier et résoudre des problèmes de fuite mémoire en quelques heures.</li><li>D’isoler des problèmes classiques et d’éviter de s’engager dans des plans d’actions couteux et inefficaces.</li><li>D’identifier des problèmes de performance avant qu’ils ne deviennent critiques pour les applications.</li></ul><p>Les stagiaires bénéficieront des Tips de Kirk Pepperdine, référence reconnue dans le monde de l’optimisation de performance objet.<br
/> Kirk Pepperdine dispose de 15 ans d’expérience dans les technologies OO et l’optimisation de la performance. Figure emblématique du monde Java et élu <em>&laquo;&nbsp;Champion JAVA&nbsp;&raquo;</em> en 2005, Kirk est reconnu comme le référent de l’optimisation de performance Java.<br
/> Vous pouvez consulter le programme complet de cette formation en consultant notre site : <a
href="http://training.xebia.fr/formation-java-performance-tuning-kirk-pepperdine/">http://training.xebia.fr/formation-java-performance-tuning-kirk-pepperdine/</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/05/04/kirk-pepperdine-java-performance-tuning-2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Catalogue Xebia Training</title><link>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/</link> <comments>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/#comments</comments> <pubDate>Wed, 24 Feb 2010 12:32:34 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[eXtrem Programming]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[XP]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4085</guid> <description><![CDATA[Nous sommes heureux de vous proposer le nouveau catalogue de formation Xebia Traning : Le catalogue numérique. Le catalogue PDF. Xebia Training se positionne logiquement dans la continuité de Xebia, tant sur la qualité de son offre de formation technique que méthodologique (méthodes agiles), en proposant des formations haut de gamme animées uniquement par les [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://flipflashpages.uniflip.com/2/26742/50371/pub/"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/xebia-training.png" style="margin: 1em 1em 1em 1em; float: right;" /></a><br
/> Nous sommes heureux de vous proposer le nouveau <a
href="http://flipflashpages.uniflip.com/2/26742/50371/pub/">catalogue de formation Xebia Traning</a> :</p><ul><li>Le <a
href="http://flipflashpages.uniflip.com/2/26742/50371/pub/">catalogue numérique</a>.</li><li>Le <a
href="http://training.xebia.fr/wp-content/uploads/catalogue%20des%20formations%202010-xebia-training.pdf">catalogue PDF</a>.</li></ul><p><a
href="http://training.xebia.fr">Xebia Training</a> se positionne logiquement dans la continuité de Xebia, tant sur la qualité de son offre de formation technique que méthodologique (méthodes agiles), en proposant des formations haut de gamme animées uniquement par les référents de leur domaine.</p><p>Avec pour principe premier le refus de tout compromis sur la qualité du formateur et du contenu, <a
href="http://training.xebia.fr">Xebia Training</a> fait systématiquement intervenir des acteurs de références dans leurs domaines respectifs.</p><p>Nos formations, savant équilibre entre théorie et travaux pratiques, sont destinées à un large public soucieux d’acquérir les meilleures pratiques de notre industrie.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Performance, les Xebians jouent les démineurs</title><link>http://blog.xebia.fr/2010/01/27/performance-les-xebians-jouent-les-demineurs/</link> <comments>http://blog.xebia.fr/2010/01/27/performance-les-xebians-jouent-les-demineurs/#comments</comments> <pubDate>Wed, 27 Jan 2010 17:19:40 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[debug]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[log4j]]></category> <category><![CDATA[VisualVM]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3883</guid> <description><![CDATA[Le premier XKE dans nos nouveaux locaux a donné lieu à de bien curieuses scènes : des bisounours ont hué des poubelles sous le regard moqueur de pokemons ! Et, non, les cartons de déménagement ne nous sont pas tombés sur la tête. Ce n&#8217;était là que quelques uns des noms choisis par des équipes [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2010/01/picto.png" alt="" /></p><p>Le premier <a
title="XKE" href="http://blog.xebia.fr/2008/03/03/un-xke-chez-xebia/">XKE</a> <a
title="dans nos nouveaux locaux" href="http://blog.xebia.fr/2010/01/15/2010-xebia-fait-peau-neuve/">dans nos nouveaux locaux</a> a donné lieu à de bien curieuses scènes : des <em>bisounours</em> ont hué des <em>poubelles</em> sous le regard moqueur de <em>pokemons</em> ! Et, non, les cartons de déménagement ne nous sont pas tombés sur la tête. Ce n&#8217;était là que quelques uns des noms choisis par des équipes de 3 à 4 consultants, qui se sont mesurés dans un concours de tuning de performance, sur une application Java EE standard, buggée (<em>volontairement</em>, pour une fois) par les maîtres de cérémonie, <a
title="Guillaume Bodet" href="http://blog.xebia.fr/author/gbodet/">Guillaume Bodet</a> et <a
title="Cyrille Le Clerc" href="http://blog.xebia.fr/author/cleclerc/">Cyrille Le Clerc</a>. Tous les participants se sont vus remettre une VM, contenant un Tomcat, une application (<em>PetClinic</em> de Spring, revue et &laquo;&nbsp;corrigée&nbsp;&raquo;) et des scripts de performance JMeter. Le code source n&#8217;a, dans un premier temps, pas été fourni.</p><p>Pour tous, un seul but : faire diminuer les temps de réponses de l&#8217;application.</p><p>Les règles étaient les suivantes :</p><ul><li>Un bug n&#8217;est considéré comme trouvé que lorsqu&#8217;il a été identifié, qu&#8217;un correctif a été proposé et que la preuve est faite que ce correctif permet d&#8217;améliorer significativement les temps de réponse.</li><li>Il existe trois niveaux de difficulté, allant du bug évident à l&#8217;anomalie la plus fourbe.</li><li>Le choix des outils est libre.</li></ul><p>A vos marques&#8230; Prêts ? Débuggez !</p><h3><a
name="Prambule"></a>Préambule</h3><p>L&#8217;un des buts de ce Xke était d&#8217;être très didactique, dans les méthodes de recherche et dans l&#8217;utilisation des outils. Les bombes placées dans le code permettaient de réaliser une progression linéaire (dans la difficulté comme dans les gains attendus). Cette progression est retranscrite dans cet article et ceux qui vont suivre.</p><p>Cependant, pour différentes raisons que nous aurons l&#8217;occasion d&#8217;expliquer, l&#8217;ordre des analyses, et donc de découvertes des bugs, n&#8217;est pas celui qu&#8217;aurait choisi un champion de la performance, j&#8217;ai nommé Kirk Pepperdine. Nous lui avons soumis notre application, et nous vous exposerons sa méthode d&#8217;analyse et les raisons qui la motivent dans le dernier article de la série.</p><h3><a
name="Premiercontactaveclapplication"></a>Premier contact avec l&#8217;application&#8230;</h3><p>Ouverture du navigateur, entrée de l&#8217;url, et, pas de surprise, l&#8217;application PetClinic s&#8217;ouvre.</p><div><img
src="http://blog.xebia.fr/wp-content/uploads/2010/01/application.png" border="0" alt="" /></div><p>Premier lancement de JMeter, et première constatation : avec un seul utilisateur, l&#8217;application met en moyenne plus de 2 secondes à répondre. Inacceptable pour la plupart des sites web (surtout avec un seul utilisateur actif).</p><div><a
href="http://blog.xebia.fr/wp-content/uploads/2010/01/JMeter1.png"><img
class="alignnone size-medium wp-image-3886" title="JMeter1" src="http://blog.xebia.fr/wp-content/uploads/2010/01/JMeter1-650.png" alt="JMeter1" /></a></div><h3><a
name="etpremiersrglages"></a>&#8230; et premiers réglages</h3><p>A première vue, la machine ne semble pas à genoux, on peut donc incriminer directement l&#8217;application.<br
/> Nous allons donc chercher à savoir ce qu&#8217;elle fait. Un réflexe classique, qu&#8217;un certain nombre d&#8217;entre nous a eu, est d&#8217;aller ouvrir les logs. Catalina.out est vide, on n&#8217;a pas de répertoire de logs applicatives évident, à priori le coupable classique, la configuration log4j, est à écarter. Et pourtant&#8230; Pour savoir ce que fait réellement notre application, il est possible de réaliser une série de thread dumps. Pour cela, deux possibilités :</p><ul><li>la vieille école, qui va dumper le contenu des threads à l&#8217;aide d&#8217;un kill -3 sur la jvm.</li><li>l&#8217;école moderne, qui va utiliser <a
title="JVisualVm" href="http://blog.xebia.fr/2008/10/22/diagnostic-dune-jvm-a-distance/">JVisualVm</a> (et <a
title="ses plugins" href="https://visualvm.dev.java.net/plugins.html">ses plugins</a>) pour réaliser la même opération à l&#8217;aide d&#8217;une belle interface.</li></ul><div><a
href="http://blog.xebia.fr/wp-content/uploads/2010/01/TDLog4j.png"><img
class="alignnone size-medium wp-image-3890" title="TDLog4j" src="http://blog.xebia.fr/wp-content/uploads/2010/01/TDLog4j-650.png" alt="TDLog4j" /></a></div><p>Et là, demie surprise, notre thread actif est souvent surpris dans la méthode <code>org.apache.log4j.spi.LoggingEvent.getLocationInformation</code>. Nous aurions donc un logger actif. Nos soupçons initiaux se confirment, ne reste plus qu&#8217;à débusquer le coupable.<br
/> Nous n&#8217;avons pas (encore) le code source. Or, cette bombe plombe tellement l&#8217;application qu&#8217;il n&#8217;est pas envisageable que nous ne puissions pas la résoudre de suite. On doit donc avoir un fichier de paramétrage de la log externalisé. Là encore, VisualVm va nous aider. Dans la fenêtre overview, les paramètres de démarrage de la VM sont affichés. Et l&#8217;on voit apparaitre une directive de configuration log4j, <code>-Dlog4j.configuration</code>.</p><div><img
src="http://blog.xebia.fr/wp-content/uploads/2010/01/VMOverview.png" border="0" alt="" /></div><p>Un petit grep dans le répertoire de lancement de Tomcat (<code>$TOMCAT_HOME/bin</code>), et nous voyons apparaître dans le setEnv.sh la ligne <code>-Dlog4j.configuration=file:$CATALINA_HOME/conf/log.xml</code>. Et si nous ouvrons ce fichier, le root Logger est bien en DEBUG. Mais aucune directive spécifique pour logger ailleurs que dans la console. Tout devrait donc aller dans catalina.out. Ca sent la redirection &#8216;sauvage&#8217;. Continuons à parcourir les fichiers de lancement. Un petit tour dans catalina.sh, et surprise, une belle redirection Unix <code>"$CATALINA_BASE"/logs/catalina.out 1&gt; /var/log/catalina/tomcat.log  &amp;</code><br
/> Et en ouvrant ce fichier, on comprend mieux le temps perdu : des milliers de lignes de debug !</p><div><a
href="http://blog.xebia.fr/wp-content/uploads/2010/01/debugLog.png"><img
class="alignnone size-medium wp-image-3895" title="debugLog" src="http://blog.xebia.fr/wp-content/uploads/2010/01/debugLog-650.png" alt="debugLog" /></a></div><p>Celles ci ont d&#8217;ailleurs une particularité sympathique : à chaque ligne de debug, le numero de ligne de la classa Java est indiqué.<br
/> C&#8217;est pratique ! Pourquoi ne met on pas systématiquement en place cette configuration sur nos projets ?<br
/> Un petit tour dans la documentation Log4J nous apprend :</p><div><a
href="http://blog.xebia.fr/wp-content/uploads/2010/01/docLog4J.png"><img
class="alignnone size-medium wp-image-3896" title="docLog4J" src="http://blog.xebia.fr/wp-content/uploads/2010/01/docLog4J-650.png" alt="docLog4J" /></a></div><p>Log4J nous prévient, ces méthodes sont sous performantes. Si l&#8217;on creuse un peu dans le source, on trouve la classe affichant les pattern %M et %L, <code>org.apache.log4j.spi.LocationInfo</code>, qui contient le constructeur suivant :</p><pre class="brush: java; title: ; notranslate">
public LocationInfo(Throwable t, String fqnOfCallingClass) {
if(t == null || fqnOfCallingClass == null)
return;
String s;
// Protect against multiple access to sw.
synchronized(sw) {
t.printStackTrace(pw);
s = sw.toString();
sw.getBuffer().setLength(0);
}
[...]
</pre><p>Autrement dit, pour chaque ligne de log, Log4J génère une stackTrace pour pouvoir récupérer le numéro de la ligne et le nom de la méthode. Pas vraiment performant.<br
/> Modifions donc le pattern et observons le résultat.</p><div><a
href="http://blog.xebia.fr/wp-content/uploads/2010/01/JMeter2.png"><img
class="alignnone size-medium wp-image-3887" title="JMeter2" src="http://blog.xebia.fr/wp-content/uploads/2010/01/JMeter2-650.png" alt="JMeter2" /></a></div><ul><li> Suppression de %M:%L dans le pattern du Logger</li><li> Temps moyen de 2,3 s à 2,0 s pour 1 utilisateur</li><li> 2 points pour l&#8217;équipe qui a trouvé</li></ul><p>Toujours concernant ce fichier de log, nous voyons apparaître une ligne ne respectant pas le <em>PatternLayout</em> de Log4J, préfixée par <em>Hibernate</em>, qui trace une requête SQL. Gardons cette ligne en mémoire, nous y repenserons quand nous aurons le code source.</p><p>Deuxième amélioration immédiate envisageable, une application, qui plus est en production, ne devrait pas avoir besoin d&#8217;un niveau de log aussi fin. Passons le donc à ERROR.</p><div><a
href="http://blog.xebia.fr/wp-content/uploads/2010/01/JMeter3.png"><img
class="alignnone size-medium wp-image-3888" title="JMeter3" src="http://blog.xebia.fr/wp-content/uploads/2010/01/JMeter3-650.png" alt="JMeter3"  /></a></div><ul><li> Logger de DEBUG à ERROR</li><li> Temps moyen de 2,0 s à 1,75 s pour 1 utilisateur</li><li> 1 point pour l&#8217;équipe qui a trouvé</li></ul><p>Nous avons fait un sort au logger. Mais nous n&#8217;en avons pas encore fini avec la configuration out-of-the-box de cette application.</p><h4><a
name="Source"></a>Source</h4><p><a
title="Image libre de droits" href="http://commons.wikimedia.org/wiki/File:Magnifying_glass_and_Stamp_tong.jpg">Image libre de droits</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/01/27/performance-les-xebians-jouent-les-demineurs/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Formation Java Performance Tuning par Kirk Pepperdine</title><link>http://blog.xebia.fr/2009/11/06/formation-java-performance-tuning-par-kirk-pepperdine/</link> <comments>http://blog.xebia.fr/2009/11/06/formation-java-performance-tuning-par-kirk-pepperdine/#comments</comments> <pubDate>Fri, 06 Nov 2009 16:31:12 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[J2EE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3071</guid> <description><![CDATA[Xebia organise une formation d’optimisation des performances d’applications Java/J2EE avec Kirk Pepperdine, une première en France, entre le 18 et 21 janvier 2010. Pour ceux qui ne le connaissent pas, Kirk Pepperdine dispose de plus de 15 ans d’expérience dans les technologies orientées objets et l’optimisation de la performance. Figure emblématique du monde Java et [...]]]></description> <content:encoded><![CDATA[<p>Xebia organise une <a
href="http://www.xebia.fr/sites/default/files/formation-java-performance-tuning-kirk-pepperdine.pdf">formation d’optimisation des performances d’applications Java/J2EE</a> avec <strong>Kirk Pepperdine</strong>, une première en France, entre le 18 et 21 janvier 2010.</p><p>Pour ceux qui ne le connaissent pas, Kirk Pepperdine dispose de plus de 15 ans d’expérience dans les technologies orientées objets et l’optimisation de la performance. Figure emblématique du monde Java et élu <em>&laquo;&nbsp;Champion JAVA&nbsp;&raquo;</em> en 2005, Kirk est reconnu comme le référent de l’optimisation de performance Java. Il est le DSI de Kodewerk Ltd et le principal contributeur de <a
href="http://javaperformancetuning.com">javaperformancetuning.com</a>.</p><p>Cette formation approfondie de 4 jours permettra aux stagiaires d’obtenir les compétences nécessaires pour optimiser la performance de leurs applications Java/J2EE. Vous aborderez pendant cette formation tous les aspects de la performance :</p><ul><li>L’outillage nécessaire.</li><li>Les méthodologies à appliquer.</li><li>Les concepts d’architecture sous jacents à la performance.</li><li>Les meilleures pratiques.</li><li>Le benchmarking.</li><li>La gestion de mémoire.</li></ul><p>Si cette formation vous intéresse, n’hésitez pas à contacter Roderic Pratt au 06.09.69.05.49.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/06/formation-java-performance-tuning-par-kirk-pepperdine/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia-74/</link> <comments>http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia-74/#comments</comments> <pubDate>Mon, 15 Sep 2008 15:48:03 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JavaPolis]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Websphere]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=654</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Le coin de la technique invokedynamic vu de l&#8217;intérieur Concurrency : past and present Tuning des JVM Websphere 6.1 Performance d&#8217;affichage d&#8217;une page Web Evènements de notre communauté en France et à l&#8217;étranger Refactoring itératif de conférences : JavaPolis, Javoxx et DeVox Le coin [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#invokedynamicvudelintrieur"><code>invokedynamic</code> vu de l&#8217;intérieur</a></li><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#Concurrencypastandpresent">Concurrency : past and present</a></li><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#TuningdesJVMWebsphere">Tuning des JVM Websphere 6.1</a></li><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#PerformancedaffichagedunepageW">Performance d&#8217;affichage d&#8217;une page Web</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#Refactoringitratifdeconfrences">Refactoring itératif de conférences : JavaPolis, Javoxx et DeVox</a></li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="invokedynamicvudelintrieur"></a><code>invokedynamic</code> vu de l&#8217;intérieur</h4><p>Dans <a
href="http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html" title="cet article" >cet article</a>, Charles Nutter, <em>JRuby Core Developper</em> nous présente pourquoi il est nécessaire de mettre à jour le bytecode <code>invokedynamic</code>.<br
/> Java nous oblige à typer chaque variable et chaque méthode doit définir une signature statique dont les types sont connus avant le Runtime : Java est un langage  &#8216;statiquement&#8217; typé. Si ce typage fort est une des forces du langage, comment la JVM peut-elle supporter des langages dynamiques ? La rigidité de Java provient, plus de son langage que de son bytecode. C&#8217;est ainsi que des langages comme Groovy permettent d&#8217;enfreindre certaines règles, par exemple : ne pas définir de types aux variables.  Ce n&#8217;est pas pour autant que le bytecode va tout nous permettre, certaines règles sont incassables dont celles qui s&#8217;appliquent aux invocations de méthodes :</p><ul><li>Les invocations sont statiquement typées.</li><li>Les invocations doivent s&#8217;effectuer sur des méthodes Java. Il est impossible de remplacer un appel à une méthode par un morceau de code interprété.</li></ul><p>À l&#8217;origine, la <a
href="http://jcp.org/en/jsr/detail?id=292" title="JSR-292" >JSR-292</a> a proposé la mise en place d&#8217;un nouveau code <code>invokedynamic</code> permettant l&#8217;invocation de méthodes sans signatures typées statiquement, mais rien n&#8217;avait été prévu pour modifier dynamiquement la logique d&#8217;invocation de la JVM.</p><h4><a
name="Concurrencypastandpresent"></a>Concurrency : past and present</h4><p>Brian Goetz, auteur du livre &#8216;Java Concurrency In Practice&#8217;, a publié sur InfoQ une vidéo enregistrée lors du QCon 2007 : <a
href=" http://www.infoq.com/presentations/goetz-concurrency-past-present" title="Concurrency : Past and Present" >Concurrency : Past and Present</a>.<br
/> Pourquoi est-il plus difficile de développer des applications multithreadées que de parler en lisant son journal ?<br
/> Dans cette présentation, Brian tente de répondre à cette question en revenant sur les principales difficultés de la programmation concurrente. Sujet que nous avions également abordé lors d&#8217;un article publié cet été sur le sujet : <em>&laquo;&nbsp;<a
href=" http://blog.xebia.fr/2008/08/13/programmation-concurrentielle-notions-fondamentales/" title="programmation concurrente : notions fondamentales" >programmation concurrente : notions fondamentales</a>&laquo;&nbsp;</em>. Pour illustrer ces problèmes, Brian revient sur l&#8217;histoire de la programmation concurrente et ses différentes approches, avant de donner ses recommandations. À la fin de la vidéo, il présente également les fonctionnalités offertes par d&#8217;autres langages comme ErLang et Scala.</p><h4><a
name="TuningdesJVMWebsphere"></a>Tuning des JVM Websphere 6.1</h4><p>Giribabu Paramkusham et Ajay Bhalodia, WebSphere Application Server Technical Support, présentent dans <a
href="http://www-01.ibm.com/support/docview.wss?uid=swg27013400" title="JVM Performance Tuning with respect to Garbage Collection(GC) policies for WebSphere Application Server V6.1 part 1" >JVM Performance Tuning with respect to Garbage Collection(GC) policies for WebSphere Application Server V6.1 part 1</a> (<a
href="http://www-01.ibm.com/support/docview.wss?uid=swg27013400&#038;aid=1" title="pdf" >pdf</a>) les points clef du tuning des JVM pour Websphere. Nous retiendrons :</p><ul><li>Les JVM IBM proposent quatre stratégies de garbage collections :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>-Xgcpolicy:optthruput</code> pour minimiser le temps global d&#8217;exécution (batch, &#8230;).<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>-Xgcpolicy:optavgpause</code> pour minimiser la durée de chaque pause.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>-Xgcpolicy:gencon</code> destiné aux applications web. L&#8217;algorithme Générationnel Concurrent communément utilisé dans les JVM Sun est optimisé pour les objets à courte durée de vie.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>-Xgcpolicy:subpools</code> pour les serveurs à grand nombre de processeurs (>16).</li><li>A la différence de l&#8217;implémentation GenCon de Sun qui comprend trois zones (Young, Tenurd et Permanent), celle d&#8217;IBM n&#8217;en comporte que deux (Young et Old)</li><li>L&#8217;option <code>-verbose:gc</code> est activable en production avec un impact négligeable sur les performances et l&#8217;option moins connue <a
href="http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/appendixes/cmdline/cmdline_gc.html" title="-Xverbosegclog" ><code>-Xverbosegclog</code></a> permet de préciser un fichier de sortie en mode <em>rolling file</em> . Nous noterons que les informations de GC sont désormais formattées en XML ce qui facilitera la manipulation avec des outils.</li><li>Indépendamment des limites techniques liées au système d&#8217;exploitation, les JVM IBM sont optimisées pour utiliser des heap le plus souvent inférieures à 2 GB :</li></ul><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Platform </strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Additional Options </strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Maximum Possible </strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Advised Maximum </strong></td></tr><tr><td
style="border: 1px solid black"> AIX</td><td
style="border: 1px solid black"> automatic</td><td
style="border: 1px solid black"> 3.25 GB</td><td
style="border: 1px solid black"> 2.5 GB</td></tr><tr><td
style="border: 1px solid black"> Linux</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> 2 GB</td><td
style="border: 1px solid black"> 1.5 GB</td></tr><tr><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Hugemem Kernel</td><td
style="border: 1px solid black"> 3 GB</td><td
style="border: 1px solid black"> 2.5 GB</td></tr><tr><td
style="border: 1px solid black"> Windows</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> 1.8 GB</td><td
style="border: 1px solid black"> 1.5 GB</td></tr><tr><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> /3GB</td><td
style="border: 1px solid black"> 1.8 GB</td><td
style="border: 1px solid black"> 1.8 GB</td></tr><tr><td
style="border: 1px solid black"> z/OS</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> 1.7 GB</td><td
style="border: 1px solid black"> 1.3 GB</td></tr></table><p><em>source IBM</em></p><ul><li>L&#8217;utilisation de JVM 64 bits supprime les limites de taille de heap mais pénalisent les performances (plus de données manipulées) et la consommation mémoire (des pointeurs sur 64bits plutôt que 32bits accroissent de 30% à 50% la mémoire consommée)</li><li>La JVM 6 d&#8217;IBM réduit les dégradations de performances et de consommation mémoire en 64bits grâce à l&#8217;introduction de &laquo;&nbsp;pointeurs compressés&nbsp;&raquo;</li></ul><h4><a
name="PerformancedaffichagedunepageW"></a>Performance d&#8217;affichage d&#8217;une page Web</h4><p><a
href="http://xnme.exofire.net/" title="Hayes Potter" >Hayes Potter</a>, nous présente dans <a
href="http://www.catswhocode.com/blog/web-development/speed-up-your-website-quick-602" title="Speed up your website, quick!" >Speed up your website, quick!</a> des règles structurantes afin d&#8217;améliorer les performances d&#8217;affichage d&#8217;une page Web :</p><ul><li>Compression des ressources statiques (images, fichiers flashs, scripts, &#8230;).</li><li>Mettre en place une politique d&#8217;expiration des ressources statiques .</li><li>Mettre les styles CSS en haut de la page HTML tandis qu&#8217;il faut mettre les fichiers Javascript en bas de la page.</li><li>Limiter les requêtes <code>http://request</code> vers d&#8217;autres domaines. En effet à chaque requête vers un autre domaine, pendant le chargement de la page, une résolution DNS est effectué (<strong>accès réseaux supplémentaires</strong>).</li></ul><p>Dans le même esprit, Yahoo a mis à dispositon de la communauté des développeurs Web un ensemble de règles : <a
href="http://developer.yahoo.com/performance/rules.html" title="Exceptional Performances" >Exceptional Performances</a>.<br
/> Il y a 34 <em>Best Pratices</em> répartis dans 7 domaines différents :</p><ul><li>Contenu</li><li>Serveur</li><li>Cookie</li><li>CSS</li><li>Javascript</li><li>Image</li><li>Mobile</li></ul><p>Voici les règles les plus marquantes :</p><ul><li>Externaliser les fichiers CSS et Javascripts de la page HTML.</li><li>Réduire la taille des fichiers Javascripts en éliminant les caractères superflus (espace, variable à rallonge, &#8230;). Cela peut être assisté par des outils tel que <a
href="http://www.crockford.com/javascript/jsmin.html" title="JSMin" >JSMin</a> et <a
href="http://developer.yahoo.com/yui/compressor/" title="YUI Compressor" >YUI Compressor</a>. L&#8217;idéal c&#8217;est que les développeurs des pages gardent des fichiers Javascripts lisibles et maintenables puis au déploiement de ces pages, passer une moulinette sur les fichiers Javascripts afin d&#8217;épurer les caractères superflus.</li><li>Eviter la duplication des importations du même script, par exemple IE retéléchargera plusieurs le fichier bien que c&#8217;est la même ressource.</li><li>Utiliser une requête HTTP GET pour les requêtes AJAX.</li><li>Rassembler l&#8217;ensemble de vos images (pour les gestions des boutons par exemple) en une seule image et en faire un sprite avec CSS. Cette tache peut être assister par les outils <a
href="http://www.csssprites.com/" title="CSS Sprites" >CSS Sprites</a> et <a
href="http://spritegen.website-performance.org/" title="Website Performance CSS Sprite Generator" >Website Performance CSS Sprite Generator</a>.</li><li>Limiter l&#8217;utilisation des <code>iframe</code>.</li></ul><p>Références :</p><ul><li><a
href="http://www.dmxzone.com/ShowDetail.asp?NewsId=14958" title="Yahoo! New Performance Best Practices Now Available (Mars 2008)" >Yahoo! New Performance Best Practices Now Available (Mars 2008)</a>, excellente présentation de Stoyan Stefanox, développeur Yahoo, qui reprend point par point toutes ces <em>Best Pratices</em></li></ul><p>Voici une liste d&#8217;outils facilitant la mise en oeuvre et la vérification de ces points :</p><ul><li><a
href="http://developer.yahoo.com/yslow/" title="YSlow" >YSlow</a>, outil Yahoo aidant à la vérification de ces <em>best pratices</em></li><li><a
href="http://www.fiddlertool.com/fiddler/" title="Fiddler" >Fiddler</a>, debugger HTTP</li><li><a
href="http://www.alphaworks.ibm.com/tech/pagedetailer" title="IBM Page Detailler" >IBM Page Detailler</a>, décrire le déroulement des fichiers téléchargés pour l&#8217;affichage d&#8217;une page</li><li><a
href="https://addons.mozilla.org/fr/firefox/addon/1843" title="Firebug" >Firebug</a> (que pour firefox)</li><li><a
href="http://www.crockford.com/javascript/jsmin.html" title="JSMin" >JSMin</a>, minimiseur JavaScript</li><li><a
href="http://developer.yahoo.com/yui/compressor/" title="YUI Compressor" >YUI Compressor</a>, minimiseur Javascript</li><li><a
href="http://www.csssprites.com/" title="CSS Sprites" >CSS Sprites</a>, générateur de sprite CSS</li><li><a
href="http://spritegen.website-performance.org/" title="Website Performance CSS Sprite Generator" >Website Performance CSS Sprite Generator</a>, générateur de sprite CSS</li></ul><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="Refactoringitratifdeconfrences"></a>Refactoring itératif de conférences : JavaPolis, Javoxx et DeVox</h4><p>Terminons cette revue de presse par la petite histoire belge de la semaine. L&#8217;un des plus gros événements Java au monde JavaPolis vient de <a
href="http://weblogs.java.net/blog/fabriziogiudici/archive/2008/09/javapolis_javox.html" title="changer de nom" >changer de nom</a> pour la seconde fois cette année. Renommé Javoox en début d&#8217;année, il semblerait que cet ancien nouveau nom soit encore trop proche de « Java » pour Sun. Avec ce nouveau nom : <strong>DeVoxx</strong>, le BeJug (porteur de l&#8217;événement) continue le bras de fer avec Sun en osant mettre un &#8216;V&#8217; en 3e caractère de leur nouveau nom &#8230; tout comme dans &#8216;jaVa&#8217; &#8230; La <a
href=" http://www.devoxx.com/newsletters/2008/2/index.html" title="newsletter de DeVoxx" >newsletter de DeVoxx</a> nous explique que ce nouveau changement de nom est dû à une volonté de rester un événement Java indépendant.</p><ul><li>Site officiel du <a
href="http://www.bejug.org" title="BeJug" >BeJug</a></li><li>Site officiel du <a
href="http://www.devoxx.com" title="DeVoxx" >DeVoxx</a></li><li>Consultez la liste des <a
href="http://www.devoxx.com/display/JV08/Speakers" title="intervenants" >intervenants</a> à DeVoxx 2008</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia-74/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/</link> <comments>http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#comments</comments> <pubDate>Mon, 28 Jul 2008 17:13:58 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[OSGi]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SOA]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=432</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Projet Cassandra : donation de Facebook à la communauté Open Source Agilité Les outils pour l&#8217;Agilité RIA OSCON 2008 : Web framework of the future SOA Succès des projets SOA : seulement 20% selon le Burton Group Le coin de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#ProjetCassandradonationdeFaceb">Projet Cassandra : donation de Facebook à la communauté Open Source</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#LesoutilspourlAgilit">Les outils pour l&#8217;Agilité</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#OSCONWebframeworkofthefuture">OSCON 2008 : Web framework of the future</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#SuccsdesprojetsSOAseulementsel">Succès des projets SOA : seulement 20% selon le Burton Group</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#InteroprabilitOSGIetJavaModule">Interopérabilité OSGI et Java Module System</a></li><li><a
href="http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#NouvelleJSRPostmortemJVMDiagno">Nouvelle JSR : Post mortem JVM Diagnostics API</a></li><li><a
href="http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#OptimiserlesperformancesdeJava">Optimiser les performances de Java : rencontre avec Kirk Pepperdine</a></li><li><a
href="http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/#MEclipseLenouvellediteurgraphi">M2Eclipse : Le nouvelle éditeur graphique de pom</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="ProjetCassandradonationdeFaceb"></a>Projet Cassandra : donation de Facebook à la communauté Open Source</h4><p><a
href="http://code.google.com/p/the-cassandra-project/" title="Cassandra" >Cassandra</a> est un système distribué de stockage de données. Cette solution sera Open Source.</p><p>Cassandra est une solution développée par Facebook (Facebook Data Team), le site de réseau social.</p><p>Cassandra s&#8217;inspire de l&#8217;architecture de <a
href="http://labs.google.com/papers/bigtable.html" title="Google Big Table" >Google Big Table</a> et <a
href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html" title="Amazon Dynamo" >Amazon Dynamo</a>. Ces systèmes sont conçus pour être des solutions fortement <em>scalables</em> et aussi gérer des entrepôts de données importants, de l&#8217;ordre du petabyte (<a
href="http://fr.wikipedia.org/wiki/Penta" title="représente 10 puissance 15 soit un un million de milliards" >représente 10 puissance 15 soit un un million de milliards</a>). Son architecture est semblable à un réseau P2P contrairement ou base de données classique (Oracle, MySQL, &#8230;) qui ont une architecture centralisée (sous forme de Cluster). Cette architecture permet de répartir la charge et de contourner des goulets d&#8217;étranglement de trafic de données.</p><p>L&#8217;avantage d&#8217;une telle architecture est d&#8217;être très <em>scalable</em>, et d&#8217;éviter les goulets d&#8217;étranglement de performance, au détriment de la cohérence de données.</p><p>Autant dire que les problématiques adressées par ces outils sont fortement critiques, mais seulement pour des systèmes d&#8217;information très particuliers.</p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="LesoutilspourlAgilit"></a>Les outils pour l&#8217;Agilité</h4><p><a
href="http://www.threeriversinstitute.org/Kent%20Beck.htm" title="Kent Beck" >Kent Beck</a> (l&#8217;un des fondateurs d&#8217;<a
href="http://fr.wikipedia.org/wiki/Extreme_Programming" title="XP" >XP</a>) partage ses réflexions sur la relation entre <a
href="http://www.microsoft.com/downloads/details.aspx?FamilyId=AE7E07E8-0872-47C4-B1E7-2C1DE7FACF96&#038;displaylang=en" title="les outils et l'Agilité" >les outils et l&#8217;Agilité</a>.</p><p>Il constate que beaucoup de personnes font une mauvaise interprétation d&#8217;un des principes du <a
href="http://agilemanifesto.org/" title="manifeste agile" >manifeste agile</a> : <em>Privilégiez les personnes et leurs interactions plutôt que les processus et les outils</em>. Cela ne signifie pas qu&#8217;il n&#8217;y a pas besoin d&#8217;outil ! Les outils sont indispensables et les méthodes agiles font émerger de nouveaux besoins. Les tests unitaires, la conception incrémentale, et l&#8217;intégration continue sont des exemples de changements qui accompagnent le développement agile. Kent prédit d&#8217;autres changements à venir :</p><ul><li>Des transitions plus aisées entre les activités</li><li>Un plus grand périmètre pour les tests automatiques</li><li>La transparence</li><li>Une collaboration en temps réel</li></ul><p>Une synthèse du livre blanc est disponible sur <a
href="http://www.infoq.com/news/2008/07/agile-tool-relation" title="InfoQ" >InfoQ</a> et sur le blog de <a
href="http://www.aubryconseil.com/dotclear/index.php/2008/07/28/447-les-outils-pour-l-agilite" title="Claude Audry" >Claude Audry</a>.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="OSCONWebframeworkofthefuture"></a>OSCON 2008 : Web framework of the future</h4><p>Lors de la <a
href="http://en.oreilly.com/oscon2008/public/content/home" title="convention de l'Open Source" >convention de l&#8217;Open Source</a> à Portland (EU), Matt Raible a présenté <a
href="http://raibledesigns.com/rd/entry/oscon_2008_web_frameworks_of" title="Web framework of the future" >Web framework of the future</a> où sont comparés les frameworks suivants : Flex, GWT, GRails et Rails</p><p>Il propose deux &#8216;nouveaux&#8217; pattern pour la conception des couches de présentation pour les applications SOA :</p><ul><li><a
href="http://www.theserverside.com/news/thread.tss?thread_id=47213" title="SOFEA, for Service-Oriented Front-End Architecture" >SOFEA, for Service-Oriented Front-End Architecture</a>.</li><li><a
href="http://www.infoq.com/news/2007/11/soui-death-of-mvc2" title="SOUI, Does the rise of Service Oriented UI (SOUI) means the death of server-assisted MVC?" >SOUI, Does the rise of Service Oriented UI (SOUI) means the death of server-assisted MVC?</a></li></ul><p>Le SOFEA se fonde sur trois principes fondamentaux :</p><ul><li><em>AD : Application Download</em>, décrit la manière dont la couche client est téléchargée du serveur chez l&#8217;utilisateur. Suivant le paramétrage du client (logiciel, sécurité, &#8230;) une certaine application sera téléchargée par le client</li><li><em>PF : Presentation Flow</em>, décrit la manière dont la couche de présentation enchaîne les écrans et dont les données sont transmises d&#8217;écran en écran. La réalisation de ce principe doit être dirigée par la partie client et non service</li><li><em>DI : Data Interchange</em>, décrit la manière dont la couche de présentation et la couche service s&#8217;échangent les données. La couche de présentation doit supporter les mêmes structures de données que la couche modèle</li></ul><p>La tableau suivant liste quelques solutions pour implémenter les trois principes précédents avec deux modèles de client <em>thin client</em>, <em>rich client</em> :</p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"> <strong>Principe</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"> <strong>thin client</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"> <strong>rich client</strong></td></tr><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"> <strong>Application Download</strong></td><td
style="border: 1px solid black"> Cette opération est assurée par le conteneur de la partie cliente (navigateur web)</td><td
style="border: 1px solid black"> C&#8217;est une opération explicite, le client télécharge une application suivant le paramétrage du client (Flash/Java Web Start)</td></tr><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"> <strong>Presentation Flow</strong></td><td
style="border: 1px solid black"> Une partie de la navigation peut être assurée par du Javascript côté client. Cependant, la grosse partie de la navigation est assurée côté serveur avec un framework</td><td
style="border: 1px solid black"> La navigation est gérée localement (sur le poste client) par l&#8217;application téléchargée. Sur cette partie client, le pattern MVC est envisageable</td></tr><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"> <strong>Data Interchange</strong></td><td
style="border: 1px solid black"> Il n&#8217;y a pas de communication directe, elle est assurée par le conteneur de l&#8217;application serveur (serveur Web). Un modèle HTML/HTTP est utilisé pour s&#8217;échanger les données, elle suit la sémantique requête/réponse.</td><td
style="border: 1px solid black"> Une certain nombre de protocoles et de format d&#8217;échange de données peuvent être utilisés, dans la plupart des cas c&#8217;est du XML. Généralement, la sémantique utilisée est la requête/réponse mais elle peut aussi être une semantique peer-to-peer.</td></tr></table><p>A l&#8217;instar du SOFEA, le SOUI se base sur un découplage net entre la couche de présentation et la couche service métier. La conception de la couche présentation est pilotée par la couche de service métier et non l&#8217;inverse.</p><p>Ces principes sont mis en oeuvre au travers de 3 frameworks :</p><ul><li>Flex : pour la réalisation d&#8217;interface en Flash.</li><li>GWT : pour la réalisation d&#8217;interface en DHTML/Ajax, développée en Java. Cette technologie peut amener à des difficultés lors que l&#8217;on travaille sur du code source existant.</li><li>GRails (Rails) : pour la réalisation d&#8217;interface Web en suivant le pattern MVC. Le <em>scaffolding</em> apporte une mise en place des écrans rapide, mais supporte mal le REST.</li></ul><p>Ces technologies sont assez différentes dans leur architecture et dans leur prise en compte de l&#8217;existant. Flex supporte bien le REST. Les technologies Rails (GRails, Ruby On Rails, Django) apportent de la productivité grâce à un langage dynamique et expressif, au <a
href="http://fr.wikipedia.org/wiki/%C3%89chafaudage_(programmation)" title="<em>scaffolding</em>&nbsp;&raquo; >_scaffolding_</a>, à l&#8217;<a
href="http://fr.wikipedia.org/wiki/Active_record" title="<em>active record</em>&nbsp;&raquo; >_active record_</a>, aux conventions de nommage, et au principe <em>don&#8217;t repeat</em>. GWT permet d&#8217;implémenter des applications Web riches en ayant peu de compétences Javacript, il suffit de bien maîtriser Java et CSS.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SuccsdesprojetsSOAseulementsel"></a>Succès des projets SOA : seulement 20% selon le Burton Group</h4><p>Nous annoncions en Mars dernier le lancement du <a
href="http://www.infoq.com/news/2008/07/Only1" title="sondage du Burton Group sur le succès des projets SOA" >sondage du Burton Group sur le succès des projets SOA</a>. Nous saluerons d&#8217;abord l&#8217;honnêteté de l&#8217;étude d&#8217;Anne Thomas Mannes qui reconnaît pas moins de 50% d&#8217;échecs complets.</p><p>Il ne faut pas pour autant condamner SOA dans son ensemble ; les piliers de cette démarche correspondent à des réalités des entreprises d&#8217;aujourd&#8217;hui. Certains principes comme le couplage lâche et la cohérence ne sont pas nouveaux et des idées comme la gouvernance des services et les <a
href="http://en.wikipedia.org/wiki/Service_level_agreements" title="Service Level Agreement" >Service Level Agreement</a> qui vont avec, restent souvent des voeux pieux difficilement mis en oeuvre eu égard aux changements culturels qu&#8217;ils demandent.</p><p>Nous ne tirerons donc pas aujourd&#8217;hui sur l&#8217;ambulance. En plus des <a
href="http://blog.xebia.fr/2008/07/17/les-10-pieges-de-la-soa/" title="10 pièges de la SOA" >10 pièges de la SOA</a> dont nous avons déjà parlé ces dernières semaines, nous retiendrons que sur le fond, les échecs sont plus souvent dûs à un manque de vision métier et architecturale qu&#8217;un à problème d&#8217;implémentation technique.</p><p>Un point intéressant de l&#8217;étude du Burton Group : une culture purement projet, malgré ses vertus de mise en production à un prix et une date maitrisés, se marie mal à une démarche SOA. Le délai court et le périmètre étroit, clefs du succès d&#8217;un projet (ce que nous prônons), sont souvent incompatibles avec une architecture SOA qui demande une vision plus large des briques du SI et des retours sur investissements plus long.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="InteroprabilitOSGIetJavaModule"></a>Interopérabilité OSGI et Java Module System</h4><p>Plusieurs mois après <a
href="http://blog.xebia.fr/2008/04/21/revue-de-presse-xebia-53/#JavaModuleSystemJSRvsOSGILarco" title="l'annonce" >l&#8217;annonce</a> d&#8217;une éventuelle interopérabilité entre Java Module System et OSGI, le sujet est toujours en discussion au sein du groupe d&#8217;experts de la JSR-277.  Sun semble un peu patauger dans la gadoue sur ces spécifications, il est vrai qu&#8217;il est difficile de contenter tout le monde sur un sujet ou chacun essaye d&#8217;imposer ses idées.</p><p>Et bien vous pouvez maintenant vous faire votre propre opinion, le <a
href="http://openjdk.java.net/projects/modules/" title="sous-projet" >sous-projet</a> implémentant le draft de Java Module System inclus maintenant un repository OSGI. Le prototype est pour le moment uniquement compatible avec l&#8217;implémentation OSGI de la fondation Apache (Apache Felix).  L&#8217;interopérabilité semble complètement transparente à l&#8217;utilisation, vous pouvez importer des modules OSGI de la même manière que vous importeriez des modules <a
href="http://blog.developpez.com/adiguba?title=ou_va_java_java_module_system" title="JAM (JAva Module)" >JAM (JAva Module)</a>. Si vous voulez essayer par vous-même un <a
href="http://weblogs.java.net/blog/mandychung/archive/2008/07/osgi_repository.html" title="exemple complet" >exemple complet</a> est disponible sur le blog de Mandy Chung.</p><h4><a
name="NouvelleJSRPostmortemJVMDiagno"></a>Nouvelle JSR : Post mortem JVM Diagnostics API</h4><p>Les principaux outils de diagnostic (débuggeur, outils de trace, analyse de performance) permettent de surveiller le comportement de la JVM lorsqu&#8217;ils sont activés. Ce genre d&#8217;outils est très efficace quand les problèmes sont reproductibles et que le client est prêt à accepter le prix de cette reproduction. C&#8217;est pourtant en pratique pas toujours le cas : soit par ce que le bug est dû à un problème ponctuel, soit par ce que le coût de reproduction n&#8217;est pas acceptable. L&#8217;analyse rétrospective est compliquée et nous manquons d&#8217;outils permettant d&#8217;effectuer des analyses &#8216;post-mortem&#8217;.</p><p>La nouvelle <a
href="http://jcp.org/en/jsr/detail?id=326" title="JSR-326 : Post mortem JVM Diagnostics API" >JSR-326 : Post mortem JVM Diagnostics API</a> voudrait pallier à ce manque en proposant un API permettant d&#8217;effectuer des analyses sur des artefacts générés à chaud par la JVM (<a
href=" http://java.sun.com/developer/technicalArticles/Programming/HPROF.html" title="HPROF" >HPROF</a> ou autres&#8230; ).</p><p>Elle proposera :</p><ul><li>un ensemble d&#8217;outils permettant de lire ces analyses</li><li>un moyen d&#8217;étendre ces outils</li><li>un moyen de standardiser la génération à la volée de ces artefacts</li></ul><p>Alex Miller en a profité pour <a
href=" http://tech.puredanger.com/2008/07/27/jsr-326-post-mortem-jvm-diagnostics-api/" title="demander à Steve Poole" >demander à Steve Poole</a> (specifications leader de la JSR) si celle-ci à une chance d&#8217;arriver à temps pour le jdk7. La réponse évidement incertaine : toujours aucune date pour cette fameuse umbrella JSR devant officialiser le <a
href="http://blog.xebia.fr/2008/02/20/nagez-avec-les-dauphins-jdk-7-proposals-overview/" title="contenu de la prochaine version de Java" >contenu de la prochaine version de Java</a>&#8230;</p><h4><a
name="OptimiserlesperformancesdeJava"></a>Optimiser les performances de Java : rencontre avec Kirk Pepperdine</h4><p>Dans cet <a
href="http://java.sun.com/developer/technicalArticles/Interviews/community/pepperdine_qa.html" title="article sur le Sun Developpper Network" >article sur le Sun Developpper Network</a>, Kirk Pepperdine revient sur ses expériences dans le domaine de la performance. Nous retiendrons les points suivants :</p><ul><li>L&#8217;un des principaux écueils dans une analyse de performance est le <strong>manque de méthode avec un focus prématuré sur le code</strong>. La plupart des équipes plongent directement dans le code, au mépris d&#8217;informations plus globales sur le système. Pour améliorer ce point Kirk Pepperdine expose deux méthodes : <a
href="http://www.infoq.com/articles/the-box" title="la box" >la box</a> et le mantra <a
href="http://javasymposium.techtarget.com/images/TSSJS_E_Presentations/Pepperdine_Kirk_MeasuringUpPerformance.pdf" title="Ne devinez pas, mesurez" >Ne devinez pas, mesurez</a><br
/> Plonger directement dans le code est d&#8217;ailleurs l&#8217;un des soucis majeurs que Kirk Pepperdine a rencontré au cours de sa carrière : aussi doué soit-il, un développeur ne parviendra pas à résoudre un problème de performance uniquement par la lecture du code ; la phase préliminaire de caractérisation du problème et d&#8217;identification du code en cause est primordiale.</li><li>L&#8217;un des facteurs de succès dans l&#8217;amélioration des performances est un <strong>code source simple et bien structuré</strong>. Un code simple (a.k.a. &laquo;&nbsp;dumb&nbsp;&raquo;) permet une meilleure analyse, aussi bien par des humains que par les optimiseurs de JVMs. De plus, un code complexe cache souvent des optimisations prématurées.<br
/> Un code bien structuré permet ajouts et remaniements qui sont souvent la clé de toute optimisation.<br
/> De manière générale, les grands principes agiles (couplage lâche, délégation, application des bons design patterns, bonne couverture de tests unitaires, builds automatisés) s&#8217;appliquent dans le cadre du tuning des performances.</li><li>Il faut se méfier des Performance Tips qui peuvent se révéler être des faux amis : une solution peut fonctionner dans un cas et s&#8217;avérer catastrophique dans une autre situation ou avec les versions suivantes d&#8217;une JVM.</li><li>La majorité des problèmes de performances se situent au niveau de la base de données et de la mémoire de la JVM.<br
/> Les principales mauvaises pratiques en ce qui concerne les liens entre programme Java et base de données sont :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Rendre son application résistante à l&#8217;introduction de caches (e.g. en mélangeant des accès jdbc au code métier)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Utiliser la base de données comme un mécanisme de lock distribué<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Utiliser la base de données pour exécuter de la logique métier clef<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Stocker des flux dénormalisés en base.<br
/> Le premier indice d&#8217;une sur-utilisation de la base est le nombre d&#8217;interactions entre celle-ci et l&#8217;application. La correction la plus triviale à cette erreur est d&#8217;ajouter un cache, ce qui sera beaucoup plus rapide et efficace que de tenter de réduire le nombre d&#8217;appels à la base.<br
/> Une autre astuce est de grouper au maximum les interactions application &#8211; base de données.</li><li>La gestion de la mémoire peut aujourd&#8217;hui reposer uniquement sur des outils efficaces :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Détection des fuites mémoire : <a
href="https://visualvm.dev.java.net/" title="Visual VM" >Visual VM</a> et <a
href="http://www.netbeans.org/" title="Netbeans" >Netbeans</a> Generation<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Objets &#8216;zombis&#8217; : Netbeans Generation ou attendre le time out de ces objets<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Un taux élévé de création d&#8217;objets. Cela entraîne généralement une Garbage Collection inefficace. Surveiller l&#8217;activité du GC permet donc de diagnostiquer ces problèmes (<a
href="http://www.javaperformancetuning.com/tools/hpjmeter/index.shtml" title="HPJMeter" >HPJMeter</a>, <a
href="http://www.tagtraum.com/" title="Tagtraum" >Tagtraum</a>, <a
href="https://gchisto.dev.java.net" title="gchisto" >gchisto</a>).<br
/> La majorité des problèmes de mémoire peuvent être réglés en jouant sur les Java Heap Size.</li><li>Une équipe stressée ne parviendra pas à traiter efficacement les problèmes. C&#8217;est pour cela qu&#8217;il est parfois bon d&#8217;envisager une correction &#8216;quick &#038; dirty&#8217; qui contente un maximum d&#8217;utilisateur, afin de faire baisser la pression sur les développeurs, pour pouvoir se poser et réfléchir à une solution à long terme.</li></ul><h4><a
name="MEclipseLenouvellediteurgraphi"></a>M2Eclipse : Le nouvelle éditeur graphique de pom</h4><p>Une nouvelle fonctionnalité vient de paraître dans la version 0.9.5 du plugin <a
href="http://m2eclipse.codehaus.org/" title="M2eclipse" >M2eclipse</a> : <a
href="http://docs.codehaus.org/display/M2ECLIPSE/Maven+POM+editor" title="l'éditeur graphique de fichier pom.xml" >l&#8217;éditeur graphique de fichier pom.xml</a>. On peut remarquer que pour une première version, l&#8217;éditeur est déjà assez complet : la très grande majorité des paramètres configurables d&#8217;un pom sont présents et l&#8217;éditeur offre la complétion pour l&#8217;ajout de dépendances (déjà présent dans l&#8217;éditeur &laquo;&nbsp;source&nbsp;&raquo;).</p><p>Mais la fonctionnalité qui mérite le coup d&#8217;oeil est celle permettant d&#8217;afficher l&#8217;arbre de dépendance sous la forme d&#8217;un arbre. L&#8217;éditeur reprend le goal <code>tree</code> du <a
href="http://maven.apache.org/plugins/maven-dependency-plugin/" title="maven-dependency-plugin" >maven-dependency-plugin</a> en lui ajoutant la visualisation graphique qui le rend bien plus facile à utiliser que son rendu en ligne de commande. Pour vous en rendre compte, voyez plutôt les <a
href="http://docs.codehaus.org/display/M2ECLIPSE/New+and+Noteworthy#NewandNoteworthy-0.9.5.200806261519/June26,2008" title="quelques captures d'écran" >quelques captures d&#8217;écran</a> disponibles. L&#8217;éditeur offre aussi une vue des dépendances sous la forme d&#8217;un graphe mais ce plugin relève encore du gadget, devant inutilisable sur des projets un peu conséquents.</p><p>M2Eclipse, en compétition avec Q4E pour devenir l&#8217;intégration officielle de Maven dans Eclipse (cf <a
href="http://www.eclipse.org/proposals/iam/" title="The Eclipse Integration for Apache Maven (IAM)" >The Eclipse Integration for Apache Maven (IAM)</a>), a fait de grands progrès depuis ses premières versions et si vous ne l&#8217;avez pas testé depuis longtemps, la dernière version mérite le coup d&#8217;œil &#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/07/28/revue-de-presse-xebia-67/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Exception synchronisée</title><link>http://blog.xebia.fr/2008/07/02/exception-synchronisee/</link> <comments>http://blog.xebia.fr/2008/07/02/exception-synchronisee/#comments</comments> <pubDate>Wed, 02 Jul 2008 06:00:33 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[exception]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/07/02/exception-synchronisee/</guid> <description><![CDATA[Symptômes Lors d&#8217;un test de performance sur une application J2EE, je note que celle-ci a des soucis de montée en charge. Généralement une ou deux thread dumps peuvent mettre en évidence les points de contentions. Dans mon cas, rien de probant. Je repense alors à l&#8217;article publié sur notre blog Chroniques de la performance : [...]]]></description> <content:encoded><![CDATA[<h3><a
name="Symptmes"></a>Symptômes</h3><p>Lors d&#8217;un test de performance sur une application J2EE, je note que celle-ci a des soucis de montée en charge. Généralement une ou deux thread dumps peuvent mettre en évidence les points de contentions. Dans mon cas, rien de probant. Je repense alors à l&#8217;article publié sur notre blog <a
href="http://blog.xebia.fr/2007/11/29/chroniques-de-la-performance-a-propos-de-contentions/" title="Chroniques de la performance : À propos de contentions..." >Chroniques de la performance : À propos de contentions&#8230;</a>. Je récupère les sources de l&#8217;agent et l&#8217;installe sur le serveur d&#8217;application, Weblogic 8.1 &#8211; JVM 1.4.2. Lancement du tir&#8230;.</p><p>Dès le début de phase plateau, l&#8217;agent affiche régulièrement une partie du code que je n&#8217;aurais pas soupçonné: la bibliothèque <a
href="http://ibatis.apache.org" title="iBatis" >iBatis</a> qui gère l&#8217;accès aux données.</p><pre class="brush: java; title: ; notranslate">
[JTPROF] Contention report [id=-1250505672,thread=ExecuteThread: '14' for queue: 'weblogic.kernel.Default',blocked=210ms]
[JTPROF] Stack trace:
[JTPROF]         com.ibatis.sqlmap.engine.accessplan.EnhancedPropertyAccessPlan.&lt;init&gt; (EnhancedPropertyAccessPlan.java:29)
[JTPROF]         com.ibatis.sqlmap.engine.accessplan.AccessPlanFactory.getAccessPlan (AccessPlanFactory.java:62)
[JTPROF]         com.ibatis.sqlmap.engine.exchange.JavaBeanDataExchange.initialize (JavaBeanDataExchange.java:63)
[JTPROF]         com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameterMappingList (BasicParameterMap.java:93)
[JTPROF]         com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser.applyInlineParameterMap (SqlStatementParser.java:431)
[JTPROF]         com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser.processSqlStatement (SqlStatementParser.java:215)
[JTPROF]         com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser.parseGeneralStatement (SqlStatementParser.java:120)
</pre><p>Les temps de blocage affichés vont de 20ms à 500ms !</p><h3><a
name="Analyse"></a>Analyse</h3><p>A la lecture de cette pile d&#8217;appel, je me dis <em>&laquo;&nbsp;encore un bloc synchronisé mal placé dans <a
href="http://ibatis.apache.org" title="iBatis" >iBatis</a>&laquo;&nbsp;</em>. L&#8217;avantage avec l&#8217;open source, comme son nom l&#8217;indique, est que l&#8217;on a accès aux sources. J&#8217;ai donc ouvert la classe EnhancedPropertyAccessPlan qui, à ma grande déception, infirma ma 1ère intuition :</p><pre class="brush: java; title: ; notranslate">
27  EnhancedPropertyAccessPlan(Class clazz, String[] propertyNames) {
28    super(clazz, propertyNames);
29    bulkBean = BulkBean.create(clazz, getGetterNames(propertyNames), getSetterNames(propertyNames), getTypes(propertyNames));
30  }
</pre><p>La ligne #29 indique l&#8217;appel à une méthode statique de la classe &laquo;&nbsp;BulkBean&nbsp;&raquo; qui appartient à la bibliothèque <a
href="http://cglib.sourceforge.net" title="cgLib" >cgLib</a>, bien connue pour accélérer efficacement la création de beans Proxy . Idem: cette méthode n&#8217;est pas &#8216;synchronized&#8217;. Alors pourquoi l&#8217;agent m&#8217;indique cette méthode ?<br
/> Les grands moyens : injection de traces manuelles dans le code d&#8217;iBatis afin de comprendre ce qu&#8217;il se trame. Après de nombreux allers-retours de type &#8216;essais-erreurs&#8217;, je finis par trouver l&#8217;origine du problème : chaque appel à la méthode <em>BulkBean.create()</em> engendre une levée d&#8217;exception <em>NoClassDefFoundError</em>.<br
/> En effet, le packaging de l&#8217;ear est incomplet : <em>cglib.jar</em> est bien présente mais il manque l&#8217;une de ses dépendances : <a
href="http://asm.objectweb.org/" title="asm" >asm</a>. Or le code de la méthode <em>BulkBean.create()</em> s&#8217;appuie essentiellement sur l&#8217;API d&#8217;asm.<br
/> Cependant le packaging n&#8217;est pas le seul coupable, iBatis est également fautive ! La méthode <a
href="http://ibatis.apache.org/docs/java/dev/com/ibatis/sqlmap/engine/accessplan/AccessPlanFactory.html" title="AccessPlanFactory.getAccessPlan" >AccessPlanFactory.getAccessPlan</a> est extrêmement défensive : l&#8217;appel à EnhancedPropertyAccessPlan est gardé par un bloc <em>try&#8230;catch(Throwable)</em>. L&#8217;ajout d&#8217;un message de log de type &laquo;&nbsp;Erreur&nbsp;&raquo; aurait été le bienvenue, au moins la première fois.</p><pre class="brush: java; title: ; notranslate">
60:       if (bytecodeEnhancementEnabled) {
61:        try {
62:          plan = new EnhancedPropertyAccessPlan(clazz, propertyNames);
63:        } catch (Throwable t) {
64:          try {
65:            plan = new PropertyAccessPlan(clazz, propertyNames);
66:         } catch (Throwable t2) {
67:            plan = new ComplexAccessPlan(clazz, propertyNames);
68:          }
69:        }
</pre><h3><a
name="Explications"></a>Explications</h3><p>La levée d&#8217;une exception dans une méthode oblige la JVM à rendre l&#8217;appel synchronisé afin de garantir un traitement par le <em>catch</em> cohérent. Il ne faudrait pas que les données (attributs, paramètres, variables) aient été modifiées par un autre thread entre la levée de l&#8217;exception et son éventuel traitement.</p><p>Pour se convaincre de ce phénomène, il suffit d&#8217;écrire une simple classe de test : 10 threads, chaque thread appelle une méthode qui suivant un paramètre lève une <a
href="http://java.sun.com/javase/6/docs/api/java/lang/Exception.html" title="Exception" >Exception</a>, une <a
href="http://java.sun.com/javase/6/docs/api/java/lang/Error.html" title="Error" >Error</a> ou ne fait rien, et ceci 1 000 000 de fois. Le résultat :</p><ul><li>lorsque la méthode ne lève aucune Exception ou Erreur : Temps de réponse : 89 ms</li><li>lorsque la méthode lève une exception : Temps de réponse 5892 ms, 66 fois plus lent !</li></ul><p>Règle: <em>La levée d&#8217;exception doit rester un cas exceptionnel et ne dois en aucun cas devenir un design pattern, c&#8217;est même un<strong> anti-pattern</strong></em>.</p><pre class="brush: java; title: ; notranslate">
public class AntiPattern {
	class NotEvenException extends Exception {
	}
	boolean isEven(int nb) {
		try {
			if (nb % 2 &gt; 0)
				throw new NotEvenException();
			return true;
		} catch (NotEvenException e) {
			return false;
		}
	}
}
</pre><p>Note : Une fois le packaging complet, l&#8217;agent <em>jtprof</em> ne mentionne plus du tout cette zone de l&#8217;application.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/07/02/exception-synchronisee/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>Chroniques de la performance : À propos de contentions&#8230;</title><link>http://blog.xebia.fr/2007/11/29/chroniques-de-la-performance-a-propos-de-contentions/</link> <comments>http://blog.xebia.fr/2007/11/29/chroniques-de-la-performance-a-propos-de-contentions/#comments</comments> <pubDate>Thu, 29 Nov 2007 22:15:31 +0000</pubDate> <dc:creator>Guillaume Bodet</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/11/29/chroniques-de-la-performance-a-propos-de-contentions/</guid> <description><![CDATA[J&#8217;ai été, il y a peu, confronté à un problème de performances que l&#8217;on peut qualifier d&#8217;intéressant &#8211; dans la bouche d&#8217;un expert technique, ce mot a généralement tendance à provoquer une bouffée de panique chez les plus chevronnés des managers. Je vous explique. Le programme consiste à appliquer massivement un traitement identique à un [...]]]></description> <content:encoded><![CDATA[<p>J&#8217;ai été, il y a peu, confronté à un problème de performances que l&#8217;on peut qualifier d&#8217;<em>intéressant</em> &#8211; dans la bouche d&#8217;un expert technique, ce mot a généralement tendance à provoquer une bouffée de panique chez les plus chevronnés des managers.</p><p>Je vous explique.</p><p>Le programme consiste à appliquer massivement un traitement identique à un volume important de données – bref, c’est un batch. Objectif opérationnel : assurer la capacité du système à traiter 50000 dossiers par heure.<br
/> L’architecture d’exécution de ce batch est relativement classique : un contrôleur est chargé d’obtenir auprès d’un service métier une liste de dossiers à traiter, de segmenter cette liste en lots, puis de soumettre les lots à un pool  de threads qui vont réaliser les traitements en parallèle – chaque lot est traité dans une transaction distincte. Le traitement unitaire d’un dossier est relativement long, de l’ordre de 2 secondes ; les lots sont donc petits – 4 dossiers – pour limiter la durée des transactions.</p><p>Au-delà de son rôle de segmentation et de répartition des lots, le contrôleur fournit un ensemble de services de pilotage, qui n’ont pas vraiment de relation avec notre problème, mais que je mentionne pour information : état d’avancement du traitement, interruption, reprise, calcul de statistiques variées, rapports d’erreurs, etc.</p><p>Typiquement, avec une telle architecture, le débit total du système est une fonction du temps de traitement unitaire et du nombre de threads simultanés :</p><p
style="text-align: center"><code>Débit Horaire = (3600 / Temps Unitaire) * Nombre de threads</code></p><p>Pour mon batch, le calcul théorique est simple : le traitement de chaque dossier demandant 2 secondes, un thread peut traiter 1800 dossiers par heure. Le débit cible étant de 50000 dossiers par heure il est donc théoriquement nécessaire de démarrer un pool de 30 threads.<br
/> Ce calcul cependant part d’une hypothèse audacieuse : il suppose que les temps de traitement unitaire resteront stables quel que soit le nombre de threads. En somme, que la montée en charge du système est parfaitement linéaire.</p><p>Or les tests grandeur réelle réalisés en pré-production montrent un comportement assez éloigné de notre équation platonicienne :</p><p
style="text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2007/11/tu_initial.png" alt="Temps unitaire par dossier selon le nombre de threads" /></p><p>Exprimé sous forme de débit, ce même graphe montre une pente inquiétante :</p><p
style="text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2007/11/debit_initial.png" alt="Débit réel comparé au débit théorique" /></p><p>Le débit horaire s’écarte de plus en plus de la valeur théorique idéale et tend vers une valeur désespérément éloignée du débit cible. Pire, il aurait tendance à se dégrader lorsque le nombre de threads devient trop élevé. Pas de panique, cependant, ce comportement ne saurait déstabiliser le briscard de la performance que je suis : de telles courbes révèlent simplement que le système atteint une limite qui interdit la montée en charge. Reste à déterminer quel composant physique ou logiciel en est à l’origine.</p><p>La première réaction est naturellement de vérifier qu’aucun composant physique n’arrive à saturation. Les outils <em>ad hoc</em> sont utilisés pour contrôler la consommation CPU, l’overhead du GC, le paging, la bande passante, les I/O disque, etc., je vous épargne le détail. Deux éléments intéressants sont tirés de cette analyse : premièrement, aucun composant physique n’approche ses limites de capacité ; deuxièmement, leur niveau de charge épouse presque parfaitement l’évolution du débit présenté dans la figure 2. En d&#8217;autres termes, l’usage des ressources physiques, par exemple la charge moyenne des processeurs, présente la même évolution que le débit : leur montée en charge est freinée et s’écarte inexorablement de la progression théorique linéaire.<br
/> Une nouvelle fois, ce sont des caractéristiques relativement communes des systèmes parallélisés : cela signifie que les threads d’exécution entrent en compétition pour obtenir certains verrous, ou pour accéder à certaines sections critiques ; plus le nombre de threads augmente et plus la compétition devient serrée : il faut de plus en plus de temps pour acquérir les verrous.</p><p>Dans notre système, deux composants sont susceptibles de créer ces conditions :</p><ul><li>la base de données, qui gère des verrous à différents niveaux</li><li>le code java, au travers de blocs synchronisés</li></ul><p>Quiconque a déjà travaillé sur un système transactionnel fortement parallélisé sait que les contentions sur la base de données en sont le principal écueil. Pour assurer l’isolation des transactions, les SGBD posent des verrous en lecture et/ou en écriture sur des lignes, des pages ou des tables – en cas de très forte charge, la granularité des verrous est parfois modifiée dynamiquement, passant par exemple de la ligne (ROW LOCK) à la page (PAGE LOCK).<br
/> Notre système batch a été conçu en conséquence : la base est partitionnée selon des axes fonctionnels stricts, les opérations de lecture et d’écriture ont été soigneusement séquencées, les verrous sont posés au niveau des pages et le contrôleur sait exploiter certaines caractéristiques du stockage physique pour calculer et répartir les segments entre les différents threads. Une analyse des contentions sur la base de données a démontré l’efficacité de ces stratégies : le niveau de contention reste remarquablement bas, et n’explique en aucun cas la forte dégradation observée lors de la montée en charge.</p><p>Reste une seule explication : des contentions dans les couches d’exécution Java. Et une question : comment identifier l’origine de ces contentions, et les corriger ?</p><p>Un premier test est réalisé pour valider l’hypothèse de contentions applicatives dans le code java : il consiste à démarrer 5 processus dotés chacun d’un pool de 4 threads – un total de 20 threads, donc, permettant d’atteindre un taux de parallélisation qui dans nos tests précédents mettaient fortement en exergue la dégradation des temps de traitements unitaires. Ce test est concluant : distribués sur 5 processus distincts, les threads ne sont plus soumis à une compétition mortifère, et la montée en charge se réalise de façon satisfaisante.</p><p>Une solution envisageable serait d’adopter cette architecture, et de distribuer les traitements sur plusieurs processus. Le contrôleur, cependant, n’a pas été conçu pour coordonner plusieurs processus. L’évolution la plus simple, consistant à séparer le contrôleur des composants métiers – par exemple au moyen d’EJBs – implique d’introduire une couche de distribution qui nous semble d’autant moins souhaitable que le contrôleur est en charge du pilotage des transactions : le séparer des traitements signifie distribuer les transactions, et tous les petits soucis que cette décision implique généralement. Cela signifie aussi probablement l’introduction d’un serveur d’applications dans l’architecture de batch, avec les difficultés afférentes en terme de déploiement et d’exploitation. D’autres évolutions plus massives sont envisageables : par exemple s’appuyer sur des tables techniques pour stocker les segments, et découpler complètement une phase de pré-processing – consistant à calculer les lots – et une phase de traitement – consistant à piocher des lots dans la base et à les traiter. On peut même imaginer des solutions plus exotiques, à base de files JMS&#8230; Mais pour tout dire, nous aimons la compacité de notre architecture initiale, et ne sommes pas prêts à l’abandonner sans résister un peu. La question reste donc entière : comment débusquer l&#8217;origine de nos contentions aux fins de les liquider ?</p><p>L’analyse statique du code n’a rien donné : le contrôleur, à l’instar des composants métiers, utilise un bon zillion de bibliothèques tierces, plus ou moins open source et au flot d’exécution volontiers cryptique. Impossible dans ces conditions de déterminer l’origine exacte des contentions par simple consultation des sources : une analyse <em>runtime</em> est nécessaire.</p><p>Reste à trouver le bon outil dans la sacoche du plombier java. Même avec l&#8217;aide gracieuse de Google, la récolte reste maigre en matière d&#8217;outillage&#8230;</p><p>Autant l’offre est pléthorique lorsqu’il s’agit de profiler la consommation CPU ou mémoire des applications Java, autant l’analyse des contentions reste une discipline peu outillée. Certes les profilers java offrent pour la plupart un module d’analyse de threads ; mais leur overhead est tel qu’il est difficile, voire impossible d’instrumenter un traitement fortement multi-threadé comme notre batch : au-delà de 3 ou 4 threads, les informations collectées perdent de leur pertinence, et les temps unitaires s’allongent tellement que toute tentative d’analyse relève de l’acrobatie la plus pure.<br
/> Tordons rapidement le cou à hprof, le profiler intégré au JDK – le notre, en l’occurrence, est un JDK IBM 1.4.2 SR8 ; la documentation indique une option « monitor=y », qui, je cite, « tells hprof to generate information on contention monitors used to synchronize the work of multiple threads » (je vous laisse traduire). Bigre, nous voilà sauvés ! Pas tout à fait&#8230; Outre que le faire fonctionner a demandé une montée de version du JDK – la version que nous utilisions à l’origine générait un très joli core lors de l’activation de hprof -, les informations obtenues se sont révélées d’une rare inutilité (fondamentalement, un état des moniteurs java au moment de la sortie du processus. Aucun intérêt !).<br
/> Exit hprof, donc.<br
/> Autre approche : générer de façon répétée des Thread Dump à l’aide de l’instruction <code>kill -3</code>, puis comparer les différents dumps à l’aide d’un outil <em>ad hoc</em> (en l’occurrence un utilitaire disponible sur le site alphaWorks, et dont je donne le nom complet pour souligner le sens du marketing des ingénieurs IBM : <a
href="http://www.alphaworks.ibm.com/tech/jca">IBM Thread and Monitor Dump Analyzer for Java Technology</a>). Bien que prometteuse, cette solution n’a une nouvelle fois pas donné de résultat définitif : elle nous a permis d’identifier quelques méthodes candidates, mais sans qu’il fût possible de quantifier leurs responsabilités respectives.</p><p>Reste une solution : retrousser ses manches et écrire un profiler spécialisé en s’appuyant sur JVMPI.<br
/> JVMPI (pour Java Virtual Machine Profiling Interface) est, comme son nom le suggère, une API native de profilage de la JVM (remplacée par JVMTI à partir de Java 5, mais c&#8217;est une autre histoire). L’API fonctionne sur un système de callback : l’agent (c’est ainsi que l’on nomme le programme s’appuyant sur l’API) s’enregistre auprès de la JVM en précisant les types d’événements dont il souhaite être notifié – vous aurez probablement reconnu le pattern Observer.<br
/> Ces événements concernent la plupart des opérations techniques de bas niveau réalisées par la JVM : chargement d’une classe, allocation mémoire, exécution d’une méthode, démarrage d’un thread, etc. Parmi ces événements, deux retiennent particulièrement notre attention : <code>MONITOR_CONTENDED_ENTER</code> et <code>MONITOR_CONTENDED_ENTERED</code>. Le premier indique qu&#8217;un thread souhaite exécuter un bloc synchronisé, et tente d&#8217;acquérir un moniteur à cette fin (pour mémoire, la notion de moniteur en java est très proche de celle de verrou dans le reste du monde); le second indique que le thread a obtenu le moniteur en question et entame l&#8217;exécution du bloc synchronisé. L&#8217;intervalle de temps entre les deux événements correspond par conséquent à la durée totale de l&#8217;attente – autrement dit à la durée de la contention.<br
/> Munis de ces rudiments de JVMPI, il est possible de formuler les spécifications exhaustives de notre petit outil de profilage : la durée de toutes les contentions rencontrées par le programme est mesurée. Si cette durée est supérieure à un certain seuil (disons 5 millisecondes), le nom de la méthode correspondante est loggué dans un fichier, ainsi qu’une pile d’appels simplifiée.</p><p>Bien. Il ne reste plus qu&#8217;à coder.</p><p>Le point d&#8217;entrée d&#8217;un agent JVMPI est la méthode JVM_OnLoad. C&#8217;est dans cette méthode que l&#8217;on va informer le sous-système JVMPI des événements que l&#8217;on souhaite activer (<code>EnableEvent</code>), et de la méthode callback qui sera invoquée lors des occurrences de ces événements (<code>NotifyEvent</code>) :</p><pre class="brush: cpp; title: ; notranslate">
JNIEXPORT jint JNICALL _JVM_OnLoad(JavaVM *vm, char *options, void *reserved)
{
    ...
    /* Register callback method */
    jvmpi-&gt;NotifyEvent = jtprof_notify_event;
    /* Enable events */
    jvmpi-&gt;EnableEvent(JVMPI_EVENT_JVM_SHUT_DOWN, NULL);
    jvmpi-&gt;EnableEvent(JVMPI_EVENT_CLASS_LOAD, NULL);
    jvmpi-&gt;EnableEvent(JVMPI_EVENT_CLASS_UNLOAD, NULL);
    jvmpi-&gt;EnableEvent(JVMPI_EVENT_MONITOR_CONTENDED_ENTER, NULL);
    jvmpi-&gt;EnableEvent(JVMPI_EVENT_MONITOR_CONTENDED_ENTERED, NULL);
    jvmpi-&gt;EnableEvent(JVMPI_EVENT_THREAD_START, NULL);
    jvmpi-&gt;EnableEvent(JVMPI_EVENT_THREAD_END, NULL);
    ...
    return JNI_OK;
}
</pre><p>La méthode <em>callback</em>, <code>jtprof_notify_event</code>, se contente de déterminer la nature de l&#8217;événement et de déclencher un <em>handler</em> spécialisé :</p><pre class="brush: cpp; title: ; notranslate">
static void jtprof_notify_event(JVMPI_Event *event)
{
    switch(event-&amp;gt;event_type) {
        case JVMPI_EVENT_JVM_SHUT_DOWN:
            handle_jvm_shut_down_event();
            return;
        ...
        case JVMPI_EVENT_THREAD_START:
            handle_thread_started_event(event);
            return;
        case JVMPI_EVENT_THREAD_END:
            handle_thread_end_event(event);
            return;
        case JVMPI_EVENT_MONITOR_CONTENDED_ENTER:
            handle_monitor_contented_enter(event);
            return;
        case JVMPI_EVENT_MONITOR_CONTENDED_ENTERED:
            handle_monitor_contented_entered(event);
            return;
        ...
    }
}
</pre><p>Les choses semblent relativement simples. L&#8217;API JVMPI offre même un système de stockage <em>thread local</em> (méthode <code>GetThreadLocalStorage</code>), permettant de conserver une structure de données quelconque dédiée à chaque thread. Je vous épargne les détails de la création et de la destruction de cette structure de données – les curieux pourront jeter un oeil sur le code source. Sachez simplement qu&#8217;elle est créée lors de l&#8217;événement THREAD_START, détruite lors de l&#8217;événement THREAD_END, et qu&#8217;elle permet notamment de conserver la date de la demande d&#8217;acquisition du moniteur par le thread.</p><p>Au final, le code permettant de mesurer la durée d&#8217;acquisition d&#8217;un moniteur est relativement trivial :</p><pre class="brush: cpp; title: ; notranslate">
static void handle_monitor_contented_enter(JVMPI_Event *event){
    thread_local_context *ctx = (thread_local_context*)jvmpi-&gt;GetThreadLocalStorage(event-&gt;env_id);
    //Error handling code
    ....
    ctx-&gt;timer = system_current_time_millis();
}
static void handle_monitor_contented_entered(JVMPI_Event *event){
    long finish = system_current_time_millis();
    long total;
    thread_local_context *ctx = (thread_local_context*)jvmpi-&gt;GetThreadLocalStorage(event-&gt;env_id);
    //Error handling code
    ....
    total = finish – ctx-&gt;timer;
    ctx-&gt;timer = 0;
    if (total &gt; __contention_threshold){
        //Log contention details
        ....
    }
}
</pre><p>Les choses, bien sûr, sont en réalité un poil plus complexes – fallait pas rêver, non plus.<br
/> Par souci d&#8217;efficacité, en effet, la structure de données <code>JVMPI_Event</code> ne contient, pour chaque événement, qu&#8217;un jeu minimal d&#8217;informations. En pratique, cela signifie que le nom de la méthode invoquée n&#8217;est pas disponible sous forme littérale, mais sous la forme d&#8217;un identifiant interne créé lors du chargement de la classe correspondante.<br
/> Logguer cet identifiant ne serait bien sûr pas d&#8217;un grand intérêt. Il faut pouvoir l&#8217;associer au nom qualifié de la méthode. Pour cela, l&#8217;événement <code>CLASS_LOAD</code> doit être traité. Cet événement fournit la définition complète de la classe et de toutes ses méthodes – y compris leur nom littéral. Notre programme conserve donc ces informations dans un tableau associatif (dont le code source est très largement inspiré de celui de hprof). Ce tableau peut ensuite être consulté lors du traitement d&#8217;une contention afin de déterminer le nom de la méthode appelante à partir de son identifiant. Une technique similaire est mise en oeuvre pour expliciter la pile d&#8217;appels. Je vous laisse consulter <a
href="http://blog.xebia.fr/wp-content/uploads/2007/11/jtprof.zip" title="jtprof.zip">le code source</a> pour les détails&#8230;</p><p>Le programme doit être compilé sous forme de bibliothèque dynamique (extension <code>.dll</code> sous Windows, <code>.so</code> sous Unix), inclu dans le LIB_PATH (ou son équivalent) et intégré à la JVM grâce à l&#8217;option <code>-Xrunjtprof</code> (jtprof est le nom donné à la bibliothèque). Voici le type de sorties obtenues :</p><pre class="brush: java; title: ; notranslate">
[JTPROF] Contention report [id=-2002923824,thread=Contention-Thread-4,blocked=305ms]
[JTPROF] Stack trace:
[JTPROF]	 org.test.Contentions.blockABitMore (Contentions.java:36)
[JTPROF]	 org.test.Contentions.run (Contentions.java:25)
[JTPROF]	 java.lang.Thread.run (Thread.java:595)
...
[JTPROF] Thread end [id=-2002912512, name=Contention-Thread-6, duration=1519ms, blocked=1416ms]
</pre><p>Une fois mis au point, cet outil s&#8217;est révélé très précieux. Son overhead est très faible – les événements les plus gourmands, comme les sites d&#8217;allocation mémoire ou la consommation CPU des méthodes, ne sont pas traités. Il nous a fourni un état très précis du niveau de contention, et de la localisation de celles-ci. Une douzaine de méthodes ont été corrigées (la plupart des contentions étaient de très courte durée &#8211; rarement plus de 50ms &#8211; mais leur fréquence et leur durée avaient tendance à augmenter).<br
/> Au terme de ces optimisations, la courbe des débits se présente comme suit :</p><p
style="text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2007/11/debit_final.png" alt="Débit réel comparé au débit théorique" /></p><p>Il reste un léger décrochage au-delà de 25 threads, mais cette fois-ci, son origine ne fait pas de doute : notre machine de test est simplement saturée, et la contention, cette fois-ci, porte sur l&#8217;accès aux processeurs.</p><p>Ceux qui ont suivi depuis le début se souviennent peut-être de l&#8217;équation présentée plus haut dans cet article :</p><p
style="text-align: center"><code>Débit Horaire = (3600 / Temps Unitaire) * Nombre de threads</code></p><p>S&#8217;ils n&#8217;ont pas complètement oublié le programme de mathématiques du Brevet des Collèges, ils auront probablement compris que l&#8217;augmentation du nombre de threads n&#8217;est pas le seul levier du débit : réduire le temps de traitement unitaire en est un autre. Mais ceci est une autre histoire&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/11/29/chroniques-de-la-performance-a-propos-de-contentions/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Top ten des problèmes de performances des applications J2EE (4 &amp; 3)</title><link>http://blog.xebia.fr/2007/10/04/top-ten-des-problemes-de-performances-des-applications-j2ee-4-3/</link> <comments>http://blog.xebia.fr/2007/10/04/top-ten-des-problemes-de-performances-des-applications-j2ee-4-3/#comments</comments> <pubDate>Thu, 04 Oct 2007 06:44:11 +0000</pubDate> <dc:creator>Guillaume Bodet</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[vidéo]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/10/04/top-ten-des-problemes-de-performances-des-applications-j2ee-4-3/</guid> <description><![CDATA[Nous vous proposons aujourd&#8217;hui la quatrième d&#8217;une série de cinq vidéos consacrées aux problèmes de performances des applications java / J2EE. Nous y déroulons le top 10 des problèmes de performances en environnement java&#160;/ J2EE en les illustrant par des cas concrets et en proposant pour chacun des mesures permettant de s&#8217;en prémunir. Cette vidéo [...]]]></description> <content:encoded><![CDATA[<p>Nous vous proposons aujourd&#8217;hui la quatrième d&#8217;une série de cinq vidéos consacrées aux problèmes de performances des applications java / J2EE.<br
/> Nous y déroulons <a
href="http://blog.xebia.fr/2007/05/03/le-top-10-des-problemes-de-performances-des-applications-j2ee/">le top 10 des problèmes de performances en environnement java&nbsp;/ J2EE</a> en les illustrant par des cas concrets et en proposant pour chacun des mesures permettant de s&#8217;en prémunir.</p><p>Cette vidéo traite des numéros&nbsp;:</p><ul><li><strong>04&nbsp;: Les bibliothèques tierces</strong></li><li><strong>03&nbsp;: Mauvais usage de la concurrence</strong></li></ul><div
align="center"> <object
width="700" height="350"><param
name="movie" value="http://www.vcasmo.com/swf/vcasmo.swf"></param><param
name="flashvars" value="pid=621"></param><param
name="allowFullScreen" value="true"></param> <embed
src="http://www.vcasmo.com/swf/vcasmo.swf" flashvars="pid=621" allowFullScreen="true" type="application/x-shockwave-flash" width="700" height="350"></embed></object></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/10/04/top-ten-des-problemes-de-performances-des-applications-j2ee-4-3/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Top ten des problèmes de performances des applications J2EE (6 &amp; 5)</title><link>http://blog.xebia.fr/2007/09/27/top-ten-des-problemes-de-performances-des-applications-j2ee-6-5/</link> <comments>http://blog.xebia.fr/2007/09/27/top-ten-des-problemes-de-performances-des-applications-j2ee-6-5/#comments</comments> <pubDate>Thu, 27 Sep 2007 06:33:06 +0000</pubDate> <dc:creator>Guillaume Bodet</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[vidéo]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/09/27/top-ten-des-problemes-de-performances-des-applications-j2ee-6-5/</guid> <description><![CDATA[Nous vous proposons aujourd&#8217;hui la troisième d&#8217;une série de cinq vidéos consacrées aux problèmes de performances des applications java / J2EE. Nous y déroulerons le top 10 des problèmes de performances en environnement java&#160;/ J2EE en les illustrant par des cas concrets et en proposant pour chacun des mesures permettant de s&#8217;en prémunir. Cette vidéo [...]]]></description> <content:encoded><![CDATA[<p>Nous vous proposons aujourd&#8217;hui la troisième d&#8217;une série de cinq vidéos consacrées aux problèmes de performances des applications java / J2EE.<br
/> Nous y déroulerons <a
href="http://blog.xebia.fr/2007/05/03/le-top-10-des-problemes-de-performances-des-applications-j2ee/">le top 10 des problèmes de performances en environnement java&nbsp;/ J2EE</a> en les illustrant par des cas concrets et en proposant pour chacun des mesures permettant de s&#8217;en prémunir.</p><p>Cette vidéo traite des numéros&nbsp;:</p><ul><li><strong>06&nbsp;: Utilisation impropre des caches</strong></li><li><strong>05&nbsp;: Utilisation excessive de la mémoire</strong></li></ul><div
align="center"> <object
width="700" height="350"><param
name="movie" value="http://www.vcasmo.com/swf/vcasmo.swf"></param><param
name="flashvars" value="pid=620"></param><param
name="allowFullScreen" value="true"></param> <embed
src="http://www.vcasmo.com/swf/vcasmo.swf" flashvars="pid=620" allowFullScreen="true" type="application/x-shockwave-flash" width="700" height="350"></embed></object></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/09/27/top-ten-des-problemes-de-performances-des-applications-j2ee-6-5/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Top ten des problèmes de performances des applications J2EE (8 &amp; 7)</title><link>http://blog.xebia.fr/2007/09/19/top-ten-des-problemes-de-performances-des-applications-j2ee-8-7/</link> <comments>http://blog.xebia.fr/2007/09/19/top-ten-des-problemes-de-performances-des-applications-j2ee-8-7/#comments</comments> <pubDate>Wed, 19 Sep 2007 06:44:57 +0000</pubDate> <dc:creator>Guillaume Bodet</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[vidéo]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/09/19/top-ten-des-problemes-de-performances-des-applications-j2ee-8-7/</guid> <description><![CDATA[Nous vous proposons aujourd&#8217;hui la deuxième d&#8217;une série de cinq vidéos consacrées aux problèmes de performances des applications java / J2EE. Nous y déroulerons le top 10 des problèmes de performances en environnement java&#160;/ J2EE en les illustrant par des cas concrets et en proposant pour chacun des mesures permettant de s&#8217;en prémunir. Cette vidéo [...]]]></description> <content:encoded><![CDATA[<p>Nous vous proposons aujourd&#8217;hui la deuxième d&#8217;une série de cinq vidéos consacrées aux problèmes de performances des applications java / J2EE.<br
/> Nous y déroulerons <a
href="http://blog.xebia.fr/2007/05/03/le-top-10-des-problemes-de-performances-des-applications-j2ee/">le top 10 des problèmes de performances en environnement java&nbsp;/ J2EE</a> en les illustrant par des cas concrets et en proposant pour chacun des mesures permettant de s&#8217;en prémunir.</p><p>Cette vidéo traite des numéros&nbsp;:</p><ul><li><strong>08&nbsp;: Usage incorrect de Java EE</strong></li><li><strong>07&nbsp;: Utilisation abusive du XML</strong></li></ul><div
align="center"> <object
width="700" height="350"><param
name="movie" value="http://www.vcasmo.com/swf/vcasmo.swf"></param><param
name="flashvars" value="pid=619"></param><param
name="allowFullScreen" value="true"></param> <embed
src="http://www.vcasmo.com/swf/vcasmo.swf" flashvars="pid=619" allowFullScreen="true" type="application/x-shockwave-flash" width="700" height="350"></embed></object></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/09/19/top-ten-des-problemes-de-performances-des-applications-j2ee-8-7/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Top ten des problèmes de performances des applications J2EE (10 &amp; 9)</title><link>http://blog.xebia.fr/2007/09/13/top-ten-des-problemes-de-performances-des-applications-j2ee-10-9/</link> <comments>http://blog.xebia.fr/2007/09/13/top-ten-des-problemes-de-performances-des-applications-j2ee-10-9/#comments</comments> <pubDate>Thu, 13 Sep 2007 07:11:02 +0000</pubDate> <dc:creator>Guillaume Bodet</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[vidéo]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/09/13/top-ten-des-problemes-de-performances-des-applications-j2ee-10-9/</guid> <description><![CDATA[Nous vous proposons aujourd&#8217;hui la première d&#8217;une série de cinq vidéos consacrées aux problèmes de performances des applications java / J2EE. Nous y déroulerons le top 10 des problèmes de performances en environnement java&#160;/ J2EE en les illustrant par des cas concrets et en proposant pour chacun des mesures permettant de s&#8217;en prémunir. Cette vidéo [...]]]></description> <content:encoded><![CDATA[<p>Nous vous proposons aujourd&#8217;hui la première d&#8217;une série de cinq vidéos consacrées aux problèmes de performances des applications java / J2EE.<br
/> Nous y déroulerons <a
href="http://blog.xebia.fr/2007/05/03/le-top-10-des-problemes-de-performances-des-applications-j2ee/">le top 10 des problèmes de performances en environnement java&nbsp;/ J2EE</a> en les illustrant par des cas concrets et en proposant pour chacun des mesures permettant de s&#8217;en prémunir.</p><p>Cette vidéo traite des numéros&nbsp;:</p><ul><li><strong>10&nbsp;: Logging excessif</strong></li><li><strong>09&nbsp;: Mauvaise configuration du serveur d&#8217;application</strong></li></ul><div
align="center"> <object
width="700" height="350"><param
name="movie" value="http://www.vcasmo.com/swf/vcasmo.swf"></param><param
name="flashvars" value="pid=616"></param><param
name="allowFullScreen" value="true"></param> <embed
src="http://www.vcasmo.com/swf/vcasmo.swf" flashvars="pid=616" allowFullScreen="true" type="application/x-shockwave-flash" width="700" height="350"></embed></object></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/09/13/top-ten-des-problemes-de-performances-des-applications-j2ee-10-9/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Le top 10 des problèmes de performances des applications J2EE</title><link>http://blog.xebia.fr/2007/05/03/le-top-10-des-problemes-de-performances-des-applications-j2ee/</link> <comments>http://blog.xebia.fr/2007/05/03/le-top-10-des-problemes-de-performances-des-applications-j2ee/#comments</comments> <pubDate>Thu, 03 May 2007 12:38:22 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[J2EE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/05/03/le-top-10-des-problemes-de-performances-des-applications-j2ee/</guid> <description><![CDATA[Depuis deux mois et demi, Vincent Partington a déroulé sur le blog de Xebia.com, les 10 principaux problèmes de performance des applications Java / J2EE. Voici le classement: #10 &#8211; Logging excessif #09 &#8211; Mauvaise configuration du serveur d&#8217;application #08 &#8211; Usage incorrecte de Java EE #07 &#8211; Utilisation abusive du XML #06 &#8211; Mauvaise [...]]]></description> <content:encoded><![CDATA[<p>Depuis deux mois et demi, Vincent Partington a déroulé sur le blog de Xebia.com, les 10 principaux problèmes de performance des applications Java / J2EE. Voici le classement:</p><ul><li>#10 &#8211; <a
href="http://blog.xebia.com/2007/02/18/ejapp-top-10-countdown-10-excessive-logging/">Logging excessif</a></li><li>#09 &#8211; <a
href="http://blog.xebia.com/2007/02/25/ejapp-top-10-countdown-9-incorrect-application-server-configuration/">Mauvaise configuration du serveur d&#8217;application</a></li><li>#08 &#8211; <a
href="http://blog.xebia.com/2007/03/09/ejapp-top-10-countdown-8-incorrect-usage-of-java-ee/">Usage incorrecte de Java EE</a></li><li>#07 &#8211; <a
href="http://blog.xebia.com/2007/03/19/ejapp-top-10-countdown-7-unnecessary-use-of-xml/">Utilisation abusive du XML</a></li><li>#06 &#8211; <a
href="http://blog.xebia.com/2007/03/26/ejapp-top-10-countdown-6-improper-caching/">Mauvaise utilisation des fonctions de &#8216;Cache&#8217;</a></li><li>#05 &#8211; <a
href="http://blog.xebia.com/2007/04/02/ejapp-top-10-countdown-5-excessive-memory-usage/">Consommation mémoire</a></li><li>#04 &#8211; <a
href="http://blog.xebia.com/2007/04/16/ejapp-top-10-countdown-4-badly-performing-libraries/">Mauvaises performances des bibliothèques tierces</a></li><li>#03 &#8211; <a
href="http://blog.xebia.com/2007/04/22/ejapp-top-10-countdown-3-incorrectly-implemented-concurrency/">Mauvaise gestion de la concurrence</a></li><li>#02 &#8211; <a
href="http://blog.xebia.com/2007/04/25/ejapp-top-10-countdown-2-unnecessary-remoting/">Utilisation abusive de la distribution</a></li><li>#01 &#8211; <a
href="http://blog.xebia.com/2007/04/29/ejapp-top-10-countdown-1-incorrect-database-usage/">Mauvaise utilisation de la base de données</a></li></ul><p>De ce classement, Vincent Partington tire les conclusions suivantes:</p><ul><li>Tout d&#8217;abord, les architectes et développeurs Java devraient considérer la performance comme une exigence de leur application, à toutes les étapes du projet.</li><li>Ensuite, les équipes de développement ont besoin de collaborer avec des personnes qui peuvent les aider à améliorer les performances de leurs applications, en particulier les administrateurs de serveurs d&#8217;applications et les DBA.</li><li>Enfin, la performance requiert des connaissances dans un grand nombre de domaines, dont ce Top Ten met en avant les plus critiques. Pour un tour d&#8217;horizon plus complet, un bon point de départ est le site web <a
href="http://www.javaperformancetuning.com/tips/index.shtml">the Java Performance Tuning</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/05/03/le-top-10-des-problemes-de-performances-des-applications-j2ee/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>La prise de mesure en AOP avec JAMon</title><link>http://blog.xebia.fr/2007/05/02/la-prise-de-mesure-en-aop-avec-jamon/</link> <comments>http://blog.xebia.fr/2007/05/02/la-prise-de-mesure-en-aop-avec-jamon/#comments</comments> <pubDate>Wed, 02 May 2007 14:18:10 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[AOP]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Performance]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/05/02/la-prise-de-mesure-en-aop-avec-jamon/</guid> <description><![CDATA[Voici un article qui propose une solution pour effectuer des mesures de performance en s'appuyant sur l'AOP (Aspect Oriented Programmation). L'exemple suivant propose d'utiliser l'implémentation <a
href="http://www.eclipse.org/aspectj/">AspectJ</a> couplée avec l'outil Open Source <a
href="http://jamonapi.sourceforge.net">JAMon</a>.]]></description> <content:encoded><![CDATA[<p>Voici un article qui propose une solution pour effectuer des mesures de performance en s&#8217;appuyant sur l&#8217;AOP (Aspect Oriented Programmation). L&#8217;exemple suivant propose d&#8217;utiliser l&#8217;implémentation <a
href="http://www.eclipse.org/aspectj/">AspectJ</a> couplée avec l&#8217;outil Open Source <a
href="http://jamonapi.sourceforge.net">JAMon</a>.</p><p>J&#8217;ai assisté, il y a peu, à une excellente présentation de l&#8217;AOP et de AspectJ plus particulièrement. J&#8217;ai tout de suite été séduit et j&#8217;ai donc cherché des applications pratiques pour ce genre de technologie.<br
/> Le cas d&#8217;école pour apprendre l&#8217;AOP que l&#8217;on trouve régulièrement est l&#8217;exemple du logging.</p><pre class="brush: java; title: ; notranslate">
public aspect LoggerAspect {
	pointcut log() : call(* *.methodToLog(..));
	before() : log() {
		System.out.println(&quot;Avant l'exécution de&quot;+thisJoinPoint.toShortString()) ;
	}
	after() : log() {
		System.out.println(&quot;Après l'exécution de&quot;+thisJoinPoint.toShortString()) ;
	}
}
</pre><p>Cet aspect affiche un message avant et après l&#8217;appel de la méthode.</p><p>Je vous propose ici de modifier cet exemple pour effectuer des mesures de performance dans une application.<br
/> Pour cela nous pouvons utiliser <a
href="http://jamonapi.sourceforge.net">JAMon</a> qui permet de positionner simplement des prises de mesure et de les consulter au travers d&#8217;une application web fournie. Dans JAMon, on utilise des <a
href="http://jamonapi.sourceforge.net/javadoc/com/jamonapi/Monitor.html">Monitor</a> auquel on associe un nom logique.</p><p>Pour notre prise de mesure, nous voulons savoir combien de temps on passe dans telle ou telle partie de code. A la différence de l&#8217;exemple du login, le pointcut que nous allons définir va utiliser le mot-clé <em>execution</em> plutot que <em>call</em> pour se positionner au plus près du code exécuté.</p><p>La définition du _poincut_ sera d&#8217;autant plus simple si le code que l&#8217;on doit monitorer a été contraint par des règles de nommage ou si les éléments du code utilise ou hérite d&#8217;un framework.</p><p>Exemple :</p><pre class="brush: java; title: ; notranslate">
pointcut monitor() : execution(* *.*Service.*(..)) ; // Correspond à toutes les méthodes des classes qui finissent par &lt;em&gt;Service&lt;/em&gt;
pointcut monitor() : execution(* *.GenericService+.*(..)) ; // Correspond à toutes les méthodes des classes qui héritent de la classe &lt;em&gt;GenericService&lt;/em&gt;
pointcut monitor() : execution(* *.services.*.add*(..)) ; // Correspond à toutes les méthodes qui commencent par &lt;em&gt;add&lt;/em&gt; des classes qui sont dans le package *.services.*
</pre><p>Ensuite, Il faut définir l&#8217;<em>advice</em>. Nous voulons savoir combien de temps prend l&#8217;exécution des méthodes correspondant au pointcut. Nous utiliserons donc le mot-clé <em>arround()</em> qui permet d&#8217;effectuer des pré\- et post-traitements.</p><p>Puisque nous allons positionner ces prises de mesure avec de l&#8217;AOP, nous utiliserons <em>thisJointPoint.toShortString()</em> (qui donne le nom court du pointcut) comme nom pour le Monitor JAMon que nous positionnerons.</p><p>Voici l&#8217;exemple complet :</p><pre class="brush: java; title: ; notranslate">
public aspect PerfMonitor {
	pointcut monitor() : execution(* *.ClassToMonitor.methodToMonitor(..)) ;
	Object arround() : monitor() {
		Monitor monitor = MonitorFactory.start(thisJoinPoint.toShortString());
		Object returnedObject = proceed();
		monitor.stop();
		// Si on veut avoir une trace de la mesure dans les logs
		// LogFactory.getLog(getClass()).debug(monitor.toString()) ;
		return returnedObject;
	}
}
</pre><p>Une fois, notre aspect définit, nous allons pouvoir voir ce que donne notre prise de mesure.</p><p>La distribution de JAMon contient une application web qui permet de visualiser les statistiques des différents Monitor positionnés dans le code.</p><p>Pour que cela fonctionne simplement, il suffit de déposer le fichier jamon.jar dans le répertoire de librairie partagée (ex: common/lib sous Tomcat) afin que les classes de JAMon soient chargées par le &laquo;&nbsp;system class loader&nbsp;&raquo;. Ensuite, déployer l&#8217;application web <em>jamon.war</em> comme n&#8217;importe quelle application.</p><p>Une fois votre application démarrée, vous pouvez accéder à la page <em>http://webserver/jamon/jamonadmin.jsp</em> pour voir les statistiques produites par le monitoring de votre code.</p><p
align="center">Voici un exemple du rendu de cette page :<br
/> <a
href="http://blog.xebia.fr/wp-content/uploads/2007/05/jamon-screenshot.jpg" title="JAMon"><img
src="http://blog.xebia.fr/wp-content/uploads/2007/05/jamon-screenshot.miniature.jpg" alt="JAMon" /></a></p><p>Remarque : JAMon fournit d&#8217;autres possibilités de prise de mesure :</p><ul><li>le <a
href="http://jamonapi.sourceforge.net/#ServletFilter" target="_blank">ServletFilter JAMon</a> qui va mesurer le temps de chargement de chaque page  pour avoir un aperçu global des performances de l&#8217;application.</li><li>le <a
href="http://jamonapi.sourceforge.net/javadoc/com/jamonapi/proxy/JAMonDriver.html" target="_blank">JAMonDriver</a> ou la <a
href="http://jamonapi.sourceforge.net/javadoc/com/jamonapi/proxy/JAMonDataSource.html" target="_blank">JAMonDataSource</a> qui encapsule le vrai driver JDBC pour mesurer les accès à la base de données.</li></ul><p>Ce genre d&#8217;outil est surtout en mode &laquo;&nbsp;diagnostic&nbsp;&raquo; pour trouver et optimiser les traitements coûteux plutôt que pour effectuer de véritables tests de performance sur une application.<br
/> L&#8217;avantage de le combiner avec de l&#8217;AOP, c&#8217;est de permettre de « monitorer » des traitements dont nous n&#8217;avons pas le code source.</p><p>L&#8217;outil <a
href="http://www.glassbox.com" target="_blank">Glassbox</a> qui permet de faire des prises mesures automatiquement dans une application se base justement sur l&#8217;AOP pour positionner ses messures.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/05/02/la-prise-de-mesure-en-aop-avec-jamon/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
