<?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; cache</title>
	<atom:link href="http://performance.survol.fr/avec/cache/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>Experience de voici.fr</title>
		<link>http://performance.survol.fr/2009/11/experience-de-voici-fr/</link>
		<comments>http://performance.survol.fr/2009/11/experience-de-voici-fr/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 11:00:12 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cache-control]]></category>
		<category><![CDATA[Charles-Christian Croix]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[dotclear]]></category>
		<category><![CDATA[ezPublish]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[jpegtran]]></category>
		<category><![CDATA[mod_gzip]]></category>
		<category><![CDATA[pngcrush]]></category>
		<category><![CDATA[Voici.fr]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=763</guid>
		<description><![CDATA[J&#8217;aime bien apporter un peu de retours d&#8217;expérience, pour montrer que toute la théorie fonctionne aussi en pratique. Certes il y a Yahoo!, Google, Amazon, mais ce sont des trop gros sites pour que le développeur moyen se sente impliqué. &#8230; <a href="http://performance.survol.fr/2009/11/experience-de-voici-fr/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;aime bien apporter un peu de retours d&#8217;expérience, pour montrer que toute la théorie fonctionne aussi en pratique. Certes il y a Yahoo!, Google, Amazon, mais ce sont des trop gros sites pour que le développeur moyen se sente impliqué.</p>
<p>Alors voilà, Charles-Christian Croix nous parle un peu de ce qui a été réalisé sur Voici.fr. <a href="http://www.karlesnine.com/post/2009/10/12/Voici.fr-exemple-utilisation-des-caches-web-pour-un-site-eZ-Publish-4.2-optimisation-squid-reverse-proxy-mod_expires-mod_gzip">La première étape</a> se fait via une configuration des entêtes HTTP de cache de ezPublish puis une configuration de mod_gzip sur Apache, et enfin par une configuration de mod_expires, toujours sur Apache. Il fait de même plus tard <a href="http://www.karlesnine.com/post/2009/10/22/DC2">sur une installation Dotclear</a>.<span id="more-763"></span></p>
<p>On peut regretter l&#8217;expiration très courte (une journée) accompagniée d&#8217;un <code>must-revalidate</code>, mais je me permet d&#8217;insister avec intérêt sur le <a href="http://performance.survol.fr/2008/05/prive-ou-public/"><code>Cache-Control: public</code></a> très important dans le cas d&#8217;une application PHP. EzPublish utilise très probablement les sessions PHP, qui ajoutent par défaut un <code>Cache-Control: private</code>. il faut donc le corriger.</p>
<p>Dans un autre billet on voit <a href="http://www.karlesnine.com/post/2009/10/27/Voici.fr-Interet-de-l-optimisation-web-cache-et-des-performance-des-reverses-proxys">le résultat sur le squid</a> de la gestion du cache des images et de la compression HTTP :</p>
<p style="text-align: center;"><a href="http://performance.survol.fr/wp-content/uploads/2009/11/Squid.Conf.Effect.png"><img class="aligncenter size-full wp-image-765" title="Squid.Conf.Effect" src="http://performance.survol.fr/wp-content/uploads/2009/11/Squid.Conf.Effect.png" alt="La charge du proxy inverse diminue drastiquement à partir de juillet" width="597" height="269" /></a></p>
<p>Dans une seconde partie il nous parle de <a href="http://www.karlesnine.com/post/2009/10/23/Optimision-Image-pour-le-web">compression d&#8217;images</a>. Là aussi les solutions sont connues mais c&#8217;est appréciable de voir quelqu&#8217;un le mettre en œuvre et en parler ensuite. Sur les PNG il identifie un gain moyen d&#8217;un tiers pour le poids des images. C&#8217;est plus que conséquent, et ça aura un effet visible et sur le client et sur votre infrastructure. Je me permet juste d&#8217;apporter un bémol sur l&#8217;utilisation du paramètre <code>-brute</code> de pngcrush, qui est loin d&#8217;être le meilleur compromis gain/temps.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/11/experience-de-voici-fr/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Performance ressentie avec Mozilla</title>
		<link>http://performance.survol.fr/2009/08/performance-ressentie-avec-mozilla/</link>
		<comments>http://performance.survol.fr/2009/08/performance-ressentie-avec-mozilla/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 10:00:39 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[idées]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[navigateur]]></category>
		<category><![CDATA[perception]]></category>
		<category><![CDATA[ressenti]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=741</guid>
		<description><![CDATA[Ici je m&#8217;attache beaucoup aux chiffres : temps de chargement complet, latence, nombre de composants, etc. J&#8217;ai besoin de convaincre et seuls les chiffres ont l&#8217;objectivité nécessaire pour pouvoir travailler avec des gens non convaincus. Toutefois, une fois dépassé ce &#8230; <a href="http://performance.survol.fr/2009/08/performance-ressentie-avec-mozilla/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ici je m&#8217;attache beaucoup aux chiffres : temps de chargement complet, latence, nombre de composants, etc. J&#8217;ai besoin de convaincre et seuls les chiffres ont l&#8217;objectivité nécessaire pour pouvoir travailler avec des gens non convaincus.</p>
<p>Toutefois, une fois dépassé ce stade il faudrait se détacher un peu des chiffres pour parler de performance ressentie et pas toujours de performance mesurée. Parfois peu importe la durée de l&#8217;attente si on voit que nous progressons régulièrement et que l&#8217;attente n&#8217;est pas frustrante en elle même. C&#8217;est vrai aux caisses d&#8217;un supermarché comme sur une page web.</p>
<p>Les éditeurs de navigateurs l&#8217;ont bien compris. Ils jouent sur les indicateurs de chargement et sur l&#8217;interface pour donner une impression de vitesse à l&#8217;utilisateur. L&#8217;impression de vitesse est l&#8217;unique chose qui compte pour ce dernier, même si au final ça veut dire que les temps mesurés sont objectivement plus lents.</p>
<p>C&#8217;est avec cette idée en tête que je vous propose de lire le document de <a href="https://wiki.mozilla.org/Perceived_Performance">Mozilla à propos de la performance perçue</a>. On y retrouve certaines techniques à mettre en oeuvre sur les versions actuelles ou futures de Firefox. Le document mériterait une traduction tellement il fourmille d&#8217;idées, dont certaines sont lumineuses.  Je vous en retransmet certaines, avec mes commentaires.<span id="more-741"></span></p>
<h3>Dans les &laquo;&nbsp;on reste très classique&nbsp;&raquo;</h3>
<p>Préchargement de Firefox au démarage de windows : On va _encore_ ralentir l&#8217;ouverture de session pour pouvoir avoir une ouverture quasi instantanée de Firefox lors du clic sur l&#8217;icone. Le résultat sur le ressenti de performance est évident mais je suis assez mitigé. J&#8217;en ai ma claque des sessions qui prennent 5 minutes à s&#8217;ouvrir à cause de tout ce qui est chargé dans le systray. Là on déshabille Paul pour habiller Pierre et on donne l&#8217;impression à l&#8217;utilisateur que c&#8217;est la faute de Paul. Je comprend l&#8217;effet mais je n&#8217;aime pas le principe.</p>
<p>Garder le logiciel ouvert un bref moment après sa fermeture, au cas où l&#8217;utilisateur le réouvre juste après : Ca me fait penser à la fermeture de session de mon poste Linux. Il prend en compte mais n&#8217;éteint le poste que 60 secondes après la demande (sauf si je confirme ma demande), me laissant la possibilité de changer d&#8217;avis. J&#8217;aime bien le principe mais normalement l&#8217;OS fait une partie du travail en mettant en cache toutes les bibliothèques logicielles. Normalement un second démarage est déjà plus rapide. Si ce n&#8217;est pas le cas je préfèrerai qu&#8217;ils trouvent pourquoi plutôt que de chercher des astuces (oui, je sais, c&#8217;est facile à dire).</p>
<p>Installer un intersticiel (splash screen) : C&#8217;est assez dangereux. D&#8217;un côté on donne immédiatement un feedback à l&#8217;utilisateur, ce qui est très bien pour donner une impression de réactivité et éviter qu&#8217;il lance deux fois le navigateur en pensant que ça n&#8217;a pas fonctionner (je compatis, ça m&#8217;arrive régulièrement), de l&#8217;autre on va renforcer l&#8217;idée de l&#8217;utilisateur qu&#8217;il s&#8217;agit d&#8217;un logiciel long à charger alors que d&#8217;autres sont instantanés sans intersticiel.</p>
<h3>Dans les &laquo;&nbsp;c&#8217;est astucieux&nbsp;&raquo;</h3>
<p>Accélérer l&#8217;indicateur de chargement : Ils disent qu&#8217;ils le font à chaque version. Un indicateur qui tourne plus rapidement c&#8217;est pour l&#8217;utilisateur un logiciel qui fonctionne plus rapidement. C&#8217;est idiot mais on a tous le même ressenti inconscient. Par contre on va vite arriver à une limite pour ce genre d&#8217;astuces.</p>
<p>Avoir une progression non linéaire pour l&#8217;indicateur de progression : Faire qu&#8217;il avance plus lentement au début (quand l&#8217;utilisateur accepte l&#8217;attente) et plus rapidement vers la fin (quand il en a marre et a besoin de voir que &laquo;&nbsp;ça avance bien&nbsp;&raquo;). Dans le même ordre d&#8217;idée la suggestion précédente propose de faire accélérer l&#8217;indicateur de chargement (celui qui tourne) avec le temps.</p>
<h3>Dans la catégorie &laquo;&nbsp;ça c&#8217;est génial&nbsp;&raquo;</h3>
<p>Utiliser les composants en cache en attendant de vérifier qu&#8217;ils sont toujours frais : J&#8217;adore l&#8217;idée. Il s&#8217;agit d&#8217;utiliser les feuilles de styles, les images en cache en parallèle aux requêtes HTTP de revalidation. S&#8217;il s&#8217;avère que le contenu a changé, alors on mettra la page à jour. On tient là une réelle avancée. Il faudrait peut être toutefois montrer à l&#8217;utilisateur que l&#8217;image en question est potentiellement temporaire (par exemple la griser légèrement, ou monter le gamma : l&#8217;image reste visible mais on voit qu&#8217;elle est &laquo;&nbsp;en cours&nbsp;&raquo;).</p>
<p>Dans le même ordre d&#8217;idée on propose, à défaut de réutiliser les images elles-mêmes, de réserver la place dans le rendu en fonction de la taille de l&#8217;image qui est en cache. On évite de trop triturer la page, ce qui est une bonne chose, mais là je suis moins enthousiaste. Sur une page ou une connexion lente, ça peut inciter à réserver des places vides pendant longtemps, et déteriorer le ressenti utilisateur au lieu de l&#8217;améliorer. Je préfère nettement l&#8217;idée d&#8217;utiliser l&#8217;image elle-même, car l&#8217;utilisateur a au moins un contenu utile.</p>
<p>Mieux, on propose même de lancer immédiatement des requêtes vers les scripts et feuilles de styles référencées dans la page en cache en attendant de recevoir la nouvelle page. C&#8217;est quelque chose qui peut réduire le chargement de la page de plusieurs centaines de milli-secondes, plus sur les pages HTML vraiment lentes. Je ne sais cependant pas si le rapport bénéfice sur complexité est assez intéressant pour que ce soit implémenté. Il faudrait en effet que ces requêtes aient une basse priorité par rapport aux autres requêtes (histoire qu&#8217;on ne précharge pas en priorité des choses qui sont potentiellement inutiles) et que ces requêtes soient annulées dès qu&#8217;on sait que la page HTML a changée.</p>
<p>Plus intéressant encore : charger la page à partir du cache en attendant que la nouvelle page soit chargée. L&#8217;idée est intéressante mais la réalisation risque d&#8217;être difficile. La page en cache fait probablement référence à des composants qui eux ne sont pas en cache (les pubs) ou peut faire des requêtes Ajax. Est-ce pertinent d&#8217;occuper le réseau avec cette ancienne page ? Pire, on va aussi occuper le cpu puisque beaucoup de sites ont des pages qui mettent un temps significatif à effectuer le rendu même quand tout est en cache. On risque de ralentir inutilement la machine.</p>
<p>Pourquoi dis-je que c&#8217;est encore plus intéressant alors que je détruis l&#8217;idée ? parce que j&#8217;avais ça sur Safari (si je choisis une des pages proposées au démarage c&#8217;est d&#8217;abord une image de la page en cache qui se charge le temps que la page réelle arrive) et j&#8217;ai ça depuis peu sur gmail (le temps que gmail se charge j&#8217;ai une version HTML non clicable des titres des quelques derniers mails de ma boite). Ca a l&#8217;air inutile mais ça améliore vraiment l&#8217;expérience. On peut se concentrer immédiatement sur la tâche prévue au lieu d&#8217;attendre que la page se charge. La performance ressentie c&#8217;est finalement surtout ça.</p>
<h3>Alors ?</h3>
<p>Je laisse les histoire d&#8217;indicateurs plus ou moins rapides à d&#8217;autres mais je verrai bien les effets suivants (cumulatifs) :</p>
<ul>
<li> S&#8217;il s&#8217;agit d&#8217;une page fréquemment visitée (en bookmark ?) charger une image de la page telle qu&#8217;elle était la dernière fois en attendant que la page se charge effectivement. Point bonus si les liens restent clicables (mais je n&#8217;ai pas besoin des autres interactions avec la page comme le javascript).</li>
<li>Quand la page arrive, on utilise par défaut immédiatement les précédentes versions des images et feuilles de style en attendant les nouvelles. Les images sont toutefois grisées/blanchies pour bien symboliser l&#8217;état &laquo;&nbsp;en chargement&nbsp;&raquo;.</li>
</ul>
<p>Notez que cela demande d&#8217;augmenter l&#8217;espace dédié au cache, et pour les pages ciblées de mettre en cache même ce qu&#8217;habituellement on n&#8217;y met pas (quitte à identifier que c&#8217;est un cache déjà expiré).</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/08/performance-ressentie-avec-mozilla/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Petit exemple de mise en pratique</title>
		<link>http://performance.survol.fr/2009/06/petit-exemple-de-mise-en-pratique/</link>
		<comments>http://performance.survol.fr/2009/06/petit-exemple-de-mise-en-pratique/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 10:00:51 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[exemple]]></category>
		<category><![CDATA[pratique]]></category>
		<category><![CDATA[versionnement]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=615</guid>
		<description><![CDATA[Voici un petit exemple de comment mettre en place les bonnes pratiques de cache et de concaténation des fichiers javascripts. L&#8217;article date de 2006 mais n&#8217;a pas pris une ride. On y retrouve une réflexion sur comment regrouper les fichiers &#8230; <a href="http://performance.survol.fr/2009/06/petit-exemple-de-mise-en-pratique/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Voici un petit exemple de comment <a href="http://thinkvitamin.com/features/webapps/serving-javascript-fast/">mettre en place les bonnes pratiques de cache et de concaténation des fichiers javascripts</a>. L&#8217;article date de 2006 mais n&#8217;a pas pris une ride.</p>
<p>On y retrouve une réflexion sur comment regrouper les fichiers javascripts entre eux et comment les compresser. La note sur mod_gzip est toutefois assez contestable. Il est désormais sans risque d&#8217;activer mod_gzip ou mod_deflate, et ceux qui veulent absolument éviter tout risques peuvent trouver facilement sur internet des listes d&#8217;exclusions pour cibler les navigateurs défectueux.</p>
<p>La politique de cache est intéressante à étudier. Ils ont évité les paramètres en ?xxx et ont choisit de versionner le nom de fichier directement. Pour éviter d&#8217;avoir à créer un fichier par version, c&#8217;est à mod_rewrite qu&#8217;il revient de faire la liaison entre l&#8217;url et le fichier à jour. Les adresses main.v27.css et main.v256.css mènent toutes vers le même fichier main.css, toujours à jour.</p>
<p>Au final ils passent encore par un script PHP pour délivrer leurs fichiers javascript et css au lieu d&#8217;utiliser mod_expires, mais vous avez une expérience concrête, et reproductible en une journée pour améliorer vos performances.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/06/petit-exemple-de-mise-en-pratique/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Petit point sur les caches</title>
		<link>http://performance.survol.fr/2009/06/petit-point-sur-les-caches/</link>
		<comments>http://performance.survol.fr/2009/06/petit-point-sur-les-caches/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 10:00:39 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cache-control]]></category>
		<category><![CDATA[expiration]]></category>
		<category><![CDATA[expires]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[proxy]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=515</guid>
		<description><![CDATA[Votre page peut-elle être mise en cache par le navigateur ? voyons ce qu&#8217;il en est en théorie avec HTTP 1.1 (en pratique le navigateur fera toujours ce qu&#8217;il veut, et il y a plus de couples navigateur/configuration que vous &#8230; <a href="http://performance.survol.fr/2009/06/petit-point-sur-les-caches/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Votre page peut-elle être mise en <a href="http://performance.survol.fr/2008/03/impact-du-cache-http/">cache</a> par le navigateur ? voyons ce qu&#8217;il en est en théorie avec <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html"><acronym title="hypertext transfer protocol" lang="en">HTTP</acronym> 1.1</a> (en pratique le navigateur fera toujours ce qu&#8217;il veut, et il y a plus de couples navigateur/configuration que vous ne l&#8217;imaginez, donc n&#8217;ayez aucune certitude).<span id="more-515"></span></p>
<h3>Les absolus</h3>
<p>Quoi que vous disiez, quoi que vous fassiez, si le serveur vous a répondu avec un code d&#8217;erreur 400, le navigateur devrait mettre en cache se résultat et ne pas refaire la même requête. C&#8217;est plutôt logique pour une requête que le serveur a considéré comme invalide.</p>
<p>Quoi que vous disiez, quoi que vous fassiez, si le code de retour était 303 ou 307, le navigateur ne devrait pas mettre en cache ce résultat. La redirection est temporaire, marquée comme telle, mettre en cache du temporaire c&#8217;est faire du permanent, donc contredire la réponse.</p>
<h3>L&#8217;heuristique</h3>
<p>S&#8217;il s&#8217;agit d&#8217;une requête de type <span lang="en">GET</span> avec un code de retour 200, 203, 206, 300, 301 ou 410, alors le navigateur ou le proxy sont encouragés à mettre en cache suivant leurs propres heuristiques. Le plus souvent la page HTML elle-même n&#8217;est pas mise en cache par défaut, mais les composants référencés par cette page sont mis en cache pour la durée de la session.</p>
<p>Il est à noter que la spécification HTTP 1.1 prévoit la fonctionnalité de retour arrière des navigateurs et incite le navigateur à réutiliser la page précédente sans la réactualiser, quand bien même elle aurait expiré. Le visiteur l&#8217;a déjà vu, il s&#8217;agit de lui représenter là où il était avant, pas de revenir sur la page actualisée.</p>
<h3>L&#8217;invalidation</h3>
<p>Quand le serveur répond à une requête <span lang="en">POST</span>, les versions en cache de cette <acronym title="uniform resource identifier" lang="en">URI</acronym> ou de celle dans les entêtes <code lang="en">Location</code> ou <code lang="en">Content-Location</code> doivent être effacés. Ceci implique immédiatement que par défaut une requête <span lang="en">POST</span> ne sera pas mise en cache.</p>
<p>La spécification HTTP 1.1 va même un peu plus loin en prenant en compte l&#8217;usage des paramètres de requêtes dans les URI. Certains utilisent ainsi des paramètres en <span lang="en">GET</span> pour réaliser des actions qui devraient être faites en <span lang="en">POST</span> (puisque provocant un changement dans l&#8217;entité résultat). Pour y palier, HTTP 1.1 demande à ce que ces requêtes (contenant un point d&#8217;interrogation dans le chemin) ne soient pas mises en cache quand bien même elles seraient faites avec le verbe <span lang="en">GET</span>.</p>
<p>Petite note : Si vous renvoyez un document avec une entête <code lang="en">Date</code> inférieure à celle qu&#8217;avait eu le navigateur la dernière fois, cette réponse ne devrait être pas mise en cache.</p>
<h3>La déclaration explicite</h3>
<p>Maintenant, hors les premiers cas absolus, les entêtes explicites ont priorité. Une <a href="http://performance.survol.fr/2008/05/prive-ou-public/">entête <code lang="en">Cache-Control</code></a> à <code lang="en">public</code>, <code lang="en">private</code>, ou <code lang="en">no-cache</code> change le comportement par défaut. Un <a href="http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/"><code lang="en">max-age</code> ou <code lang="en">Expires</code></a> impose un <code lang="en">cache</code> et un <code lang="en">must-revalidate</code> impose une revalidation, même si ces règles contredisent le comportement par défaut pour la ressource en question.</p>
<p>Enfin, les caches sont toujours dépendants de l&#8217;entête <code lang="en">Vary</code>, qui permet de restreindre le cache à un navigateur, ou des visteurs avec un certain cookie, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/06/petit-point-sur-les-caches/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Latence et CDN</title>
		<link>http://performance.survol.fr/2009/06/latence-et-cdn/</link>
		<comments>http://performance.survol.fr/2009/06/latence-et-cdn/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 11:00:57 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[akamai]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cdn]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[latence]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[réseau]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=503</guid>
		<description><![CDATA[La latence est une des composantes qui pénalise le plus les performances actuellement. Les connexions Internet françaises se font plutôt à haut débit, et même un mauvais wifi laisse finalement passer assez de trafic pour que ce soit viable. Par &#8230; <a href="http://performance.survol.fr/2009/06/latence-et-cdn/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://performance.survol.fr/2008/03/impact-de-la-latence-reseau/">La latence est une des composantes qui pénalise le plus les performances actuellement</a>. Les connexions Internet françaises se font plutôt à haut débit, et même un mauvais wifi laisse finalement passer assez de trafic pour que ce soit viable. Par contre, avec l&#8217;explosion du nombre de composants par page, la latence est probablement le facteur le plus limitant.  40 composants à 50ms de latence, c&#8217;est 2 secondes de perdues. Même en imaginant utiliser deux fils de téléchargement, c&#8217;est encore une seconde d&#8217;attente. Sur une mauvaise connexion (wifi ?) ou quand on s&#8217;adresse à un site qui n&#8217;a pas de serveur en France (ou très proche), la latence peut vite exploser.</p>
<p>Je ne parle même pas de c<a href="http://www.theinquirer.fr/2009/03/20/hadopi-un-veritable-danger-pour-le-saas.html">e que pourraient nous apporter HADOPI et LOPSI2</a> s&#8217;ils filtrent les accès côté FAI (on peut leur faire confiance pour affirmer que les débits ne bougeront pas, mais en ce qui concerne la latence&#8230;). À 120ms de latence c&#8217;est d&#8217;un coup plusieurs secondes qui partent en fumée.  En fait ce sont souvent les publicités qui ont la plus grande latence. Quand le javascript qui gère la pub est bloquant et qu&#8217;on a deux ou trois redirections HTTP, on peut facilement perdre une seconde. Si vous ne me croyez pas, regardez <a href="http://venturebeat.com/2008/09/22/is-latency-crippling-yahoos-right-media/">l&#8217;exemple de Right Media</a>.<span id="more-503"></span></p>
<h3>Les solutions</h3>
<p>Pour aller plus vite il faut donc soit avoir moins de composants par page, soit faire en sorte que la latence entre ces composants et le visiteur est réduite.  Moins de composants c&#8217;est renouveler des solutions que j&#8217;ai déjà abordé ici : mettre en cache tout ce qu&#8217;on peut, container les fichiers javascript, faire de même avec les feuilles de style, et explorer les sprites CSS pour les images.  Réduire la latence elle-même est par contre plus complexe. Comme on ne peut pas d&#8217;un coup de baguette magique améliorer la connexion du visiteur (quoi que certains tentent de <a href="http://gigaom.com/2008/08/12/fastsoft-tweaks-tcp-to-accelerate-the-internet/">jouer avec TCP</a>), il ne reste plus qu&#8217;à approcher le serveur au maximum près du fournisseur d&#8217;accès du visiteur.</p>
<p>Pour un public français c&#8217;est réalisable, les FAI français font du peering entre eux, tout est regroupé entre quelques gros, la latence due au placement géographique est probablement proche de zéro (pour un site américain, avoir des serveurs sur les deux côtes au lieu d&#8217;une seule fait une réelle différence par contre). Sauf qu&#8217;assez souvent ce n&#8217;est pas un site français c&#8217;est un site francophone, ou adressé aux français (qui sont peut être en déplacement).  Reste que même pour un site non touristique qu&#8217;on croit adresser aux français métropolitain, il y a des requêtes qui viennent des DOM TOM, des pays limitrophes, des pays européens (oui, je travaille tous les jours de Paris avec une adresse IP londonienne ) et finalement d&#8217;un peu partout dans le monde (je suis toujours étonné de voir les statistiques géographiques de ce blog).</p>
<h3>Content Delivery Network</h3>
<p>L&#8217;idéal serait donc d&#8217;avoir un serveur local chez chaque FAI. Malheureusement on se doute bien qu&#8217;au niveau coûts c&#8217;est infaisable, d&#8217;autant plus s&#8217;il faut les synchroniser. Les CDN, puisque c&#8217;est comme ça que ça s&#8217;appelle (Content Delivery Network, réseau de distribution de contenu), se placent à quelques endroits géographiques, avec des liens réseaux spécifiques vers les FAI principaux et entre les différents emplacements.  <a href="http://www.datacenterknowledge.com/archives/2008/11/18/where-amazons-data-centers-are-located/">Amazon propose donc quatorze emplacements</a>, huit aux USA, quatre en Europe (Londres, Dublin, Amsterdam et Francfort), ainsi que deux en Asie (Hong Kong et Tokyo). Akamaï, le leader, propose 71 pays différents (et probablement plusieurs emplacements aux USA).</p>
<p>Dans l&#8217;ensemble sur les CDN donnant des listes précises, les pays du nord et les USA semblent les mieux couverts mais ce peut être un biais du à mes sources d&#8217;information. N&#8217;ayant pas eu à faire de recherche spécifique  l&#8217;Asie l&#8217;Afrique ou l&#8217;Europe ont peut être quelques CDN spécifiques. À vous de fouiller dans <a href="http://www.cdnlist.com/">la cinquantaine de CDN dans le monde</a>.  Akamaï propose une petite application pour <a href="http://www.akamai.com/html/technology/dataviz2.html">constater la latence entre deux villes</a>. Bon, c&#8217;est visiblement très biaisé, mais le principe est bien là, lui.</p>
<h3>Fonctionnement</h3>
<p>Sur le principe un CDN ce n&#8217;est pas bien compliqué. Il s&#8217;agit de modifier le DNS pour faire pointer vers celui du CDN. Là on utilise des DNS personnalisés chez différents FAI, ou un système de tracking géographique des adresses IP pour renvoyer les différents utilisateurs chacun vers le serveur le plus proche de chez eux. Le serveur lui même est soit pré-rempli avec tous les composants utiles, soit fonctionne comme un proxy évolué (ce qui demande que vous même gériez correctement toutes vos entêtes de cache).</p>
<h3>Dois-je utiliser un CDN ?</h3>
<p>Pour un petit site français, pas certain. Pour un site plus gros, cela peut permettre de déporter les coûts de serveurs et de bande passante, c&#8217;est uniquement une question financière.  Par contre, dès que vous visez plus international, en dehors de la simple Europe occidentale, ça peut commencer à prendre son sens. Les coûts sont assez progressifs et abordables même pour une petite société (Akamaï part à partir de 150$/mois, Amazon a un prix au consommé qui semble ridicule pour des petits trafics).</p>
<p>Une seule chose, ne vérifiez pas l&#8217;efficacité depuis votre bureau français, avec une faible latence. Au mieux entre un CDN avec un serveur à Paris et votre propre serveur parisien, il n&#8217;y aura pas grande différence. Il se pourrait même que le CDN semble ralentir vos pages (vu qu&#8217;il faudra peut être joindre Londres pour certains réseaux). Par contre pour d&#8217;autres, aux DOM TOM ou à l&#8217;étranger, la différence sera notable. Un petit coup par <a href="http://www.webpagetest.org/">webpagetest</a> peut donner un premier aperçu si vous le souhaitez.</p>
<p>Au pire, rien ne vous empêche de fournir un lien directement vers votre serveur quand le visiteur est dans la même zone géographique, et un lien vers le CDN sinon. Une petite reconnaissance de l&#8217;adresse IP devrait suffire et le risque de dégrader les performances en cas d&#8217;erreur est assez faible.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/06/latence-et-cdn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cache central des bibliothèques javascript</title>
		<link>http://performance.survol.fr/2009/02/cache-central-des-bibliotheques-javascript/</link>
		<comments>http://performance.survol.fr/2009/02/cache-central-des-bibliotheques-javascript/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 11:00:15 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cdn]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[domaine]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[latence]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[réseau]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[yahoo!]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=410</guid>
		<description><![CDATA[On m&#8217;a posé quelques fois la question alors voici la réponse : Oui. Oui il faut, quand vous le pouvez, utiliser les liens centralisés de Google ou de Yahoo pour vos bibliothèques javascript. Je parle de ne pas recopier jquery &#8230; <a href="http://performance.survol.fr/2009/02/cache-central-des-bibliotheques-javascript/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>On m&#8217;a posé quelques fois la question alors voici la réponse : Oui.</p>
<p>Oui il faut, quand vous le pouvez, utiliser <a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#AjaxLibraries">les liens centralisés de Google</a> ou <a href="http://developer.yahoo.com/yui/articles/hosting/#background">de Yahoo</a> pour vos bibliothèques javascript. Je parle de ne pas recopier jquery ou yui directement sur vos serveurs, mais d&#8217;utiliser les liens centralisés proposés par les deux moteurs de recherche.</p>
<p>Voilà pour la réponse générique, ensuite on peut détailler un peu.</p>
<p><span id="more-410"></span></p>
<h3 lang="en">Content delivery network</h3>
<p>Le premier gain c&#8217;est l&#8217;utilisation des <acronym lang="en" title="content delivery network">CDN</acronym> de Yahoo! et de Google. Le principe du <a href="http://performance.survol.fr/avec/cdn/">CDN</a> c&#8217;est plus ou moins placer des serveurs dans plusieurs pays, voire directement chez les FAI, pour que le trajet fait sur le réseau soit le plus court possible. On vise une latence réduite. <a href="http://performance.survol.fr/2008/03/impact-de-la-latence-reseau/">La latence ça peut tuer un site web</a>.</p>
<p>Seuls les plus gros sites web peuvent s&#8217;offrir des CDN. Profiter de Yahoo! ou Google c&#8217;est toujours appréciable.</p>
<p>Maintenant vous n&#8217;utiliserez qu&#8217;une seule grosse bibliothèque javascript. En échange vous allez utiliser un nom de domaine supplémentaire, donc <a href="http://performance.survol.fr/2008/07/analyse-requete-http-serveur-et-reseau/">une requête DNS supplémentaire et une connexion de plus</a>. Le deal est intéressant si ce qu&#8217;on gagne en latence dépasse ce que coûte la requête DNS.</p>
<p>Soyons clairs, si vos contenus ne sont pas sur le même continent qu&#8217;une partie sensible de vos clients, alors c&#8217;est un bon deal, n&#8217;hésitez pas. Aux États-Unis, éviter de traverser de l&#8217;Alaska vers New-York, c&#8217;est du temps gagné, non négligeable. Mais en même temps les sociétés vraiment internationales ont déjà souvent un hébergement par pays ou continent, ou utilisent déjà un CDN.</p>
<p>Si vous restez en Europe occidentale ça devient déjà moins clair. Si vous êtes hébergés en France dans un gros datacenter et que vos clients sont en France &#8230; là pas sur que le bénéfice du CDN soit réel. Les FAI ont des liens de peering entre eux et avec les hébergeurs français, la latence est globalement faible dès le départ. (Note: ceci n&#8217;a pas été vérifié par des tests, je suis preneur d&#8217;avis et de retours d&#8217;expérience sur la pertinence de CDN pour un trafic français avec un hébergement en France)</p>
<h3>Nombre de domaines</h3>
<p>Le second aspect de ces caches centralisés c&#8217;est le fait qu&#8217;ils sont justement sur un domaine séparé. Il y a du pour et du contre.</p>
<p>Dans le pour, votre Javascript peut être téléchargé immédiatement même si <a href="http://performance.survol.fr/2008/04/limitation-du-nombre-de-requetes/">les files de téléchargement</a> sont déjà occupées avec d&#8217;autres éléments de votre site. Maintenant comme on définit souvent ce genre de bibliothèques javascript tout en haut de page, les files de téléchargement sont généralement vides à ce moment là de toutes façons. Bref, je ne suis pas convaincu.</p>
<p>Toujours dans le pour, <a href="http://performance.survol.fr/2008/12/quel-avenir/">si votre navigateur est très récent (comprendre&nbsp;: IE 8, Safari 4, Firefox 3.1) le javascript ne bloque pas les autres téléchargements</a>. Là aussi, avoir un domaine différent évite d&#8217;utiliser un slot dans vos autres téléchargements. En pratique, avec six slots simultanés minimum sur ces navigateurs, je ne suis pas convaincu que cela fasse une différence fondamentale.</p>
<p>Bref, pas convaincu, sachant qu&#8217;il y a du contre qui s&#8217;ajoute : avec un nom de domaine en plus, comme on l&#8217;a vu, il y a une requête DNS supplémentaire. Est-ce que ça vaut le coup pour un unique fichier ? pas sûr du tout.</p>
<h3>Cache centralisé</h3>
<p>Troisième aspect, en utilisant les liens de Google et Yahoo! on finit par tous utiliser les mêmes URL pour nos bibliothèques javascript.</p>
<p>Le résultat c&#8217;est que pour les bibliothèques les plus populaires, cela augmente la probabilité que vous l&#8217;ayez déjà en <a href="http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/">cache</a> à cause d&#8217;un site précédent. Là le gain est important, surtout pour vos pages d&#8217;accueil (celles qui ont le plus gros trafic &laquo;&nbsp;cache vide&nbsp;&raquo;). Reste qu&#8217;en réalité l&#8217;URL contient la version de la bibliothèque et tous les sites n&#8217;utilisent pas les mêmes versions, ou même les mêmes bibliothèques. La mutualisation est assez limitée et le gain reste à prouver.</p>
<p>L&#8217;avantage concret est par contre visible pour les entreprises et pour les universités. Ces dernières ont des proxys cache qui auront toutes les chance d&#8217;avoir déjà votre bibliothèque en cache, dans la bonne version. Sur la cinquantaine (ou le millier) de collègues, il y en aura bien un qui aura téléchargé la bibliothèque avant vous.</p>
<p>La question est donc, vos visiteurs sont-ils sur des lignes professionnelles ou des lignes de particuliers ? dans ce second cas le gain n&#8217;est pas évident.</p>
<h3>Mais alors, pourquoi répondre &laquo;&nbsp;oui&nbsp;&raquo; ?</h3>
<p>Parce que je parlais jusqu&#8217;à maintenant du cas idéal. Si vous avez déjà un CDN, que vos ressources statiques sont déjà sur domaine séparé, et que vos entêtes de cache sont bien réglées, alors gardez vos bibliothèques chez vous. Mais &#8230; ce n&#8217;était le cas pour aucun de ceux qui m&#8217;ont posé la question.</p>
<p>En fait je doute que ce soit le cas pour quiconque se pose la question. Ceux qui ont déjà fait tout le chemin de performance avec CDN, domaine tiers et entêtes de cache, ils ont souvent les moyens de tester eux même quelle est la meilleure solution. Ou mieux, ils ont déjà réalisé que pour éliminer une requête HTTP il faut déjà fusionner leur bibliothèque javascript avec leur code javascript spécifique. Bref, la question est sans objet pour eux.</p>
<p>Pour les autres, qui n&#8217;ont pas les moyens d&#8217;utiliser un CDN quand bien même ils en auraient besoin, ou qui n&#8217;ont pas déjà un domaine séparé pour les ressources statiques, ou qui ne gèrent pas correctement leurs entêtes de cache, pour eux c&#8217;est intéressant. Ce n&#8217;est pas parfait, mais c&#8217;est un mieux, une démarche d&#8217;amélioration progressive. Pour vous, qui vous posez la question, la réponse est probablement &laquo;&nbsp;oui, utilisez les liens de Yahoo et Google pour vos bibliothèques javascript&nbsp;&raquo;. Et puis &#8230; ça fait autant de bande passante en moins à payer.</p>
<p>En cas de doute, le &laquo;&nbsp;oui&nbsp;&raquo; a plus de chance d&#8217;être positif ou sans effet que de réellement être négatif.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/02/cache-central-des-bibliotheques-javascript/feed/</wfw:commentRss>
		<slash:comments>12</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>Aperçu de Yslow 2.0</title>
		<link>http://performance.survol.fr/2009/01/apercu-de-yslow-20/</link>
		<comments>http://performance.survol.fr/2009/01/apercu-de-yslow-20/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 11:00:15 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[etag]]></category>
		<category><![CDATA[eval]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[outils]]></category>
		<category><![CDATA[Stoyan Stefanov]]></category>
		<category><![CDATA[yahoo!]]></category>
		<category><![CDATA[Yahoo! Exceptional Performance]]></category>
		<category><![CDATA[yslow]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=368</guid>
		<description><![CDATA[J&#8217;avais déjà présenté Yslow, et de toutes façons tous ceux qui lisent ce blog doivent maintenant connaître cet outil indispensable. Stoyan Stefanov, de l&#8217;équipe performande de Yahoo!, a fait en chine la première présentation sur ce qui arrive avec la &#8230; <a href="http://performance.survol.fr/2009/01/apercu-de-yslow-20/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;avais déjà <a href="http://performance.survol.fr/2008/07/les-outils-yslow/">présenté Yslow</a>, et de toutes façons tous ceux qui lisent ce blog doivent maintenant connaître cet outil indispensable. <a href="http://performance.survol.fr/avec/stoyan-stefanov/">Stoyan Stefanov</a>, de l&#8217;équipe performande de Yahoo!, a fait en chine la <a href="http://www.slideshare.net/stoyan/yslow-20-presentation/">première présentation sur ce qui arrive avec la version 2.0 de Yslow</a>. Pour tout vous dire j&#8217;avais le secret espoir que l&#8217;annonce de Yslow 2.0 soit faite à <a href="http://performance.survol.fr/2008/09/paris-web-2008/">Paris Web 2008</a> lors de l&#8217;intervention que j&#8217;ai partagée avec <a href="http://performance.survol.fr/avec/nicole-sullivan/">Nicole Sullivan</a>, mais la finalisation a visiblement demandé du temps.<span id="more-368"></span></p>
<h3>Une mise à jour attendue &#8230;</h3>
<p>J&#8217;avais, comme tout le monde, deux principaux reproches à faire sur l&#8217;outil. Tout d&#8217;abord il ne vérifie qu&#8217;une liste très spécifiques de critères. Ce sont une partie des 14 premiers <a href="http://developer.yahoo.com/performance/rules.html">critères retenus par l&#8217;équipe performance de Yahoo!</a> mais depuis d&#8217;autres recommandations ont pu être dégagée. Il était nécessaire que l&#8217;outil s&#8217;étoffe.</p>
<p>C&#8217;est donc 10 règles supplémentaires qui sont intégrées dans l&#8217;outil, pour un total de 23. Mais là où Yslow aurait pu avoir une simple mise à jour, l&#8217;équipe Yahoo! a permis l&#8217;arrivée d&#8217;un modèle communautaire, où chacun peut ajouter facilement ses propres critères. C&#8217;est l&#8217;histoire de quelques lignes de javascript dans une extension Firefox.</p>
<p>Le second point contestable était le système de notation. Toutes les règles ne sont pas adaptables à tout le monde, avec la même importance. Le premier exemple c&#8217;est <a href="http://performance.survol.fr/2008/06/desactiver-les-etags/">la question des ETags</a> qui pénalise des notations pour rien, soit parce que l&#8217;ETag n&#8217;est pas généré avec le système par défaut d&#8217;Apache, soit parce qu&#8217;il n&#8217;y a qu&#8217;un seul serveur web derrière le site. Chacun a ses spécificités et je retiens encore l&#8217;exemple qu&#8217;on m&#8217;a donné des sites chinois qui ont tendance à avoir des pages web longues de plusieurs dizaines d&#8217;écran parce les usages locaux font qu&#8217;on télécharge la page pour une lecture hors ligne, et qu&#8217;on espère donc en avoir le plus possible dedans quitte à attendre longtemps.</p>
<p>Bref, là aussi Yslow est personnalisable et il sera possible de définir vos propres algorithmes de notation, voire de choisir le type de notation souhaité parmi une liste. À vous de définir vos limites, vos paliers, vos pénalités et les règles qui sont pertinentes à votre site &#8230; ou plutôt à choisir un algorithme créé par quelqu&#8217;un d&#8217;autre et adapté à votre cas. L&#8217;idée est de non seulement pouvoir modifier ces préférences via une interface mais aussi de pouvoir les exporter automatiquement pour les diffuser à d&#8217;autres.</p>
<h3>&#8230; et efficace &#8230;</h3>
<p>Bref, c&#8217;est une très bonne nouvelle, qui va permettre de voir fleurir des personnalisations de Yslow propre à certains types de sites, aux recommandations internes de votre société, ou simplement adaptées à votre échelle. Je m&#8217;abstiens de recopier les images ou le code, vous trouverez tout ça dans <a href="http://www.slideshare.net/stoyan/yslow-20-presentation/">la présentation de Stoyan</a>.</p>
<p>Mais on trouve encore d&#8217;autres petits outils. Parmi eux des menus pour réindenter le code javascript et faire un passage par <a href="http://www.jslint.com/">JSLint</a>. Là encore, quelques lignes de javascript sont prévues pour rajouter vos propres outils.</p>
<p>Mieux, et ça c&#8217;est excellent, il est prévu de sauvegarder votre session de résultat pour une étude plus tard et d&#8217;importer de sessions crées par <a href="http://www.fiddlertool.com/fiddler/">Fiddler</a> ou <a href="http://www.httpwatch.com/">HttpWatch</a>.</p>
<h3>&#8230; mais imparfaite</h3>
<p>Mais tout n&#8217;est pas parfait. Dans les recommandations on trouve la <a href="http://developer.yahoo.com/performance/rules.html#cacheajax">#14 (Make Ajax cacheable)</a>. Difficile à dire pour un outil automatisé s&#8217;il est normal que tel ou tel appel Ajax soit en cache ou dynamique. Je suis dubitatif sur l&#8217;idée d&#8217;avoir automatisé cette règle là. Même chose pour la <a href="http://developer.yahoo.com/performance/rules.html#under25">#33 (Components under 25k)</a>. <a href="http://performance.survol.fr/2008/05/limitations-du-cache-webkit/">La limite de 25k</a> est celle de l&#8217;Iphone, mais on a vu que <a href="http://performance.survol.fr/2008/12/encore-sur-le-cache-de-liphone/">les nouveaux firmware Iphone et Ipod Touch permettent de dépasser allègrement cette limite</a>. Bref, on l&#8217;ajoute dans Yslow quand il serait presque venu le temps de la retirer de la liste globale des recommandations.</p>
<p>Il y en a d&#8217;autres que j&#8217;aurai aimé voir, mais qui doivent être bien plus complexes à automatiser. Par exemple :</p>
<ul>
<li>trop de présentation en HTML au lieu de CSS</li>
<li>code javascript lent</li>
<li>présence de eval() en javascript</li>
<li><a href="http://performance.survol.fr/avec/selecteur/">sélecteurs CSS vraiment mal fait</a></li>
<li><a href="http://performance.survol.fr/2008/10/eviter-les-evenements-trop-frequents/">événements DOM mutualisables avec de la délégation</a></li>
<li>processeur excessivement utilisé lors du rendu</li>
<li><a href="http://performance.survol.fr/2008/09/mode-de-rendu-des-tableaux/">tableaux html dynamique trop gros ou imbriqués</a></li>
</ul>
<p>Ah et &#8230; pas de date de sortie ni de version béta publique, pour l&#8217;instant. Reste que ces nouvelles sont bonnes.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/01/apercu-de-yslow-20/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Encore sur le cache de l&#8217;iPhone</title>
		<link>http://performance.survol.fr/2008/12/encore-sur-le-cache-de-liphone/</link>
		<comments>http://performance.survol.fr/2008/12/encore-sur-le-cache-de-liphone/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 11:00:24 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=354</guid>
		<description><![CDATA[L&#8217;iPhone a changé la donne sur la consultation du web par les mobiles. Avant nous luttions pour faire comprendre que les performances des sites web devaient aussi être adaptées à une consultation avec une grande latence et une très faible &#8230; <a href="http://performance.survol.fr/2008/12/encore-sur-le-cache-de-liphone/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>L&#8217;iPhone a changé la donne sur la consultation du web par les mobiles. Avant nous luttions pour faire comprendre que les performances des sites web devaient aussi être adaptées à une consultation avec une grande latence et une très faible bande passante. Maintenant nous voyons même apparaître des sites spécifiques iPhone.</p>
<p>Apple lui même met clairement en avant les performances de la navigation iPhone, au point de tricher dans ses publicités en montrant un scénario de navigation accéléré par rapport aux situations réelles (la publicité a d&#8217;ailleurs été interdite au Royaume Uni à cause de cela).<span id="more-354"></span></p>
<h3>Reste que la bataille des performances n&#8217;est pas gagnée.</h3>
<p>Encore il y a peu nous parlions d&#8217;<a href="http://performance.survol.fr/2008/05/limitations-du-cache-webkit/">un cache HTTP limité à 25ko par composant sur l&#8217;iPhone</a>, 500ko au total. On parle de la taille une fois la ressource décompressée (sans gzip donc). 25ko c&#8217;est peu, la plupart des sites ont un composant qui dépasse cette taille. 500ko ce n&#8217;est pas beaucoup mieux, naviguez sur un ou deux sites et le cache aura complètement oublié vos précédentes visites. Pire, des bibliothèques javascript comme jquery dépassent les 25ko et donc ne passeront jamais dans le cache.</p>
<h3>Moins de restriction par composant</h3>
<p>La bonne nouvelle c&#8217;est que cette limite est désormais dépassée. Une présentation de Nicole Sullivan indique que la limite des 25ko a disparue, et que la taille globale du cache a été doublée.</p>
<p>Malheureusement je n&#8217;ai trouvé aucune autre source d&#8217;information, donc avec Anthony Ricaud nous avons lancé un petit test. Le résultat c&#8217;est que l&#8217;iPhone 3G (firmware 2.1) met bien en cache les images de plus de 25ko. Je n&#8217;ai pas tenté de trouver la limite, mais une image de 180ko part dans le cache correctement.</p>
<h3>Mais un racisme anti-HTML</h3>
<p>La mauvaise nouvelle c&#8217;est que dans nos tests Safari iPhone ne met jamais en cache la page HTML principale. Nous avons tenté des entêtes d&#8217;expiration explicites, des pages de 3ko. Rien n&#8217;y fait. la page elle-même est à chaque fois retéléchargée par l&#8217;iPhone alors que sur mon Safari Mac classique, lui, se sert bien du cache.</p>
<p>C&#8217;est un moindre mal, mais c&#8217;est une limitation assez peu compréhensible. Si quelqu&#8217;un me trompe une raison légitime de castrer le cache ainsi seulement sur le mobile, je suis preneur.</p>
<h3>À vous pour la suite</h3>
<p>Le cache de l&#8217;iPhone est définitivement différent de celui d&#8217;un Safari classique. Je n&#8217;ai malheureusement pas d&#8217;iPhone pour tester* donc à ceux que ça intéresse, je suis preneur des résultats suivants (pour la v1 et la version 3G) :</p>
<ul>
<li>quelles sont les nouvelles limites par composant ?</li>
<li>quelle est la nouvelle limite globale ?</li>
<li>ces limites sont-elles les même wifi et en 3G ?</li>
<li>le HTML principal est-il mis en cache lors d&#8217;une connexion wifi ?</li>
<li>nous avons testé avec une image, est-ce la même chose avec une feuille de style ou un javascript ?</li>
</ul>
<p>Le protocole de test est assez simple, je vous met ici en copie <a href="http://performance.survol.fr/wp-content/uploads/2008/12/iphone.tar.gz">une petite archive des fichiers PHP que j&#8217;ai utilisé pour mon test</a> avec Anthony.</p>
<p>Bref, à vous de tester, et de commenter ici avec vos résultats (n&#8217;oubliez pas de faire un lien vers votre protocole de test et de donner la version exacte de votre iPhone, sans ça les résultats sont moins utiles).</p>
<p><small>(* Ceci est un message subliminal à celui qui veut financer mes recherches sur le sujet)</small></p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/12/encore-sur-le-cache-de-liphone/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Expires et Cache-Control, une date limite de consommation pour vos contenus</title>
		<link>http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/</link>
		<comments>http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 10:00:47 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cache-control]]></category>
		<category><![CDATA[expiration]]></category>
		<category><![CDATA[expires]]></category>
		<category><![CDATA[http]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=206</guid>
		<description><![CDATA[Je parle de détails et de ce que je rencontre dans mes lectures, et j&#8217;en oublie le principal. alors voilà, si vous ne devez retenir qu&#8217;une chose c&#8217;est d&#8217;utiliser des dates d&#8217;expiration explicites sur vos contenus. Il s&#8217;agit d&#8217;informer le &#8230; <a href="http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je parle de détails et de ce que je rencontre dans mes lectures, et j&#8217;en oublie le principal. alors voilà, si vous ne devez retenir qu&#8217;une chose c&#8217;est d&#8217;<strong>utiliser des dates d&#8217;expiration explicites</strong> sur vos contenus.</p>
<p>Il s&#8217;agit d&#8217;informer le navigateur que votre contenu est valable pendant une certaine durée. Cela peut être dix minutes, une heure, un jour, un mois, ou plusieurs années. Tant que cette durée n&#8217;a pas expirée, le navigateur sait que son contenu est à jour, il peut donc éviter de le retélécharger. Vous gagnez du temps en évitant la requête HTTP et vous laissez de la place pour d&#8217;autres téléchargements. Au lieu de prendre une demi seconde, votre contenu sera lu quasiment instantanément.<span id="more-206"></span></p>
<h3>Les détails HTTP 1.0</h3>
<p>En fait tout ça c&#8217;est assez simple. En <a href="http://www.w3.org/Protocols/HTTP/1.0/spec.html">HTTP 1.0</a>, le serveur envoie avec le contenu une <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21">entête Expires</a> avec une date au format de la <a href="http://www.freesoft.org/CIE/RFC/1123/">RFC 1123</a>.</p>
<pre>Expires: Thu, 01 Dec 1994 16:00:00 GMT</pre>
<p>Le navigateur et les proxy stockent dans le cache la ressource avec cette date. Les prochaines fois c&#8217;est le contenu sauvegardé dans le cache qui est utilisé, sans aucun appel au serveur.</p>
<p>Une fois la date dépassée, le navigateur fait de nouveau appel au serveur pour obtenir un contenu mis à jour, et éventuellement une nouvelle date d&#8217;expiration explicite. C&#8217;est normalement une requête conditionnelle qui est faite à ce niveau là donc si le contenu n&#8217;a toujours pas changé il ne sera toujours pas retéléchargé inutilement.</p>
<h3>Les détails HTTP 1.1</h3>
<p>Le gros défaut HTTP 1.0 c&#8217;est qu&#8217;en général on ne souhaite pas une date d&#8217;expiration fixe, on cherche une expiration de type « maintenant + 10 jours ». Résultat, il faut générer la date à chaque fois.</p>
<p><a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">HTTP 1.1</a> nous propose un mécanisme plus sympathique avec <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9">l&#8217;entête Cache-Control</a> dont je vous avais détaillé un des paramètres il y a quelques temps. Le paramètre qui nous intéresse ici est <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3">le paramètre max-age</a>. Il prend un nombre de secondes pendant lesquelles le contenu doit être considéré comme à jour.</p>
<pre>Cache-Control: public;max-age=3600</pre>
<p>Cette directive est valable autant pour les caches partagés (proxy) que les caches personnels (navigateur). Il existe toutefois un second <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3">paramètre s-maxage</a>, qui ne cible que les caches partagés. Le fonctionnement est similaire.</p>
<h3>J&#8217;utilise quoi ?</h3>
<p>Autant que possible, utilisez les deux. Rien n&#8217;est parfait dans ce bas monde et vous n&#8217;avez pas de garantie que la directive Cache-Control sera interprétée correctement, même si le client utilise la version 1.1 du protocole.</p>
<p>En cas de conflit le client est censé utiliser la directive Cache-Control. Mais après tout, pourquoi voudriez-vous envoyer deux informations contradictoires ?</p>
<h3>Comment ?</h3>
<p>Le plus simple sous Apache c&#8217;est <a href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html">mod_expires</a>. Vous pouvez régler le comportement par défaut et par type de fichier. À chaque fois vous pouvez définir une durée pendant laquelle le contenu est considéré comme à jour, et si cette durée est à prendre à partir de la dernière modification de votre contenu ou de la date de la requête.</p>
<pre>ExpiresDefault "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"</pre>
<p><a href="http://trac.lighttpd.net/trac/wiki/Docs%3AModExpire">Pour Lighttpd le module a le même nom</a>, et la syntaxe est assez similaire :</p>
<pre class="last literal-block">$HTTP["url"] =~ "^/images/" {
     expire.url = ( "" =&gt; "access 1 hours" )
}</pre>
<h3>Sur quoi ?</h3>
<p>Ces entêtes sont pertinentes pour tout ce qui bouge peu, pas du tout, ou à une fréquence déterminée :</p>
<p>Prenez en compte au moins vos logos, vos icônes, vos images de fond, bref, ce qui ne change quasiment jamais, sans exception. Pour ces contenus vous pouvez mettre une expiration virtuellement infinie, de plusieurs années. Le jour où vous faites une modification il suffira de faire un nouveau fichier avec une nouvelle adresse publique.</p>
<p>Pour vos feuilles de style et vos javascript, même chose. Vos contenus changent plus souvent mais si vous arrivez à changer l&#8217;URL à chaque modification vous pouvez encore mettre une expiration quasi infinie. Pour changer l&#8217;adresse à chaque version vous pouvez ajouter le numéro de version dans le nom du fichier, ou ajouter un paramètre à l&#8217;url qui contient la date de dernière modification. Je ferai un billet plus complet sur le sujet plus tard.</p>
<p>Enfin, les pages HTML. Là il faut être plus fin. Toutes les pages ne sont pas pertinentes pour une expiration. Plus classiquement si à deux minutes d&#8217;intervalle il est important que le contenu change, oubliez l&#8217;expiration explicite. Par contre une bonne partie des pages peuvent avoir une expiration de quelques minutes, voire d&#8217;une ou deux heures. C&#8217;est souvent le cas des pages d&#8217;accueil et des pages principales. L&#8217;utilisateur y revient souvent lors de sa navigation. Si ces pages peuvent être instantanées, c&#8217;est un réel gain pour l&#8217;utilisateur. Si vous avez un système d&#8217;authentification sur vos pages, n&#8217;oubliez pas de <a href="http://performance.survol.fr/2008/05/prive-ou-public/">déclarer aussi le cache comme privé avec la directive Cache-Control</a>.</p>
<h3>Le bénéfice</h3>
<p>Un contenu avec une expiration explicite c&#8217;est un contenu qu&#8217;on évite de retélécharger plusieurs fois inutilement. Pour l&#8217;utilisateur c&#8217;est la sensation que le téléchargement est instantané, que l&#8217;interface et que le site réagissent immédiatement — et n&#8217;oubliez pas, <a href="http://performance.survol.fr/2008/06/a-quoi-ca-sert/">cela a une influence importante sur votre business</a>. Pour vous c&#8217;est autant de charge en moins pour votre serveur, et autant de bande passante économisée. Rien que là dessus vous pouvez économiser des sommes importantes.</p>
<p>Pour exemple, la page de Yahoo! met environ deux secondes tout compris à charger avec plus de 40 requêtes HTTP, ce qui en soit est assez honorable face au reste du web. Par contre sur cette quarantaine de requêtes HTTP, plus des trois quarts ont une expiration explicite comme détaillé plus haut. Le résultat c&#8217;est que ma seconde visite ne télécharge plus que 7 composants externes. Ma bande passante est libre pour autre chose et ma page se charge bien plus rapidement. Suivant les publicités sur la page, c&#8217;est entre une demi seconde et une seconde que je gagne. Pour une page d&#8217;accueil qui ne doit surtout pas donner une impression de lenteur, c&#8217;est significatif et même important.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>
