<?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>Performance web &#187; serveur</title>
	<atom:link href="http://performance.survol.fr/avec/serveur/feed/" rel="self" type="application/rss+xml" />
	<link>http://performance.survol.fr</link>
	<description>Quelques mots pour des sites web rapides</description>
	<lastBuildDate>Fri, 18 Jun 2010 12:47:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Google SDCH et HTTP</title>
		<link>http://performance.survol.fr/2009/02/google-sdch-et-http/</link>
		<comments>http://performance.survol.fr/2009/02/google-sdch-et-http/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 11:00:50 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[etag]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Google toolbar]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Microsoft Internet Explorer]]></category>
		<category><![CDATA[sdch]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=401</guid>
		<description><![CDATA[On vous a dit de compresser vos échanges HTTP avec gzip ou deflate, des les identifier avec des ETag, mais pouvons nous faire mieux ? C&#8217;est la question abordée par certaines équipes de Google (slides disponibles) en juin dernier aux &#8230; <a href="http://performance.survol.fr/2009/02/google-sdch-et-http/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>On vous a dit de c<a href="http://performance.survol.fr/2008/04/compression-avant-transfert/">ompresser vos échanges HTTP avec gzip ou deflate</a>, des les <a href="http://performance.survol.fr/2008/06/desactiver-les-etags/">identifier avec des ETag</a>, mais pouvons nous faire mieux ? C&#8217;est <a href="http://en.oreilly.com/velocity2008/public/schedule/detail/2598">la question abordée par certaines équipes de Google</a> (<a href="http://assets.en.oreilly.com/1/event/7/Shared%20Dictionary%20Compression%20Over%20HTTP%20Presentation.ppt">slides disponibles</a>) en juin dernier aux <a href="http://en.oreilly.com/velocity2008/">conférences Velocity 2008</a>. Ils partent du principe qu&#8217;une page web est composée de plusieurs éléments, dont certains sont communs à plusieurs pages et ne nécessitent pas d&#8217;être renvoyés.</p>
<p>Google propose donc <a href="http://sdch.googlegroups.com/web/Shared_Dictionary_Compression_over_HTTP.pdf?gda=Znx6Cl0AAABP1YGtttuzY8Xt5fWEme6RW917cp3OCWgHAcxHpzR4UA12alwZyuoqsE-BiY88xfLrk0HuZRJs1gcUl6mErWX6yPI8Lq4cE5IelfQO528z8OU2_747KStNgkfeVUa7Znk">un codage supplémentaire pour HTTP qui s&#8217;appelle SDCH</a>,<span id="more-401"></span> et qui peut s&#8217;ajouter avant gzip ou deflate. Le serveur découpe sa page en paquets, qui peuvent chacun avoir des métadonnées et une expiration explicite. Le tout est stocké dans un dictionnaire du côté du navigateur, un peu comme les cookies actuellement. Quand le navigateur demande une page il envoie les identifiants de paquet qu&#8217;il connaît déjà, le serveur peut donc se contenter de compléter ce qui manque. On a donc le même fonctionnement que les Etag du point de vue de la négociation.</p>
<p>Les entêtes HTTP en jeu sont <code>Avail-Dictionnary</code> (l&#8217;équivalent de <code>Etag</code> pour SDCH) et <code>X-SDHC</code> (pour déclarer la version et l&#8217;implémentation de SDCH utilisée) du côté du navigateur, et <code>X-SDCH-Dictionary</code> du côté du serveur.</p>
<p>Reste que cela implique que la réponse du serveur soit codée suivant une forme bien particulière, non compatible avec les anciens clients HTTP. Google a donc prévu une auto-négociation et la réutilisation de l&#8217;entête Accept-Encoding. Grâce à cela, les navigateurs qui le peuvent auront un contenu SDCH puis compressé par gzip, les autres se contenteront du gzip.</p>
<p>Si vous voyez passer un <code>Accept-Encoding: sdch, gzip</code> c&#8217;est que votre navigateur supporte ce codage. Si en plus vous voyez une réponse <code>Content-Encoding: sdch, gzip</code> c&#8217;est que le serveur a bien compris que vous supportiez SDCH et va utiliser ce codage.</p>
<p> Je n&#8217;ai vu aucun mouvement ni aucune volonté de mouvement de la part de Mozilla, en fait depuis la communication de Google l&#8217;idée n&#8217;a pas l&#8217;air d&#8217;avoir fait recette où que ce soit. Seul <a href="http://groups.google.com/group/SDCH">un groupe de discussion</a>, quasi vide, a fait suite à la communication de juin 2008.</p>
<p><a href="http://groups.google.com/group/chromium-dev/browse_thread/thread/f3e9b8f3ea603129?pli=1">Chrome a un premier support de SDCH</a> (non activé par défaut pour la version publique actuelle) mais ça ne changera pas la face du monde. Le point intéressant est toutefois que <a href="http://googlesystem.blogspot.com/2009/02/google-search-pages-load-faster-in.html">SDCH est automatiquement intégré à Microsoft Internet Explorer si la Google toolbar est installée</a>. La page d&#8217;aide de Google indique <a href="http://www.google.com/support/toolbar/bin/answer.py?hl=en&#038;answer=113087">comment désactiver tout ça</a>. </p>
<p>Si l&#8217;idée peut être intéressante, je suis un peu étonné que Google tente de l&#8217;imposer de lui-même sans avoir le support d&#8217;au moins un intervenant (Mozilla, Opera, Apple, Microsoft) ou une publication normative officielle de type RFC. La seule chose qui sauve cet unilatéralisme est la présence d&#8217;une version dans l&#8217;auto-négociation (donc on pourra gérer d&#8217;éventuelles évolutions dans les spécifications si jamais tout le monde se met autour de la table pour en rediscuter).</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/02/google-sdch-et-http/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Plugin wordpress et outils automatiques</title>
		<link>http://performance.survol.fr/2009/01/plugin-wordpress-et-outils-automatiques/</link>
		<comments>http://performance.survol.fr/2009/01/plugin-wordpress-et-outils-automatiques/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 11:00:44 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[concaténation]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[minimisation]]></category>
		<category><![CDATA[outils]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[SmartOptimizer]]></category>
		<category><![CDATA[smushit]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-smushit]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=379</guid>
		<description><![CDATA[Parler de la performance web c&#8217;est d&#8217;abord convaincre que c&#8217;est important, puis rappeler qu&#8217;il y a quelques actions très simples à mettre en oeuvre qui ont un effet immédiat. En général je parle du cache sur les ressources statiques, et &#8230; <a href="http://performance.survol.fr/2009/01/plugin-wordpress-et-outils-automatiques/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Parler de la performance web c&#8217;est d&#8217;abord convaincre que <a href="http://performance.survol.fr/2008/06/a-quoi-ca-sert/">c&#8217;est important</a>, puis rappeler qu&#8217;il y a quelques actions très simples à mettre en oeuvre qui ont un effet immédiat. En général je parle du <a href="http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/">cache sur les ressources statiques</a>, et de la <a href="http://performance.survol.fr/2008/04/compression-avant-transfert/">compression des contenus</a>.<span id="more-379"></span></p>
<p>Reste que compresser les images correctement c&#8217;est long. <a href="http://performance.survol.fr/2008/10/verifiez-vos-images/">Smushit</a> accélère tout ça mais c&#8217;est du one shot. Ce qu&#8217;il faut c&#8217;est intégrer <a href="http://performance.survol.fr/2008/06/images-png-et-gif/">des outils comme optipng</a> dans votre processus de publication.</p>
<p>Alors voilà, pour un gros site au travail c&#8217;est réalisable avec un peu d&#8217;investissement. Sur un site de moindre importance c&#8217;est tout aussi important mais l&#8217;investissement devient lourd. C&#8217;est là que des outils automatiques sont intéressants, et le premier que je vous propose est un plugin wordpress, <a href="http://wordpress.org/extend/plugins/wp-smushit/">wp-smushit</a>, qui envoie automatiquement vos images à smushit. Plus besoin d&#8217;opérations manuelles, wordpress s&#8217;occupe de tout.</p>
<p>Le second que j&#8217;ai croisé est un script PHP qui prend la main sur tout téléchargement CSS ou Javascript : <a href="http://farhadi.ir/works/smartoptimizer">SmartOptimizer</a>. PHP permet de <a href="http://performance.survol.fr/2008/03/impact-de-la-latence-reseau/">concaténer</a>, <a href="http://performance.survol.fr/2008/04/minimiser-le-javascript/">minimiser</a>, <a href="http://performance.survol.fr/2008/06/attention-aux-compresseurs-javascript/">compresser</a>, et envoyer avec les entêtes de cache appropriées. Le résultat côté serveur est bon, mais je reste dubitatif sur l&#8217;idée de faire passer par PHP toutes les ressources statiques. Les ressources serveur vont souffrir de manière importante, et si vos serveurs deviennent lent votre performance client ne va finalement pas y gagner.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/01/plugin-wordpress-et-outils-automatiques/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Votre problème n&#8217;est pas sur la page HTML elle-même</title>
		<link>http://performance.survol.fr/2008/11/votre-probleme-nest-pas-sur-la-page-html-elle-meme/</link>
		<comments>http://performance.survol.fr/2008/11/votre-probleme-nest-pas-sur-la-page-html-elle-meme/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 11:00:52 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[chiffres]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[mesure]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[serveur]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=291</guid>
		<description><![CDATA[Parlez de performance de sites web à un ingénieur standard, le voilà déjà tentant d&#8217;optimiser son code PHP ou son code Java, et de lancer des sondes sur son serveur de bases de données. Oh, c&#8217;est important et des fois &#8230; <a href="http://performance.survol.fr/2008/11/votre-probleme-nest-pas-sur-la-page-html-elle-meme/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Parlez de performance de sites web à un ingénieur standard, le voilà déjà tentant d&#8217;optimiser son code PHP ou son code Java, et de lancer des sondes sur son serveur de bases de données. Oh, c&#8217;est important et des fois l&#8217;applicatif est vraiment mal fait, mais généralement ce n&#8217;est pas ce qui pose problème, mais alors pas du tout.<span id="more-291"></span></p>
<h3>La mesure</h3>
<p>J&#8217;ai donc repris <a href="http://performance.survol.fr/2008/10/etat-des-lieux-du-web-francais/">les chiffres de vendredi dernier</a> et j&#8217;ai tenté de mesurer combien de temps est pris par cette page HTML principale. Je compte le temps de la requête, la latence, le temps de génération de la page, et le temps de téléchargement du code source.</p>
<p>Voici mes résultats :</p>
<table border="0">
<thead>
<tr>
<th>Site</th>
<th>Page HTML</th>
<th>Chargement complet</th>
<th>%</th>
</tr>
</thead>
<tbody>
<tr>
<td>TF1</td>
<td>88 ms</td>
<td>5,0 s.</td>
<td>1,8 %</td>
</tr>
<tr>
<td>AlloCiné</td>
<td>58 ms</td>
<td>4,0 s.</td>
<td>1,5 %</td>
</tr>
<tr>
<td>Facebook</td>
<td>329 ms</td>
<td>4,6 s.</td>
<td>7,2 %</td>
</tr>
<tr>
<td>Skyrock</td>
<td>36 ms</td>
<td>3,7 s.</td>
<td>1,0 %</td>
</tr>
<tr>
<td>France Telecom</td>
<td>3,5 s</td>
<td>10,1 s.</td>
<td>34,7 %</td>
</tr>
<tr>
<td>Free &#8211; portail</td>
<td>43 ms</td>
<td>4,4 s.</td>
<td>1,0 %</td>
</tr>
<tr>
<td>Google &#8211; résultats</td>
<td>165 ms</td>
<td>0,24 s.</td>
<td>68,8 %</td>
</tr>
<tr>
<td>Yahoo! France</td>
<td>552 ms</td>
<td>1,8 s.</td>
<td>30,7 %</td>
</tr>
<tr>
<td>Daily Motion</td>
<td>204 ms</td>
<td>2,4 s.</td>
<td>8,5 %</td>
</tr>
<tr>
<td>Le Monde</td>
<td>50 ms</td>
<td>7,9 s.</td>
<td>0,7 %</td>
</tr>
<tr>
<td>Amazon France</td>
<td>930 ms</td>
<td>3,7 s.</td>
<td>25,1 %</td>
</tr>
<tr>
<td>MSN France</td>
<td>168 ms</td>
<td>0,9 s.</td>
<td>18,7 %</td>
</tr>
</tbody>
</table>
<h3>Le cas France Telecom</h3>
<p>Encore une fois, le temps pour France Telecom est pris en comptant les redirections sur la page d&#8217;accueil, et on voit ici bien pourquoi. Ces redirections plombent complètement le site puisqu&#8217;elles représentent 3,6 secondes, sur un total de 10 secondes. C&#8217;est délirant, et sans justification aucune vu la simplicité qu&#8217;il devrait y avoir dans un système de redirection de pays comme celui ci.</p>
<p>Sans ses redirections on arrive à 90 milli secondes sur un total de 6 secondes environ, donc un poids relatif de la page d&#8217;accueil inférieur à 2%.</p>
<h3>Les deux catégories</h3>
<p>Ce qui m&#8217;intéresse c&#8217;est deux choses :</p>
<p>Tout d&#8217;abord on voit que les seuls qui ont une page d&#8217;accueil significative sont ceux qui ont déjà travaillé et optimisé le côté client, et qui s&#8217;en sortent avec des performances bonnes ou honorables. Bref, avoir un bon rapport contenu / poids total est un bon critère de réussite.</p>
<p>Ensuite on voit que dans les autres, la page d&#8217;accueil, son poids, et le temps pour la générer, n&#8217;ont quasiment aucune influence significative sur le temps de chargement subit par l&#8217;utilisateur. Ce n&#8217;est clairement pas ça qu&#8217;il faut optimiser et vous pouvez laisser votre ingénieur et ses micro optimisations applicatives de côté (sauf si vous êtes à France Telecom).</p>
<h3>La conséquence</h3>
<p>Le temps de génération de la page représente une part infime, et il vaut mieux gagner 5% dans le reste du chargement que de gagner 50% sur le temps de génération de la page principale. La chance c&#8217;est que non seulement c&#8217;est plus rentable mais c&#8217;est aussi plus facile. Souvenez-vous, <a href="http://performance.survol.fr/2008/10/verifiez-vos-images/">smushit</a> c&#8217;est 10 minutes de travail pour une efficacité bien plus importante que ça.</p>
<p>Bref, <strong>travaillez sur le côté client, le retour sur investissement est bien plus important</strong>, bien bien plus.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/11/votre-probleme-nest-pas-sur-la-page-html-elle-meme/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Analyse d&#8217;une requête HTTP &#8211; serveur et réseau</title>
		<link>http://performance.survol.fr/2008/07/analyse-requete-http-serveur-et-reseau/</link>
		<comments>http://performance.survol.fr/2008/07/analyse-requete-http-serveur-et-reseau/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 10:00:02 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[minimisation]]></category>
		<category><![CDATA[pipelining]]></category>
		<category><![CDATA[réseau]]></category>
		<category><![CDATA[schéma]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[sprite]]></category>
		<category><![CDATA[tampon]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=55</guid>
		<description><![CDATA[On parle de temps, de performance, mais finalement que mesure t-on ? La question n&#8217;est pas inutile puisque pour une même requête il y a bien trois étape visibles du point de vue du visiteur, cinq du point de vue &#8230; <a href="http://performance.survol.fr/2008/07/analyse-requete-http-serveur-et-reseau/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>On parle de temps, de performance, mais finalement que mesure t-on ? La question n&#8217;est pas inutile puisque pour une même requête il y a bien trois étape visibles du point de vue du visiteur, cinq du point de vue du navigateur et autant pour le serveur. Alors, que mesure t-on ?</p>
<p><span id="more-52"></span>Je vous propose un petit schéma incomplet des interactions lors de la requête d&#8217;une page HTML (attention, aucune échelle ou proportion n&#8217;est respectée).</p>
<p><a style="text-decoration: none;" href="http://performance.survol.fr/wp-content/uploads/2008/07/http-big.png"><img class="alignnone size-full wp-image-59" title="Analyse d\'une requête HTTP" src="http://performance.survol.fr/wp-content/uploads/2008/07/http-little.png" alt="" /></a></p>
<p>Alors, vous mesurez quoi ?</p>
<p><strong>La requête DNS</strong></p>
<p>Une fois que le visiteur clique sur un lien, c&#8217;est une requête DNS qui est lancée par le navigateur et environ 30ms qui sont perdues, parfois même jusqu&#8217;à 100 ou 150ms (triangle gris sur le schéma). Microsoft Internet Explorer 6 cache cette information pendant 30 minutes mais les autres navigateurs la relancent plus souvent. Mozilla Firefox ne garde le résultat de la requête DNS que pour une petite minute. Vous l&#8217;aurez donc quasiment à chaque nouvelle page. Vous pouvez réduire l&#8217;influence des requêtes DNS en limitant le nombre de domaines et sous-domaines utilisés par votre site. <strong>Gardez le nombre de domaines en dessous de quatre</strong>.</p>
<h3>La connexion au serveur</h3>
<p>L&#8217;étape suivante c&#8217;est l&#8217;établissement de la connexion avec le serveur que vous souhaitez joindre (triangle vers sur le schéma). C&#8217;est assez rapide mais ça reste quelque chose qui va impacter les performances. <strong>Autorisez le keep-alive pour les ressources statiques</strong> (images, feuilles de styles, javascript) : Le navigateur et le serveur vont réutiliser la connexion existante au lieu de rétablir une nouvelle connexion pour chaque composant. Le gain est notable, j&#8217;en avais <a href="http://performance.survol.fr/2008/04/keep-alive-et-connexions-persistantes/">déja parlé</a>.</p>
<p>Maintenant le keep-alive c&#8217;est aussi ce qui va garder la connexion ouverte inutilement une fois que vous aurez téléchargé tous les composants. C&#8217;est le rectangle vert en bas sur le schéma. C&#8217;est coûteux pour vs serveurs. Désactivez donc le keep-alive sur le serveur qui renvoie les pages HTML, et réduisez la valeur pour les autres : cinq secondes sont bien suffisantes.</p>
<h3>La requête HTTP elle-même, et l&#8217;attente qui suit</h3>
<p>Vient ensuite la requête HTTP elle-même (parallélogramme jaune sur le schéma). Vous voyez qu&#8217;elle prend un certain temps, symbolisée par une épaisseur sur le schéma. En cumulant toutes les entêtes et un cookie classique, votre requête peut facilement prendre 1ko. Pensez donc à <strong>réduire la taille du cookie</strong>, et même à <strong>ne pas avoir de cookie pour les ressources statiques</strong> en les mettant sur un domaine tiers.</p>
<p>Par la suite, pour réduire l&#8217;influence des requêtes HTTP, il ne reste plus qu&#8217;à en faire moins. En fait c&#8217;est assez simple. Il suffit d&#8217;<strong>aggréger plusieurs fichiers en un seul</strong>, qu&#8217;on parle de <a href="http://performance.survol.fr/2008/03/strategies-doptimisation-du-cache/">CSS et javascript</a>, ou de <a href="http://performance.survol.fr/2008/06/des-sprites-jusqua-plus-soif/">sprites pour les images</a>. Vous épargnez le temps de faire la requête, mais aussi tout le temps d&#8217;attente du navigateur entre la fin de la requête et la réception de la réponse (espace blanc entre les parallélogrammes bleus et jaunes sur la ligne de temps du navigateur).</p>
<p>Une autre possibilité c&#8217;est d&#8217;envoyer plusieurs requêtes HTTP coup sur coup sans attendre les réponses. On utilise alors au mieux cet espace inutile entre la fin de la requête et le début de la réponse. On se permet même d&#8217;envoyer des donner dans un sens pendant qu&#8217;on en reçoit de l&#8217;autre côté, donc superposer des requêtes jaunes dans mon schéma avec des réponses bleues. C&#8217;est ce qui est réalisé avec le <a href="http://performance.survol.fr/2008/04/pipelining-enchainer-les-requetes-http/">pipelining HTTP</a>.</p>
<h3>Le calcul de la page par le serveur</h3>
<p>Voilà la mesure du diable. Dès qu&#8217;on parle de performance tout le monde va vite mesurer ce temps de génération des pages, en mauve sur le schéma. Même si l&#8217;échelle et les proportions ne sont pas respectées sur le schéma, il est évident que cette mesure n&#8217;est vraiment pas la a seule, ni même la plus importante. Pour des pages bien faites et des serveurs qui ne sont pas surchargées, il est très rare d&#8217;avoir des pages qui prennent plus de 100ms pour le calcul serveur. C&#8217;est généralement dix fois moins, alors que le chargement complet de la page pour le visiteur prend lui plusieurs secondes.</p>
<p>Mais surtout, c&#8217;est létape qui est souvent la première à être optimisée, et celle où il est assez complexe de gagner encore des performances si on a déjà penser au cache. <strong>Ne vous focalisez pas sur le temps de génération des pages</strong>, sauf s&#8217;il est flagrant qu&#8217;il est disproportionné par rapport aux besoins.</p>
<p>Éventuellement, si votre page peut mettre longtemps à se générer et que c&#8217;est facile à faire, vous pouvez <strong>forcer un vidage du tampon au milieu de la génération de la page</strong>, pour que l&#8217;utilisateur commence à voir le contenu réel de la page et télécharge les composants tiers pendant que le calcul de la page continue à se faire. L&#8217;équipe <a href="http://developer.yahoo.com/performance/rules.html#flush">Performance de Yahoo! en parle</a>, l&#8217;équipe Search aurait eu de bons résultats avec cette technique.</p>
<h3>Le téléchargement de la page</h3>
<p>La dernière étape du point de vue du serveur c&#8217;est le téléchargement de la page elle-même. C&#8217;est un des postes qui impactent le plus les performances. On a beau faire des publicités pour des liaisons à 24mb/s, si vous téléchargez une pages HTML à 2mb/s c&#8217;est bien. Et derrière si on compte les images, les cookies, les javascript, les feuilles de style, le flash, les vidéo, et la page HTML elle-même, ça prend du temps, incompressible.</p>
<p>Enfin certaines choses sont incompressibles, d&#8217;autres justement&#8230; vous pouver <a href="http://performance.survol.fr/2008/04/minimiser-le-javascript/">minimiser les javascript et CSS</a>, mais aussi <a href="http://performance.survol.fr/2008/04/compression-avant-transfert/">utiliser la compression HTTP</a> pour tout ce qui est fichier texte (HTML, javascript, CSS, XML, Json, etc.). Les résultats sont spectaculaires et il est facile de diviser le poids par dix, donc le temps de téléchargement d&#8217;autant.</p>
<p>On peut aussi faire bien mieux, et réduire tout le téléchargement de la page à quelques octets. Il s&#8217;agit simplement de repérer quand le navigateur a déjà une page similaire en cache, et de lui répondre un code HTTP 304 &laquo;&nbsp;la page n&#8217;a pas changée&nbsp;&raquo;. Ca fonctionne à base d&#8217;<a href="http://performance.survol.fr/2008/06/desactiver-les-etags/">ETag</a>, de date de modification et de requête conditionnelle HTTP. </p>
<h3>Et entre le visiteur et son navigateur ?</h3>
<p>Je n&#8217;ai parlé que de la partie basse du schéma, en oubliant tout ce qu&#8217;il se passe entre le navigateur et l&#8217;humain derrière son écran. Ca a l&#8217;air plus simple parce qu&#8217;il y a moins de composants en jeu, mais c&#8217;est là que se passe une bonne partie des problèmes de performance, et pas forcément les plus simples à gérer.</p>
<p>On en parlera dans un prochain billet, vous voulez bien ?</p>
<p>En attendant retenez : </p>
<ul>
<li>Le début du rendu du navigateur ne correspond pas avec le début de la réception de la page HTML.</li>
<li>La fin l&#8217;interprétation du HTML ne correspond pas du tout avec la fin de la réception de la page HTML.</li>
<li>La fin du rendu total de la page peut intervenir plusieurs secondes après la fin de la réception de la page HTML.</li>
</ul>
<p>Mais de toutes façons le jeu c&#8217;est le plus possible d&#8217;éviter tout le schéma en lui même : réduire le nombre de requêtes HTTP, soit par une réduction du nombre de composants, soit par une exploitation au mieux du cache.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/07/analyse-requete-http-serveur-et-reseau/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
