<?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/"
	>

<channel>
	<title>Decrypt &#187; KDE</title>
	<atom:link href="http://decrypt.ysance.com/tag/kde/feed/" rel="self" type="application/rss+xml" />
	<link>http://decrypt.ysance.com</link>
	<description>Le site de decryptage des technologies de l&#039;informatique</description>
	<lastBuildDate>Fri, 03 Feb 2012 08:25:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Profiling applicatif et XDebug</title>
		<link>http://decrypt.ysance.com/2009/08/profiling-applicatif-xdebug/</link>
		<comments>http://decrypt.ysance.com/2009/08/profiling-applicatif-xdebug/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 16:02:56 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Profiling]]></category>
		<category><![CDATA[Code Profiling]]></category>
		<category><![CDATA[Cygwin]]></category>
		<category><![CDATA[DynaTrace]]></category>
		<category><![CDATA[KCacheGrind]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Webgrind]]></category>
		<category><![CDATA[XDebug]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=530</guid>
		<description><![CDATA[Optimiser les performances d'un site doit passer avant tout chose par le profiling applicatif et c'est bien souvent là que l'on peut gagner une bonne partie des temps de réponse et optimiser la charge à moindre coût. Le profiling applicatif constiste à analyser l'exécution du code que l'on a mis en place pour voir les dépendances entre les méthodes/fonctions, le nombre de fois qu'elles sont appelées et surtout le temps que l'on passe dans chacune d'elles. Une fois ces informations extraites, une partie importante du travail est délivrée par les outils de mise en page (frontend) qui vont nous présenter les résultats agrégés de manière plus intelligible et analysable.

[...]]]></description>
			<content:encoded><![CDATA[<p>Optimiser les performances d&#8217;un site doit passer avant tout chose par le profiling applicatif et c&#8217;est bien souvent là que l&#8217;on peut gagner une bonne partie des temps de réponse et optimiser la charge à moindre coût. Le profiling applicatif constiste à analyser l&#8217;exécution du code que l&#8217;on a mis en place pour voir les dépendances entre les méthodes/fonctions, le nombre de fois qu&#8217;elles sont appelées et surtout le temps que l&#8217;on passe dans chacune d&#8217;elles. Une fois ces informations extraites, une partie importante du travail est délivrée par les outils de mise en page (frontend) qui vont nous présenter les résultats agrégés de manière plus intelligible et analysable.</p>
<p><strong><em>Commençons par le début</em></strong><br />
Avant de passer à la phase de code profiling, rappelons quelques unes des premières règles à respecter dans tout développement :</p>
<ul>
<li>Un code modulaire afin de pouvoir le faire évoluer rapidement, par exemple en changeant le mode d&#8217;accès au stockage de données pour toute l&#8217;application en modifiant une seule méthode centralisée, en optimisant les temps de réponse de l&#8217;application par la modification d&#8217;une fonctionnalité appelée dans tout le code, &#8230;</li>
<li>Une séparation de l’IHM et du traitement.</li>
<li>Une séparation des fonctionnalités de l’application et des APIs.</li>
<li>Une séparation des ressources et du code.</li>
<li>Le respect de cinématiques éprouvées de récupération, traitement et affichage des données afin de ne pas maintenir de connexions inutiles aux ressources : gestion d’un pool de connexions afin d’optimiser les temps d’accès aux ressources, connexion aux ressources, récupération des données avec groupage des requêtes, fermeture (ou plutôt replacement dans le pool) de la connexion, traitement des informations récupérées, affichage (HTML, &#8230;).</li>
<li>L&#8217;utilisation des types de variables correspondant aux valeurs à positionner dedans afin d&#8217;optimiser l&#8217;espace requis en mémoire ou en base (par exemple, ne pas mettre un entier dans un varchar&#8230;).</li>
<li>&#8230;</li>
</ul>
<p>La phase de conception du code et le respect des règles fondamentales sont les fondements de toute application. En respectant ces règles, vous partez sur des bases solides et surtout laissez la porte ouverte à des évolutions rapides suite aux informations remontées par les outils de profiling. Par exemple, si le code n&#8217;est pas modulaire et que l&#8217;on retrouve la cinématique de connexion aux données partout dans le code, et si le profiling du code indique qu&#8217;il faut remplacer la méthode d&#8217;accès aux données&#8230; Cela risque d&#8217;être fastidieux.</p>
<p><strong><em>Le profiling par l&#8217;exemple, XDebug</em></strong><br />
<a title="Site de XDebug" href="http://www.xdebug.org/">XDebug</a> est un outil de code profiling pour PHP.</p>
<p><img class="size-full wp-image-535" title="Logo XDebug" src="http://decrypt.ysance.com/wp-content/uploads/2009/08/xdebug-logo.png" alt="Logo XDebug" width="200" height="116" /></p>
<p>L&#8217;installation est on ne peut plus simple, disons sous Ubuntu par exemple :</p>
<p><span style="color: #339966;">apt-get install php5-xdebug</span></p>
<p>La première chose à faire est de choisir le déclenchement du profiling. Le profiling étant très verbeux et présentant un overhead certain, je vous conseille le mode trigger dans le xdebug.ini :</p>
<p><span style="color: #339966;">xdebug.profiler_enable_trigger=1</span></p>
<p>Cela permettra de ne déclencher l&#8217;analyse du code et la génération de traces que sur l&#8217;envoi du paramètre XDEBUG_PROFILE en GET/POST, par exemple : http://localhost/samplepage.php?XDEBUG_PROFILE</p>
<p>Ce paramétrage vous permet également de mettre en place cet outil sur l&#8217;environnement de production. A noter de faire attention tout de même sur les sites ouverts au grand public de ne pas se faire avoir par un hackeur taquin qui pourrait provoquer un DOS (Deny Of Service ou déni de service) en appelant vos URLs systématiquement avec ce paramètre ! ;ob Mais ces considérations sont un peu extrémistes et je n&#8217;ai jamais rencontré le problème.</p>
<p>Paramétrez également le fichier de destination des traces dans le xdebug.ini :</p>
<p><span style="color: #339966;">xdebug.profiler_output_dir=/mnt/xdebug</span></p>
<p>C&#8217;est ce répertoire qui sera utilisé par votre outil d&#8217;analyse de traces.</p>
<p>Voilà le type de résultat obtenu :</p>
<p><span style="color: #339966;">&#8230;</span></p>
<p><span style="color: #339966;">cfn=php::number_format<br />
calls=1 0 0<br />
363 1</span></p>
<p><span style="color: #339966;">fl=php:internal<br />
fn=php::str_replace<br />
340 2</span></p>
<p><span style="color: #339966;">fl=/var/www/mon_site/mon_fichier.inc.php<br />
fn=SimplePrint<br />
39 15<br />
cfn=php::str_replace<br />
calls=1 0 0<br />
340 2</span></p>
<p><span style="color: #339966;">fl=php:internal<br />
fn=php::number_format<br />
363 2</span></p>
<p><span style="color: #339966;">fl=/var/www/mon_site/mon_fichier.inc.php<br />
fn=makeNumberFormat<br />
40 19<br />
cfn=php::number_format<br />
calls=1 0 0<br />
363 2</span></p>
<p><span style="color: #339966;">&#8230;</span></p>
<p>C&#8217;est là qu&#8217;intervient le frontend</p>
<p><em><strong>KCacheGrind, puissant mais&#8230; sur KDE</strong></em><br />
<a title="Site de KCacheGrind" href="http://kcachegrind.sourceforge.net/html/Home.html">KCacheGrind</a> est en effet l&#8217;outil le plus complet que j&#8217;ai vu pour l&#8217;analyse de ces traces, cependant il ne fonctionne que dans un environnement KDE. &laquo;&nbsp;Sous Linux donc !&nbsp;&raquo; me direz-vous&#8230; Pas forcément. KDE fonctionne sur un certain nombre d&#8217;UNIX et a été porté sur Windows (<a title="Site de KDE on CygWin" href="http://kde-cygwin.sourceforge.net/">KDE on CygWin</a>), et même sur MacOS X (<a title="Site de Fink project" href="http://www.finkproject.org/">Fink project</a>).</p>
<p>Heureux (ou pas) utilisateur de Windows (Vista), je n&#8217;ai pu résister à vouloir l&#8217;installer sur mon poste. Il faut tout d&#8217;abord avoir installé <a title="Site de Cygwin" href="http://www.cygwin.com/">Cygwin</a> qui est un émulateur Linux pour Windows qui permet de retrouver les commandes et outils Linux sur son Windows dans un environement émulé (bluffant je dois dire sur certaines commandes). Non intrusif, il installe dans un répertoire une arborescence *NIX et se lance via un &laquo;&nbsp;.bat&nbsp;&raquo;. Là où j&#8217;ai rencontré quelques difficultés, c&#8217;est pour l&#8217;installation du KDE sur Cygwin. Problème sur la version du KDE, problème sur un package de la distribution Cygwin, &#8230; Problème Vista ? Je n&#8217;ai pas eu le temps de pousser les investigations plus loin. Mais je ne doute pas que la combo fonctionne.</p>
<p>Si vous êtes un heureux possesseur d&#8217;un Linux, allez-y.</p>
<p>KcacheGrind propose des analyses poussées et surtout un système de graphes qui représentent les appels et dépendances entre les méthodes/fonctions.</p>
<div id="attachment_534" class="wp-caption alignnone" style="width: 530px"><img class="size-full wp-image-534" title="KCacheGrind" src="http://decrypt.ysance.com/wp-content/uploads/2009/08/KCacheGrind.gif" alt="KCacheGrind" width="520" height="436" /><p class="wp-caption-text">KCacheGrind</p></div>
<p>Très complet, il est cependant difficile de l&#8217;installer sur un environnement de production ou tout simplement sur un environnement de développement mutualisé du fait des dépendances au KDE. Il faut rappatrier les traces sur son desktop pour les analyser et correspond plus à des analyses de traces ponctuelles, à mon avis, dans un environnement de développement mutualisé, car difficile à intégrer sur la plateforme distante.</p>
<p><strong><em>Webgrind</em></strong><br />
<a title="Site de Webgrind" href="http://code.google.com/p/webgrind/">Webgrind</a> propose un sous-ensemble des fonctionnalités de KCacheGrind. On ne retrouvera pas notamment les graphes pourtant si pratiques. Cependant, son installation est moins contraignante (voire carrément simple) et il est plus facilement intégrable sur un environnement de développement mutualisé accessible à tous (accès via serveur web). Il suffit de faire pointer l&#8217;outil vers le répertoire de sortie de XDebug et on a l&#8217;anayse de la trace en direct.</p>
<div id="attachment_533" class="wp-caption alignnone" style="width: 762px"><img class="size-full wp-image-533" title="Webgrind" src="http://decrypt.ysance.com/wp-content/uploads/2009/08/Webgrind.png" alt="Webgrind" width="752" height="353" /><p class="wp-caption-text">Webgrind</p></div>
<p>Il permet de voir en un clin d&#8217;oeil les appels consommateurs de ressources et de temps et donc d&#8217;identifier les éléments du code à améliorer ou bien les librairies utilisées à réexaminer.</p>
<p><strong><em>Le profiling oui, mais pas forcément PHP</em></strong><br />
Evidemment, cet exemple que je viens de donner avec l&#8217;outil XDebug peut être mis en oeuvre sur d&#8217;autres langages et également sur d&#8217;autres portées, tout dépend des outils de profiling que l&#8217;on va utiliser et leur cible.</p>
<p>Par exemple, j&#8217;ai regardé rapidement un outil qui a l&#8217;air intéressant et qui s&#8217;appelle <a title="Site de DynaTrace" href="http://www.dynatrace.com/">DynaTrace</a> : DynaTrace permet de tracer les technologies Java et .Net. Sa portée est plus importante car elle va du code jusqu&#8217;à la conservation de traces des transactions sur une architecture distribuée (comprendre SOA), cela implique probablement d&#8217;avoir des agents sur chaque serveur sur lequel s&#8217;exécute une partie du code et que les informations sont agrégées par la suite sur un serveur central sur lequel est installé un composant de la solution. Un viewer permet ensuite de visualiser et de naviguer dans les exports de ces traces. Il est aussi possible de mettre cette solution autant en développement qu&#8217;en production (probablement un déclenchement sur trigger, que ce soit par envoi d&#8217;un paramètre dans l&#8217;URL ou peut-être sur détection d&#8217;une erreur lors de l&#8217;exécution d&#8217;un code). Voilà donc une autre solution qui permet de tracer l&#8217;exécution du code dans 2 autres langages, mais aussi avec une portée plus importante puisqu&#8217;elle gère la notion de transactions sur une architecture distribuée (à approfondir, car les possibilités sont vastes et la solution probablement pas exhaustive non plus) et avec des possibités de monitoring. Je regarderai cette solution plus attentivement, si j&#8217;en ai l&#8217;occasion.</p>
<p>Cette solution, en revanche, n&#8217;est pas open source et est soumise à un système de licence payante.</p>
<p><strong><em>Conclusion</em></strong><br />
Le profiling de code est, comme je le précisais en accroche, le moyen le plus rapide et le moins coûteux d&#8217;obtenir des gains de performances sur un site ou une application. Il est toujours (enfin j&#8217;espère&#8230;) plus aisé de modifier quelques lignes de code que de modifier les services ou l&#8217;infrastructure sous-jacente. Il repose tout de même sur de bonnes pratiques de développement afin d&#8217;être efficace et surtout afin de pouvoir mettre en oeuvre aisément les modifications qui découleront de l&#8217;analyse de l&#8217;exécution de code fournie.</p>
<p>Il est intéressant d&#8217;intégrer le profiling directement dans les environnements de développement/intégration et de se laisser la possibilité de l&#8217;utiliser dans l&#8217;environnement cible de production.</p>
<p><strong><em> Frédéric FAURE</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2009/08/profiling-applicatif-xdebug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

