<?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; schéma</title>
	<atom:link href="http://performance.survol.fr/avec/schema/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>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>
