Maximum Performance :

AccŽlŽrer lÕaffichage de vos pages web

 

Cyril Godefroy

 

 

 

 

Premire Ždition , Juillet 2007



 

Introduction

Durant mes quelques annŽes d'expŽrience dans le domaine de la crŽation et du dŽveloppement de sites web (12 ans quand mme), j'ai ŽtŽ plusieurs fois confrontŽ ˆ des problŽmatiques de performance des sites. A chaque fois, l'exigence est devenue plus forte, au fur et ˆ mesure que la vitesse de connexion des internautes augmentait, que les fonctionnalitŽs Žtaient ŽvoluŽes, que le contenu Žtait riche. J'ai travaillŽ d'abord essentiellement sur des sites o les problmes de performance se situaient au niveau du code sur le serveur. Mais au fur et ˆ mesure de l'enrichissement des sites web, ce n'est plus cet aspect qui avait de l'importance. C'est le temps d'affichage complet de la page qui a pris le pas sur la rapiditŽ de l'accs ˆ la page.

Ce changement de mentalitŽ est bŽnŽfique ˆ plusieurs titres :

¥on s'intŽresse de manire prŽcise ˆ ce qui est ressenti par l'internaute qui navigue sur le site,

¥on partage la responsabilitŽ de l'affichage de la page de manire transverse, du graphiste qui l'a dessinŽe au dŽveloppeur qui l'a construite en passant par le serveur qui la donne,

¥on change la vision que l'on a de la performance, d'une vision systme ˆ une vision client.

Les outils ont ŽvoluŽ en parallle de la perception et des besoins des entreprises. J'ai connu un outil comme Witbe ˆ ses dŽbuts, ˆ la fin des annŽes 90, ˆ une Žpoque o il Žtait trs orientŽ  systme. A l'Žpoque, on l'utilisait principalement pour avoir le temps de rŽponse et la disponibilitŽ d'une page web html, sans prendre en compte le contenu de ladite page. Aujourd'hui, certains des outils de mesure de Witbe permettent de rŽaliser des scŽnarii enchainant plusieurs pages, et d'autres outils permettent de faire des chargements de page complets avec de vrais navigateurs, tout en ayant encore la richesse statistique de l'outil.

Le savoir-faire ˆ ŽvoluŽ aussi, ainsi que la manire de crŽer des sites. Du vilain site avec de nombreux tableaux imbriquŽs et de fausses images qui foraient l'aspect et bloquaient les tailles des colonnes, cellules etc, on est passŽ aux sites exploitant enfin vraiment les feuilles de styles (css) et permettant d'accŽder au contenu au travers du javascript pour modifier celui ci ˆ la volŽe, tŽlŽcharger de nouveaux fichiers, envoyer des mises ˆ jour de donnŽes ˆ la volŽe etc.

Cet ebook apporte sa pierre ˆ l'Ždifice de la performance du web. Au travers d'une vue orientŽe internaute et client, on va aborder la question de la performance d'un site web, voir quels sont aujourd'hui les Žcueils les plus handicapants et les plus frŽquents et les mŽthodes qui vous permettront dÕamŽliorer vos performances, de baisser vos cožts, voire de gagner plus de clients. Evoluant entre des aspects fonctionnels, des aspects techniques, c'est une arme ˆ mettre entre toutes les mains : du graphiste au chef de projet, de l'admin rŽseau au dŽveloppeur, tous ont intŽrt ˆ faire des sites web plus beaux, plus efficaces et aussi plus rapides.

 

 

 


 

Pourquoi optimiser?

Optimiser la performance d'un site web, ce n'est pas qu'un vilain mot sorti de la bouche d'un expert fŽru de temps de rŽponse. C'est avant tout un besoin marketing, la volontŽ de baisser le cožt de fonctionnement, le besoin de rŽpondre aux attentes du client. Il faut donc voir les mesures techniques qui contribuent ˆ l'optimisation du temps de rŽponse et du temps d'affichage d'un site sous cet angle.

Baisser les cožts

En optimisant le temps d'affichage de votre site, vous allez Žconomiser sur votre bande passante. L'Žconomie ne sera peut tre pas immŽdiate, elle ne sera peut tre pas non plus dŽfinitive : il est Žvident qu'en amŽliorant la qualitŽ de votre site, vous verrez plus d'utilisateurs, plus souvent, et qui amneront plus de petits copains. Vous allez donc forcŽment augmenter le nombre de visiteurs et le nombre de pages vues. MathŽmatiquement, cela entra”nera une augmentation de la bande passante : mais votre bande passante sera plus rentable.

Mieux ma”triser son architecture

Le fait de vouloir optimiser et rendre beaucoup plus performant vos pages web va vous forcer ˆ avoir une meilleure ma”trise de votre architecture, et de conna”tre parfaitement celle ci : serveurs web, Žquipement de performance et de sŽcuritŽ, utilitŽ de ceux ci, systmes de cache, flux existants.

Bien entendu, vous devez dŽjˆ conna”tre votre architecture, et tre capable de valider lÕusage de tel ou tel Žquipement et application dans un parcours web. Si vous nÕtes pas encore capable de le faire, soyez sžr que le fait de se pencher sur votre disponibilitŽ et votre performance va vous forcer ˆ le faire.

AmŽlioration de la qualitŽ perue

Si vous amŽliorez la performance de votre site, notamment sur ses pages les plus importantes, vous amŽliorerez la perception des utilisateurs : votre site est plus prs plus rŽactif ˆ leurs besoins, plus efficace et il est donc meilleur que celui de votre concurrent direct.   Si votre site est un site de e-commerce, lÕamŽlioration de la qualitŽ se convertira automatiquement en espces sonnantes et trŽbuchantes.

NÕoubliez que votre  concurrent sur internet nÕest quÕˆ un clic de souris, et que les utilisateurs qui sont prts ˆ faire la queue pendant plusieurs minutes ˆ la caisse, debouts, pressŽs, sont les mmes qui vont refuser dÕattendre plus de 15 secondes sur le panier de votre site.

 


 

 

 

 

PARTIE I

Plantons le dŽcor

 



Rappels thŽoriques : comment a marche le web?

Avant de commencer ˆ voir dans le dŽtail ce qui prend du temps dans le tŽlŽchargement d'une page web, on va reposer un peu les bases d'un certain nombre de fonctionnements du web de 2007.

Aujourd'hui, quand on visite un site web, on ouvre son navigateur prŽfŽrŽ, qu'il s'agisse d'Internet Explorer, de Firefox, de Safari ou d'un autre encore plus exotique (Opera, Camino, lynx...). On va directement ˆ une adresse en www.quelquechose.fr ou .com, on clique sur un lien, on remplit un formulaire, voire on accde ˆ une application comme un webmail.

A chaque clic, on dŽclenche une requte http qui va chercher une ressource, en gŽnŽral une ressource html. Il y a donc du trafic rŽseau du navigateur vers le serveur (quel qu'il soit) que nous appellerons trafic montant. Cette requte donne lieu ˆ une rŽponse du serveur. La rŽponse peut tre une redirection, ou du contenu. S'il s'agit de contenu html, le navigateur attend d'avoir tout le contenu et commence ˆ parser, c'est ˆ dire ˆ analyser et transformer en infos qu'il peut comprendre, le contenu. Il rencontre des balises, de nouvelles ressources qui lui sont indiquŽes comme nŽcessaires (une image, un fichier Flash, une feuille de style...). Pour chaque de ces ressources, il va initier un autre cycle requte/rŽponse. C'est ˆ dire que pour chaque image, css, javascript, il va crŽer une requte, l'adresser au serveur et attendre que celui ci lui renvoie la ressource pour l'exploiter.

 

AppleMark

etc ....

A chacune des requtes et des rŽponses, on va distinguer une partie en-tte (header) qui contient des mŽta donnŽes, et les donnŽes elles-mme. L'en-tte contient des informations, le Referer (pour qui je demande cette ressource), les informations du navigateur, etc:

Informations gŽnŽralement trouvŽes dans les en ttes de requtes

Host    

User-Agent    

Accept    

Accept-Language    

Accept-Encoding    

Accept-Charset    

Keep-Alive    

Connection    

Referer    

Cookie

Informations trouvŽes dans les en ttes de rŽponses

Date

Server

Last-Modified

Etag

Accept-Ranges

Vary

Content-Encoding

Content-Length

Content-Type

 

Ces enttes ne sont pas limitatifs et nous verrons que d'autres existent qui ont un intŽrt.

 

Quand on charge une page html, on ne sait pas d'o vient le contenu : on peut avoir une page de Yahoo, avec des images qui viennent de l'AFP, de la pub d'une rŽgie, une autre d'une autre rŽgie. Ces diffŽrents contenus sont fournis par diffŽrents services. Sans avoir diffŽrents services, on peut aussi avoir diffŽrents serveurs ˆ l'intŽrieur d'un mme domaine. Ce n'est le cas que quand on commence ˆ avoir un gros serveur, et un gros service.

Exemples d'Žchanges entre un navigateur et un serveur

Request Headers

Host

www.google.fr

User-Agent

Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4

Accept

text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Accept-Language

en-us,en;q=0.5

Accept-Encoding

gzip,deflate

Accept-Charset

ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive

300

Connection

keep-alive

Cookie

PREF=ID=a4a..............07:LM=117605450..............6M1PV

 

Response Headers

Cache-Control

private

Content-Type

text/html; charset=UTF-8

Content-Encoding

gzip

Server

GWS/2.1

Content-Length

1688

Date

Wed, 04 Jul 2007 20:15:45 GMT

 

La difficultŽ est souvent de faire le tri entre la performance des diffŽrents ŽlŽments qui font la rapiditŽ d'une page, de simplifier les diffŽrentes requtes et de trouver les fautifs. On peut s'appuyer sur les quelques outils qui sont fournis de base avec un navigateur, mais ceux ci s'avrent rapidement insuffisants.


 


Les types de contenus chargŽs

HTML

Le HTML reste le principal format des pages web. Il sÕagit dÕun texte formatŽ avec des balises selon des rgles assez strictes et prŽcises qui Žvoluent avec les versions.

CSS

Les feuilles de styles sont des fichiers annexes aux pages HTML qui fournissent les rgle de formatage typographiques des diffŽrents ŽlŽments de la page : paragraphes, images, titres, zones spŽcifiques (pieds de pages, menus etc)

Javascript

Les fichiers javascript sont des fichiers de code ˆ exŽcuter par le navigateur, pas pa le serveur

Images

Les images dÕun site web peuvent tre de trois formats : gif (256 couleurs), jpeg (adaptŽ aux photos), png (multiusage, destinŽ ˆ internet). Un format vectoriel existe mais est trs rarement utilisŽ : le svg.

Multimedia

Par multimedia, jÕentends interactif et animŽ, ou vidŽo. Les fichiers animŽs interactifs sont principalement des fichiers Flash, un format propriŽtaire mme sÕil est public. La vidŽo est en gŽnŽral sous le format Flash VidŽo, vu lÕubiquitŽ du lecteur Flash sur les navigateurs : la part des navigateurs ŽquipŽs de la dernire version de Flash est estimŽe ˆ 92%.


 

Temps de chargement de page vs temps de chargement html

L'outillage d'analyse de la performance est un outillage client. Ce n'est pas un outillage serveur, sur les performances des applications.

Abordons la question de la performance des applications serveurs une dernire fois ici pour dire ˆ quel point ce n'est pas le sujet de cet ebook, et ce n'est pas un sujet aussi complexe et mal ma”trisŽ que celui de la performance globale de la page.

Tout bon dŽveloppeur se doit d'effectuer des tests sur les applications qu'il livre, notamment des tests de performance. Ces tests de performance existent pour vŽrifier qu'une application est capable, en fonction des services auxquelles elle est connectŽe et des serveurs sur lesquels elle est hŽbergŽe de servir le nombre de requtes par secondes qui lui est demandŽ. Le niveau dÕexigence de capacitŽ vient du marketing, ou de quelqu'un avec une vision marchŽ du service. Pour analyser des dŽrives qui pourraient se produire en production, ce dŽveloppeur va ajouter tout une ensemble de traces, activables ˆ la volŽe ou pas, qui lui permettront d'Žvaluer le temps de rŽponse d'une page de manire fine, en regardant o il perd du temps. Il pourra ensuite le faire sur une pŽriode un peu longue (quelques minutes ou quelques heures) pour rechercher la cause d'une lenteur. C'est le moins que l'on attend de lui.

Evidemment il y a le plus : la capacitŽ ˆ activer des logs en fonction de certains paramtres, par exemple uniquement sur certaines requtes ou certaines pages. Ce plus ne semble pas tre ˆ la portŽe de tout le monde, et la plupart des dŽveloppeurs s'arrtent ˆ un tout ou rien : soit je trace tout, soit je ne trace rien...

 

Quelque soit l'analyse qui est menŽe ˆ partir de ces tests et de ces traces, elle finit en gŽnŽral par une refonte d'architecture applicative, une augmentation de capacitŽ de traitement, un achat de serveur, un ajout d'index : des choses connues et ma”trisŽes par les dŽveloppeurs.

Mais les dŽveloppeurs ont rarement une bonne vue de l'intŽgralitŽ de la cha”ne d'affichage de la page. Il comptent en requtes par seconde sur une seule ressource, leur page. On va vite dŽcouvrir qu'ils ne sont pas en charge de la performance totale des pages.


 

Les outils pour analyser son temps de chargement

Dans le sujet qui nous occupe, la performance vu du c™tŽ utilisateur, les outils sont relativement peu nombreux. J'en conseille quatre sur diffŽrents navigateurs.

Firebug

Firebug (https://addons.mozilla.org/en-US/firefox/addon/1843) est une extension pour Firefox. Pour l'installer sur Firefox, il suffit d'aller sur le site, de cliquer sur le logo. Firefox est protŽgŽ et refusera en premier lieu de le tŽlŽcharger. Une fentre d'avertissement vous permettra d'accŽder aux rŽglages permettant de rendre possible l'installation.

C'est un couteau suisse qui a plusieurs fonctionnalitŽs. Celle qui nous intŽresse est le dernier onglet 'Net'. Quand on accde ˆ une page, ce module enregistre tous les enttes de requte et de rŽponse. Ils les prŽsente ˆ la volŽe dans un chronogramme. Cela permet de voir comment, en combien de temps et ˆ quel moment sont tŽlŽchargŽs tous les ŽlŽments de la page. Ensuite, chaque ŽlŽment est accessible et on peut aller voir les enttes de requte et de rŽponse.

AppleMark
Firebug en action sur la home de Google : les requtes et pour chacune le dŽtail des enttes http

Deux dŽfauts de Firebug :

- il prend mal en compte ce qui est dans le cache. C'est ˆ dire qu'il reprŽsente quand mme les ŽlŽments qui ne sont pas tŽlŽchargŽs mais viennent du cache du navigateur comme s'ils Žtaient tŽlŽchargŽs. Je n'apprŽcie pas personnellement la reprŽsentation du cache.

- il efface l'historique ds qu'on tŽlŽcharge une page html : on n'a donc qu'une page visible ˆ la fois, et il fait dispara”tre les redirections intermŽdiaires qui peuvent exister entre deux pages.

A part ces deux dŽfauts, il est trs agrŽable d'utilisation et permet d'avoir une bonne apprŽciation gŽnŽrale et en dŽtail de ce qui se passe en affichant une page. Accessible d'un seul clic dans Firefox, il peut vous montrer ce qui s'est passŽ sur la page affichŽe sans que vous ayez besoin de le dŽclencher avant de la charger (c'est apprŽciable, je vous assure).

HttpWatch

http://www.httpwatch.com

HttpWatch est un plug in pour Internet Explorer, le navigateur qui domine le marchŽ des navigateurs. Rien que pour cette raison, il est indispensable. Le comportement de Internet Explorer n'est en effet pas le mme que celui de Firefox.

HttpWatch vient en deux versions : une gratuite le HttpWatch basic, et une payante. La version gratuite est suffisante dans la plupart des cas, surtout si vous associez l'usage de HttpWatch avec celui de Firebug ou Tamper Data.

La version gratuite se limite en effet ˆ rŽcupŽrer le dŽmarrage, le temps complet du cycle requte-rŽponse, la taille de la requte et de la rŽponse, le code rŽponse et l'url de la requte. Elle ne vous montre pas le contenu des enttes, il n'y a pas de chronogramme, etc.

Elle vous montre aussi un rŽcapitulatif assez intŽressant, avec la performance, les codes, le nombre de chargements, de connections etc. Quelques informations que vous ne trouverez pas, ou pas aussi bien prŽsentŽes avec les deux outils prŽcŽdents.

Le gros inconvŽnient de HttpWatch est son prix dans la version complte, plut™t excessif par rapport aux fonctionnalitŽs.

Ai je prŽcisŽ que les deux outils fonctionnant avec Firefox fonctionnent de la mme manire sur pc et sur mac? Pas besoin de redŽmarrer son mac sous windows avec boot camp ou de lancer Parallels pour tester un site.

Safari Web Inspector

http://www.apple.com/fr/safari

Nouveau et intŽressant (tout chaud sorti du four ˆ programmes), la beta de safari 3.0 fonctionne ˆ la fois sur mac et sur pc (windows 2000, XP et vista). Le tŽlŽchargement est bien entendu gratuit (mais attention c'est une version beta c'est ˆ dire en cours, et qui peut planter).

Le principal intŽrt pour ce qui nous concerne vient d'un outil qui est intŽgrŽ ˆ cette version intermŽdiaire qui s'appelle le web inspector. Celui ci est disponible avec les dernires versions et permet d'un clic droit de la souris sur une page de visualiser plein d'informations intŽressantes, comme le contenu source de chacun des fichiers de la page, le log javascript avec les erreurs rencontrŽes, et un onglet 'rŽseau' qui permet de voir comme avec Firebug les diffŽrents tŽlŽchargements, leur temps, leur ordre etc.

le web Inspector de Safari 3 beta sous Windows

Ici on le voit en action sur une page de Yahoo avec de la pub  en vidŽo (ce qui explique la taille gigantesque de la page). Ce que j'apprŽcie de prime abord sur cet outil est le rassemblement en diffŽrents items (javascripts, css, images, html) des diffŽrents objets de la page, et la vue synthŽtique poids et temps de chargement ce qui permet de discerner rapidement ce qui prend du poids et du temps. Apparemment, pour rendre leur navigateur trs rapide, les dŽveloppeurs travaillant sur Safari ont boostŽ le nombre de connexions simultanŽes et on le voit bien ici avec toutes ces lignes ayant le mme top dŽpart.

Cet outil est encore un peu jeune et manque ˆ mon avis de quelques informations et de quelques options. Il mŽrite d'tre suivi. Etant open source (Webkit) vous pouvez intervenir sur les sources, voire les recompiler vous mme si vous vous sentez l'‰me d'un hacker. Vous pouvez surtout vous appuyer dessus pour ajouter les fonctionnalitŽs que vous dŽsirez.

Yslow

http://developer.yahoo.com/yslow/

Yahoo performance group a sorti en juillet 2007 un outil qu'ils avaient depuis longtemps dans leurs cartons : Yslow.

C'est un plugin de plugin: il se branche sur Firebug pour faire des recommandations. Il vous donne des notes selon certains critres (un peu diffŽrents de ceux ŽvoquŽs plus tard ici),ce qui vous permet d'Žvaluer la qualitŽ de vos performances.

LÕonglet performance vous permet dÕŽvaluer votre conformance ux recommandations du Yahoo Performance Group. Personellement je ne suis pas convaincu par toutes ces recommandations, mais elles ne sont pas plus mauvaises que dÕautres ;-)

AppleMark

Le jugement de YSlow sur ses pages : D

AppleMark

LÕonglet Stats : savoir combien on peut gagner sur le cache et les cookies


 

 

 

PARTIE II

Comment accŽlerer des pages web


 

Comment avoir une trs bonne performance

La rgle des 80/20

Dans une dŽrive de la loi de Pareto (ce sont 20% des clients qui gŽnrent 80% des plaintes, ou 20% des plus riches dŽtiennent 80% des richesses), on peut dire que l'on consacre 80% de ses efforts sur ce qui ne reprŽsente que 20% du temps de chargement : le html. Si on regarde des exemples rŽels de temps de chargement, on est rapidement ŽtonnŽs de voir que celui ci ne reprŽsente qu'une part ridicule du temps d'affichage :


les requtes de chargement de la page d'accueil de Yahoo France. Le html c'est la premire en haut ˆ gauche.

Par exemple, le chargement de la page d'accueil de Yahoo prend soit 359ms, soit 3.09s selon le point de vue que l'on choisit : 359ms pour la page html seule, le reste Žtant dŽvolu au chargement de toutes les ressources qui vont permettre de construire et d'afficher la page dans son ensemble. Dans ce cas, le html ne reprŽsente que 10% et quelques du temps d'affichage de la page.

Faire porter ses efforts sur le fichier html est donc une aberration. Une aberration qui peut avoir du bon dans des cas extrmes, comme la page d'accueil de Google, mais seulement dans ces cas :

les mme requtes chez Google : minimaliste

Temps de chargement total : 94ms, dont temps de chargement du html: 63ms.

On peut varier les exemples sur toute une sŽrie de sites web :

Site web

Temps dÕaffichage

Temps HTML

Yahoo.fr

3.09 s

359 ms

Google.fr

94 ms

63 ms

amazon.fr

938 ms

407 ms

france2.fr

4.71 s

63 ms

orange.fr

4.3 s

32 ms

bouyguestelecom.fr

2.29 s

63 ms

sfr.fr

2.02 s

31 ms

liberation.fr

12.7 s

156 ms

flickr.com

828 ms

16 ms

lemonde.fr

8.88 s

188 ms

cyrilgodefroy.com

1.52 s

94 ms

msn.fr

3.67 s

102 ms

skyblog.com

4.75 s

89 ms

free.fr

2.53 s

1.53 s

dailymotion

6.97 s

359 ms

 

Bien Žvidemment, il n'est pas question de faire des efforts que sur le temps html puisque celui ci ne reprŽsente qu'une toute petite part du temps de chargement et d'affichage complet de la page. C'est le temps de chargement de tous les autres ŽlŽments qui va permettre de faire la diffŽrence. Imaginez si vous gagnez 10% de performance sur le html sur la home de yahoo, vous gagnez 30ms. Si vous amŽliorez le reste, vous gagnez 300ms : 10 fois plus. C'est encore plus vrai sur le site de France 2, ou de LibŽration... Comme on le verra, on peut gagner plus que 10%.

 

 

 

80 ˆ 90% du temps d'affichage d'une page est passŽ c™tŽ client. Commencez par lˆ!



 

TŽlŽcharger les bons fichiers au bon moment

Certains crŽateurs de sites web perdent le sens des rŽalitŽs ˆ force de faire des tests sur leur machine locale ou sur un rŽseau trs rapide. La puissance des machines peut avoir un effet masquant des problmes les plus importants. Je me suis donc mis ˆ la place d'un internaute moyen et j'ai cherchŽ ˆ reprendre le b-a-ba du chargement de page : qu'est ce qui prend du temps, qu'est ce qui bloque, comment se dŽclenchent les tŽlŽchargements.

J'ai pour cela crŽŽ plusieurs pages trs simples, avec beaucoup d'ŽlŽments en gŽnŽral pour exagŽrer volontairement les rŽsultats. Ces tests sont accessibles ˆ l'adresse http://cyrilgodefroy.com/fr/testqos/ . Si vous dŽsirez exploiter ˆ outrance ces tests, je vous invite ˆ tŽlŽcharger ces tests disponibles sur la mme page et ˆ les installer chez vous.

Ces tests ne sont pas forcŽment trs durs ˆ rŽaliser, et n'apportent pas toujours des dŽcouvertes phŽnomŽnales. Ils permettent de valider ce que l'on sait dŽjˆ peu ou prou.

Ces fichiers de test avec les mesures que l'on peut effectuer en les exŽcutant avec internet Explorer et Firefox nous apprennent beaucoup de choses sur ces navigateurs, ou valident des choses dont nous nous doutions auparavant.

Les navigateurs sont diffŽrents

Cela parait peut tre Žvident ˆ la plupart d'entre nous : les Žquipes de IE et celles de Mozilla, bien qu'elles soient parties du mme navigateur, Mosaic, ont divergŽ ˆ plusieurs reprises, et leur stratŽgie est diffŽrente quant au tŽlŽchargement et au parsing des pages. Et il y a le rejeton WebKit (Safari pour le grand public), ˆ l'origine seulement sur Mac, depuis quelques jours sur Windows.

Ces diffŽrences ne sont pas dramatiques, mais elles peuvent expliquer la diffŽrence de rapiditŽ d'affichage de pages ou de parcours. Je me suis retrouvŽ dans certains cas ˆ avoir jusqu'ˆ 30% de diffŽrence entre firefox et internet explorer sur un parcours. Les mesures avaient tendance ˆ mettre en exergue cette diffŽrence.

Ce qu'il y a dans le header, c'est important

Les enttes des fichiers html sont bien trop souvent ignorŽes par les dŽveloppeurs.

Je ne parle mme pas de la syntaxe des balises d'indication des pages. Non, je parle de ce qu'il y a dans la balise header. On a l'impression que c'est une poubelle. Plusieurs css, diffŽrents js, des scripts en dur en plus, le tout sans logique ni rŽflexion.

Le cas le plus flagrant est la sŽrialisation du tŽlŽchargement des fichiers css et javascripts. Plut™t que de rŽflŽchir, ou de faire du copier coller pour concatŽner le contenu de plusieurs fichiers dans un seul et sous le prŽtexte fallacieux de rendre modulaire, les dŽveloppeurs rajoutent des liens vers des fichiers css et javascripts ˆ tire-larigot. Un exemple?

       <script>

         __IS_NO_PROXY__ = true;

       </script>

       <script src="http://s3.unsiteweb.fr/js/css_ie_bug.js" type="text/javascript"></script>

       <link rel="stylesheet" href="http://s3.unsiteweb.fr/css/default_size.css" type="text/css" />

 

       <link rel="stylesheet" href="http://s4.unsiteweb.fr/css/default_struct.css" type="text/css" />

       <link rel="stylesheet" href="http://s4.unsiteweb.fr/css/default_blocks_size.css" type="text/css" />

       <link rel="stylesheet" href="http://s2.unsiteweb.fr/css/default_blocks_definitions.css" type="text/css" />

       <link rel="stylesheet" href="http://s2.unsiteweb.fr/css/default_nav_header.css" type="text/css" />

       <link rel="stylesheet" href="http://s2.unsiteweb.fr/css/default_nav_footer.css" type="text/css" />

       <link rel="stylesheet" href="http://s3.unsiteweb.fr/css/default_size.css" type="text/css" />

       <link rel="stylesheet" href="http://s3.unsiteweb.fr/css/common.css" type="text/css" />

       <script>

         document.cfg_default_path = "http://s3.unsiteweb.fr/js/dlib4/";

       </script>

 

       <script src="http://s3.unsiteweb.fr/js/dlib4/dlib4.07.js" type="text/javascript"></script>

       <script type="text/javascript">

         dlib_load_extension("layers");

         dlib_load_extension("events");

       </script>

       <script src="http://www.unsiteweb.fr/nav/nav_js.jsp" type="text/javascript"></script>

       <script src="http://s3.unsiteweb.fr/js/nav_left.js" type="text/javascript"></script>

       <script src="http://s3.unsiteweb.fr/js/nav_top.js" type="text/javascript"></script>

       <script src="http://s3.unsiteweb.fr/js/common.js" type="text/javascript"></script>

 

       <script src="http://s3.unsiteweb.fr/js/scroll.js" type="text/javascript"></script>

       <script src="http://s3.unsiteweb.fr/js/m_select.js" type="text/javascript"></script>

       <noscript>Votre navigateur doit supporter Javascript pour visualiser le site.</noscript>

       <link rel="stylesheet" href="http://s4.unsiteweb.fr/css/musique_jeux/common.css" type="text/css" />

       <link rel="stylesheet" href="http://s1.unsiteweb.fr/css/musique_jeux/nav_left.css" type="text/css" />

 

       <link rel="icon" href="images/common/favicon.ico" type="image/x-icon" />

       <link rel="shortcut icon" href="images/common/favicon.ico" type="image/x-icon" />

 

       <link rel="stylesheet" href="http://mus3.unsiteweb.fr/css/unsiteweb_music.css" type="text/css" />

       <link rel="stylesheet" href="http://mus2.unsiteweb.fr/css/musique_jeux/music.css" type="text/css" />

      

       <script src="http://mus3.unsiteweb.fr/js/unsiteweb_music.js" type="text/javascript"></script>

       <script type="text/javascript" src="http://mus3.unsiteweb.fr/js/lib_utils.js"></script>

       <script type="text/javascript" src="http://mus3.unsiteweb.fr/js/class_ToolTipBox.js"></script>

      <script type="text/javascript" src="http://mus3.unsiteweb.fr/js/class_ToolTipBoxManager.js"></script>

 

      <script type="text/javascript" src="http://mus3.unsiteweb.fr/js/ttb_settings.js"></script>

       <script src="http://mus3.unsiteweb.fr/js/navg_unsitewebmusic.js" type="text/javascript"></script>

       <!--<script src="js/mouseEvtHandler.js" type="text/javascript"></script>-->

 

DŽsolŽ! Ce n'est pas trs sympa de vous infliger cela. Mais c'est un exemple rŽel, j'ai juste honte pour eux, et je cache (un peu) leur vrai nom.

Le bon doctype pour le bon parser

Un petit appartŽ sur le doctype de vos fichiers. Si vous faites des fichiers qui s'appellent .html, qui sont servis par des serveurs http qui ont le mimetype de text/html rŽglŽ pour les fichiers .html, ne vous amusez pas ˆ mettre un doctype en xhtml. Vous allez vous fatiguez pour rien, voire vous tirer dans le pied.

Cet article d'un contributeur Webkit (maciej) explique en anglais et dans des termes assez simples la question (http://webkit.org/blog/68/understanding-html-xml-and-xhtml/). Ce qu'il faut en retenir :

¥faire un document en xhtml vous expose ˆ des non affichages si le parser rencontre une erreur.

¥Internet Explorer ne sait pas lire le xhtml.

¥seul l'en tte http de MIME type application/xhtml+xml est traitŽe en xhtml. Les autres sont traitŽs en html

¥Il faut mettre un doctype HTML qui active le mode standard des navigateurs : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


 


Ce que l'on apprend des tests mis en ligne

On apprend quelques infos pas compltement inintŽressantes, alors je suis attentif aux suggestions que certains lecteurs pourraient me faire pour aller plus loin dans l'analyse du comportement des navigateurs. J'ai en effet conu ces tests en fonction des comportements que j'ai observŽ, mais je n'ai pas tous les navigateurs ˆ disposition, et les choses sont supposŽes Žvoluer d'une version ˆ l'autre.

Le chargement des css

Suivant les navigateurs le chargement des css ne se fait pas de la mme faon : sur IE et Safari, les fichiers css peuvent tre chargŽs en mme temps. Sur Firefox, le chargement des css est sŽquentiel : on finit de charger un css avant de lancer le chargement d'un autre.

David Hyatt (of WebKit Fame) a Žcrit une explication de ce qui se passe dans Firefox et Safari par rapport ˆ l'exŽcution des styles. Je ne sais pas si c'est toujours vrai pour Safari, ni mme pour Firefox, mais l'intŽrt de son commentaire rŽside dans l'explication des affres auxquels il doit faire face concernant la question du rendu des styles.

Chargement des css ne veut pas dire utilisation des css. En effet, on peut tre confrontŽ ˆ un autre problme quand le css est long : le flash de rendu qui se produit sous IE quand celui ci commence enfin ˆ rendre les pages.

AppleMark

Sous Safari

AppleMark

Sous Firefox

 

PrŽoccupons nous en attendant du chargement (partie rŽseau) des css : je vous conseille de rassembler vos css dans le minimum de fichiers pour Žviter de vous retrouver face au chargement sŽquentiel de Firefox. Mettez les au dŽbut de votre page html, dans l'entte du html.

Une question que je n'ai pas abordŽe car c'est une instruction que je n'ai pas rencontrŽ depuis longtemps est l'usage du @import dans les css. Cette instruction des feuilles de style n'est activŽe qu'une fois que le css est compltement chargŽ et commence ˆ tre analysŽ par le navigateur. Dans ces conditions, on recrŽe un chargement sŽquentiel des fichiers css... Il y a peu, un dŽveloppeur plein de bonne volontŽ mÕa ŽvoquŽ quÕil pourrait rapidement amŽliorer son site avec plusieurs css en insŽrant le deuxime dans le premier. Il a vite compris son erreurÉ

Le chargement des javascripts est sŽquentiel

Ce comportement est prŽvisible car l'ordre des fonctions dans un fichier javascript a une importance vitale : je ne vais pas appeler une fonction dans un deuxime fichier javascript si je ne suis pas sžr que le premier fichier javascript qui contient cette fonction a ŽtŽ tŽlŽchargŽ. Ce chargement en sŽquence se produit que les fichiers javascripts se trouvent dans l'en tte html ou ˆ l'extŽrieur.

Deux tests diffŽrents, les tests 8 et 9 permettent de vŽrifier ce que le chargement d'un javascript peut faire sur le chargement des images ou autres ressources statiques. Dans ces deux tests, j'ai mis les javascripts dans le corps du html. Jusqu'ˆ lˆ pas de miracle : le rŽsultat de cet emplacement est exactement le mme que celui du placement dans les en ttes. Par contre, le fait de rencontrer un fichier javascript reporte le chargement des images qui peuvent tre devant ou derrire.

J'ai mme poussŽ le vice jusqu'ˆ faire un test 10 en mettant deux fichiers image entre deux fichiers javascript pour voir ce qu'il se passait : oh surprise, on lance bien le chargement de ces deux fichiers en parallle, mais le fichier image qui est aprs les deux fichiers en question attend que le tŽlŽchargement du deuxime fichier javascript soit fini.

Ce qui se passe peut aussi conduire ˆ Žcrire la rgle suivante :

le chargement des javascripts retarde le chargement de tous les ŽlŽments qui se trouvent derrire

Je tire de tous ces tests une conclusion : il faut concentrer au maximum le contenu des javascripts dans un seul fichier, quitte ˆ appeler les fonctions de ces fichiers en insŽrant directement les fonctions dans le code html. On risque sinon de voir tous les chargements d'images qui se trouvent aprs bloquŽs.

Le code que je vous ai montrŽ plus haut est aprs ces deux sŽries de tests le pire que l'on puisse trouver :

¥13 fichiers de styles

¥14 appels de javascripts (presque 15)

¥1 ficher javascript avant le chargement des styles : ils doivent attendre la fin du chargement

¥Des styles au milieu du lot des fichiers js

Je vous jure que cet exemple est pris sur un vrai site, vraiment public. Et ce site est censŽ recevoir une masse importante de trafic. Le meilleur est que dans le corps du html on trouve encore des appels ˆ des scripts js.


 


TŽlŽcharger plus vite en tŽlŽchargeant mieux

Une information dont certains dŽveloppeurs de navigateurs se gardent bien de parler, et qui a une importance indŽniable sur la rapiditŽ de chargement d'une page complte est le nombre de connexions simultanŽes. On peut jouer sur ce paramtre pour absorber la charge sur les navigateurs qui souffrent le plus de nombre de connexions faibles.

Il est Žvident que si les navigateurs n'avaient qu'une connexion rŽseau (ˆ un niveau applicatif, pas au niveau signal ou c‰ble), les pages risqueraient d'appara”tre beaucoup moins vite : les paquets se perdent (pas beaucoup, mais cela arrive), des contentions peuvent se produire. Le protocole TCP/IP permet de rŽduire les risques de perdre tout un contenu ˆ cause d'un petit bout qui serait mal passŽ, mais il n'est pas parfait et ne permet pas d'assurer une qualitŽ parfaite. D'autant que les ŽlŽments ˆ chaque bout de la cha”ne (navigateur et serveur) ont aussi des latences (des temps de retard) pour aller chercher une ressource ou pour la fournir.

Les navigateurs ont donc plusieurs connexions rŽseau ouvertes pour tŽlŽcharger plusieurs ressources en parallle. Firefox 2.0 vient de base avec une capacitŽ de 8 connexions par serveur et 24 connexions en tout. Cela signifie que ce navigateur va lancer 8 tŽlŽchargements de ressources en concurrence vers un serveur par exemple serveur1.siteweb.com, et qu'il ne pourra pas tŽlŽcharger plus de 24 ressources en mme temps. Ensuite, il fait sa sauce si plus de 3 connexions serveur sont ouvertes en mme temps.

Pour sÕen rendre compte, on peut accŽder aux configurations cachŽes en tapant lÕurl about:config dans la barre dÕadresse. Le paramtre network.http.max-connections-per-server est ˆ 8:

AppleMark

Un autre paramtre sur lequel le navigateur peut jouer pour tŽlŽcharger plus vite des ŽlŽments est le pipelining : l'idŽe est de passer plusieurs requtes dans la mme connexion ˆ la fois, et d'attendre la rŽponse ˆ toutes ces requtes avant d'en lancer d'autres. tŽlŽchargement souffre de problmes de fiabilitŽs : si une rŽponse met du temps, toutes les rŽponses mettent du temps. Et cela mettrait ˆ genoux les serveurs ˆ fort trafic (imaginez devoir ouvrir une connexion et la laisser ouverte pour chaque utilisateur sans savoir quand celui ci va la refermer). AujourdÕhui, aucun navigateur nÕest rŽglŽ par dŽfaut de cette manire et ce nÕest pas prt de se produire.

On a parlŽ de Firefox, mais on n'a pas parlŽ du navigateur qui fait encore la majoritŽ du parc : Internet Explorer 6 et 7. La version 6 d'Internet Explorer a par dŽfaut moins de connexions ouvertes par serveur (http://support.microsoft.com/kb/183110 et http://support.microsoft.com/default.aspx?scid=kb;fr-fr;Q282402 ). On ne peut donc pas parallŽliser de la mme faon le tŽlŽchargement des fichiers sur Internet Explorer et sur Firefox dans la version par dŽfaut.

Dans le cas de Internet Explorer en https,  la situation s'aggrave : le nombre de connexions simultanŽes en protocole https est encore infŽrieur. On peut voir le phŽnomne d'empilement des tŽlŽchargements s'aggraver. Dans HttpWatch, les tŽlŽchargements sont lancŽs ˆ peu prs au mme moment, mais  les fichiers mettent de plus en plus de temps ˆ arriver.

J'ai mis sur le serveur http://cyrilgodefroy.com/fr/testqos des tests permettant d'observer le phŽnomne: essayez avec vos diffŽrents navigateurs pour voir comment se passe le chargement de fichiers diffŽrents dans la configuration par dŽfaut.

Faire du chargement parallle sans devoir tout casser

Pour faire du chargement parallle de ressources sans devoir aller changer les configurations sur les navigateurs des visiteurs (ce qui n'est pas tout ˆ fait faisable), il faut un autre serveur. On a en effet vu que le navigateur ouvre un certain nombre de connexions par serveur. Si on augmente le nombre de serveurs, on multiplie donc le nombre de canaux de tŽlŽchargement.

Je pourrais donc vous inviter ˆ crŽer un serveur img.monsiteweb.com pour stocker vos ressources statiques images dessus, et de les mettre dessus. Pas forcŽment facile ˆ faire en production, surtout si vous partez ensuite sur l'idŽe de faire des serveurs physiquement diffŽrents, ou de stocker les fichiers dans des arbres diffŽrents de rŽpertoires.

La solution qui vous permet de rapidement rajouter un serveur sans changer votre hŽbergement, en modifiant peu votre configuration serveur? Utilisez un CNAME dans le serveurs de noms de votre domaine. Le CNAME est un alias qui fait pointer notre serveur img.monsiteweb.com vers votre serveur www.monsiteweb.com. Il faut alors que votre serveur http soit capable de rŽpondre ˆ toutes les requtes vers une adresse de type *.monsiteweb.com avec les mmes rŽglages et le tour est jouŽ.

Les limites du tŽlŽchargement parallle

Ce travail d'utilisation de plusieurs noms de serveurs a des limites : en effet le fait d'ouvrir une connexion a un cožt : rŽsolution du nom de machine, ouverture de la connexion rŽseau, rŽutilisation aprs un tŽlŽchargement prend un petit peu de temps ˆ chaque fois. Il y a une limite autour de 4 noms de serveurs ˆ partir de laquelle le temps gagnŽ ˆ parallŽliser est supplantŽ par le temps de toutes ces opŽrations.

Lˆ encore, j'ai prŽparŽ plusieurs sŽries de fichiers disponibles ˆ partir de l'url http://cyrilgodefroy.com/fr/testqos qui permettent de valider avec son navigateur cible le comportement idŽal ˆ reproduire pour une page.

 


 

AmŽliorer le cache

Certains amis de monsieur La Palisse diraient que le moyen le plus rapide de fournir ˆ un internaute un fichier c'est encore de faire en sorte qu'il l'ait dŽjˆ.

Ils n'ont pas compltement tort: c'est justement pour celˆ que les navigateurs ont inventŽ le cache. Celui ci est utilisŽ pour stocker les ressources dŽjˆ utilisŽes sur l'ordinateur ou le tŽlŽphone de l'internaute, en mŽmoire ou sur disque, et recharger ces ressources quand elles sont redemandŽes. Suivant les navigateurs, la taille du cache, le fonctionnement du cache est diffŽrent (Safari cache ŽnormŽment par exemple). Il faut donc essayer de remplir au maximum le cache des navigateurs. Celui ci fournit aux navigateurs le moyen d'utiliser des fichiers sans qu'il soit nŽcessaire de les tŽlŽcharger : une page dont toutes les ressources sont dans le cache se charge trs trs vite.

Lˆ encore, j'ai fait plusieurs pages de tests avec des directives diffŽrentes pour vous donner les directives les plus efficaces et les techniques qui permettent d'amŽliorer le plus vos temps d'affichage.

Avant d'aborder la question des directives, rŽglons la question des meta headers. J'ai un secret pour vous: Ces balises ˆ insŽrer dans le code html ne sont pas efficaces, et il vaut mieux ne pas les utiliser. Plusieurs raisons :

1. Que voulez vous cacher?  Des fichiers html, ou des ressources qui sont utilisŽes au long d'un parcours? Mettre des pages html diffŽrentes dans le cache ne permet aucune Žconomie... en effet il y trs peu de chance que vous reveniez sur la mme page HTML au cours d'un parcours (mme si cÕest possible et malin).

 

2. Elles ne sont pas prises en compte dans le protocole http 1.1, la version actuelle. Seuls les enttes http sont utilisŽs.

Donner des directives de cache le long de la cha”ne

La version simple dÕune requte http suppose qu'entre un navigateur web et le serveur web, il y a des Žquipements 'passifs' : routeurs, routeur ADSL, switches. Mais l'infrastructure peut tre plus ŽlaborŽe : prŽsence de load balancers pour s'adresser ˆ plusieurs serveurs web, existence de reverse proxies pour contr™ler l'accs ˆ certaines ressources mais pas d'autres, firewalls pour limiter le trafic rŽseau ˆ certains ports.

Deux Žquipements sont importants dans la gestion du cache et viennent s'intercaler dans le flux entre le navigateur et le serveur :

¥le proxy est un Žquipement qui se trouvera sur votre rŽseau local et contr™lera l'accs ˆ internet (pas possible d'aller voir YouTube ou DailyMotion), tout en fournissant un cache local.

¥le reverse-proxy fait la mme chose mais au niveau de votre plate forme d'hŽbergement : contr™le d'accs et cache des objets statiques demandŽs aux serveurs web pour rŽduire la latence due au rŽseau et allŽger la charge des serveurs.

Ces deux types d'Žquipements peuvent aussi exister chez votre FAI : l 'usage de celui ci est alors transparent ou non. Il vise ˆ rŽduire un peu la bande passante utilisŽe sur les liens inter-opŽrateurs et ˆ fournir les objets plus vite.

Ces Žquipements peuvent accueillir vos ressources statiques. Il faut leur demander gentiment, tre capable de leur fixer des rgles pour qu'ils le fassent de la bonne manire pour les bonnes ressources. Sinon, vous pouvez vous retrouver ˆ montrer (ou ˆ voir) une page destinŽe ˆ un autre internaute, parce que ces Žquipements ont 'trop' cachŽ. Ou avec des ressources trop vieilles, parce que la durŽe fixŽe pour le cache est trop importante et aucune revalidation n'est demandŽe.

Les directives ˆ utiliser pour le cache

Il existe plusieurs directives de cache.

La premire et la plus importante est celle qui permet de ne pas avoir de cache. Elle est double (je vous conseille d'utiliser les deux directives, qui peut le plus peut le moins), car il y a la directive du http 1.0 et celle du http 1.1.

Pragma: no-cache

et

Cache-Control: no-cache, no-store

Les autres directives permettent de contr™ler prŽcisŽment le niveau et la durŽe de cache que l'on veut prŽconiser aux navigateurs et aux caches intermŽdiaires.

max-age=

La directive la plus vitale sert ˆ prŽciser la durŽe de cache ˆ appliquer par un navigateur ˆ une ressource. La durŽe prŽcisŽe est en secondes, ce qui explique que le nombre que l'on trouve derrire est parfois trs important. Si Cache-control: max-age=3600 appara”t dans une rŽponse par exemple, le navigateur va considŽrer la ressource ˆ jour pendant une heure. Cette directive est plus importante que la directive Expires, si les deux infos sont prŽsentes dans l'en tte http.

private

private indique aux caches qu'il ne doit pas stocker la rŽponse au navigateur. Cela vaut pour les caches intermŽdiaires, comme les proxies et les reverse-proxies.

public

public indique au cache que la rŽponse peut tre cachŽe alors qu'elle ne devrait pas l'tre (comme par exemple parce qu'elle est authentifiŽe).

no-store

no-store indique que la ressource ne doit pas tre stockŽe dans aucun type de mŽmoire non volatile. Cela permet d'assurer le maximum de confidentialitŽ, hors chiffrement.

must-revalidate

Indique qu'un cache partagŽ ne doit renvoyer une ressource dont la date d'expiration est dŽpassŽe qu'aprs avoir validŽ sa validitŽ auprs du serveur d'origine.

D'autres directives encore plus prŽcises existent, que je vous invite ˆ aller dŽcouvrir directement dans la RFC 2616 : elles sont peu utilisŽes, et n'ont pas lieu d'tre dŽcrites ici.

Comment utiliser les directives de cache?

Pour vous Žviter des heures fastidieuses de recherche dans la littŽrature spŽcialisŽe et sur internet, voici quelques infos pour rŽgler les directives de cache avec Apache. Pourquoi Apache? Parce qu'il sert plus de 50% des pages web dans le monde. Il aurait ŽtŽ un peu idiot de les faire pour lighttpd (le serveur web que j'utilise pour mes sites), qui reprŽsente 0.005% des serveurs http. De plus, Apache dŽfinit un peu le mode standard de rŽglage de tous ces paramtres, Žtant lui mme conu et dŽveloppŽ par des dŽveloppeurs qui cherchent ˆ respecter les standards, normes et recommandations.

Avec Apache, on utilise deux modules diffŽrents pour modifier les enttes http concernant le cache: le module expire et le module header. Vous devriez vous rŽfŽrer ˆ la documentation de ces modules (http://httpd.apache.org/docs/2.0/mod/ ) pour avoir le dŽtail de leur fonctionnement. Le premier module contr™le deux infos des en ttes : Expires et Cache-Control: max-age . Le deuxime module permet de manire gŽnŽrale de modifier les enttes http, nous nous en servirons pour rŽgler l'entte Cache-Control de manire spŽcifique.

Ces modules doivent tre activŽs dans votre configuration Apache. Ensuite, vous pouvez utiliser leurs rŽglages de manire diffŽrente en fonction de vos besoins : dans le fichier principal de configuration d'Apache, dans un autre fichier inclus, rŽpertoire par rŽpertoire (section <Directory>), ou dans des fichiers .htaccess si vous avez activŽ ce rŽglage. Je vous conseille de les tester d'abord dans un fichier htaccess puis de les intŽgrer progressivement dans un fichier de rŽglages spŽcifique en include du fichier de configuration principal.

 

Expire fonctionne avec les directives ExpiresDefault, ExpiresByType, ExpiresActive.

Technique 0

Comment ne pas cacher

Pour ne pas cacher, il faut rŽgler les enttes http Pragma et Cache-Control:

<Directory "/home/website/cgi-bin/">

    Header Set Pragma "no-cache"

    Header Set Cache-Control "max-age=0, no-store, no-cache"

</Directory>

Technique 1:

Faites un rŽpertoire avec les images qui changent tous les 10 ans et mettez des directives agressives.

Il y a peu de chances pour que votre logo change tous les 3 jours ou que certaines images de votre site soient modifiŽes mme tous les mois. Ces ressources peuvent tre cachŽes sans limite de durŽe par les caches, quels qu'ils soient. N'hŽsitez pas ˆ ajouter des directives agressives du type :

- mettre les ressources de ce rŽpertoire en cache avec une date d'expiration dans 10 ans

- mettre toutes les ressources d'un type en cache avec une date d'expiration dans 10 ans

Pour le premier cas, cela donne ceci:

 

<Directory "/home/website/images/s">

    Options FollowSymLinks MultiViews

    AllowOverride All

    Order allow,deny

    Allow from all

    ExpiresDefault "access plus 10 years"

</Directory>

 

La deuxime stratŽgie donne

<Directory "/home/website">

    Options FollowSymLinks MultiViews

    AllowOverride All

    Order allow,deny

    Allow from all

    ExpiresByType image/gif "access plus 10 years"

    ExpiresByType image/jpg "access plus 10 years"

    ExpiresByType image/png "access plus 10 years"

    ExpiresByType application/x-shockwave-flash "access plus 10 years"

</Directory>

 

Technique 2

Changez le nom des ressources que vous voulez mettre ˆ jour. En effet, si vous utilisez un cache de longue durŽe, il y a Žventuellement un risque que certains Žquipements gardent les ressources en mŽmoire. Pour Žviter ce risque, vous devez changer de ressource : en changeant de nom, vous mettez automatiquement ˆ jour la ressource.

Technique3

Mettez un cache court pour s'adapter ˆ un parcours: une heure ou deux. Cela Žvitera les revalidations. Cette technique est illustrŽe sur le test des deux pages accessible sur cyrilgodefroy.com. Dans ce cas, j'ai mis un cache de 1 heure sur toutes les ressources du rŽpertoire cache1 : les fichiers html, les fichiers css, les images... Ce qui passe en consŽquence c'est qu'au premier accs, on tŽlŽcharge tous les fichiers, et qu'en arrivant sur la page 2  du test, on cherche ˆ tŽlŽcharger ˆ nouveau uniquement le fichier html (et encore, seulement sous Firefox).

Le cache n'est pas tellement utilisŽ

Le rŽsultat de l'implantation des directives de cache peut sembler dŽcevant quand on regarde la bande passante, et le nombre de requtes totales sur une ressource censŽe tre cachŽe. Yahoo a rŽalisŽ et partagŽ une Žtude (http://yuiblog.com/blog/2007/01/04/performance-research-part-2/) sur la question. Cette Žtude montre que sur un site ˆ trs important trafic comme Yahoo, mme sur une longue pŽriode, il reste 40% des utilisateurs qui arrivent avec un cache compltement vide.

 

La mise en place d'un trs bon cache reste toutefois essentielle pour des parcours  sans couture, utilisant au mieux les ressources d'un site web, et rendant inutile le tŽlŽchargement systŽmatique des ressources. On doit pas s'appuyer lˆ dessus en espŽrant que les visiteurs vont arriver avec un cache rempli. Il faut faire en sorte qu'au cours d'un parcours, un minimum de ressources soient rechargŽes et que les ressources communes soient parfaitement cachŽes.

Cacheability

http://www.ircache.net/cgi-bin/cacheability.py

C'est un outil automatique qui vŽrifie l'Žtat de chacune des ressources d'une page. Cet outil ne fonctionne que sur internet et vŽrifie les en ttes http des ressources d'une page. Il peut prendre un peu de temps ˆ fonctionner, car il doit tŽlŽcharger et analyser chacune des ressources de la page que vous soumettez, et qu'il le fait sŽquentiellement.

Son principal dŽfaut se situe au niveau de l'analyse des fichiers css : il n'en fait aucune.


 


Le temps de tŽlŽchargement cÕest aussi du temps de requtes

Bien sžr, vous pensez comme tout le monde qui a un peu de bon sens : ce qui prend du temps c'est la construction de la page et le temps de chargement des objets qui la composent (images, javascripts et autres). Vous seriez ŽtonnŽ de vous rendre compte de la masse d'informations qui font le trajet inverse: de votre navigateur vers le site web. Voici un exemple sur des parcours sur quelques sites :

Site

Upload

Download

Google

1286

30105

Bouyges TŽlŽcom

60037

692996

SFR

107744

457038

Paypal

54459

264946

 

Sur les pages d'accueil en gŽnŽral pas de problme. Mais commencez ˆ rentrer dans le coeur du sujet, ajoutez des articles dans votre panier et authentifiez vous : vous verrez grimper votre trafic remontant vers le serveur.

Voici par exemple le rŽsultat d'un parcours d'achat chez Amazon :

Download  852415

Upload  125708

(Achat du premier produit trouvŽ sur une recherche, avec compte existant, mais sans valider la commande).

GŽrer ses cookies avec prŽcision par domaine et sous domaine

Un cookie, c'est une information envoyŽe par le serveur web (en gŽnŽral par l'application qui est derrire) au navigateur , et que ledit navigateur doit ensuite renvoyer suivant certaines rgles. Les cookies sont utilisŽs partout : pour la pub, pour l'identification, pour gŽrer un caddie, etc.   Tout ce qui suppose la persistance de la session ou de l'identification nŽcessite en gŽnŽral un cookie. L'autre mŽthode pour identifier une session est un peu trop compliquŽe ˆ mettre en oeuvre et pose des problmes de rŽfŽrencement de contenu.

Le cookie simplifie la vie du dŽveloppeur. Mais le dŽveloppeur se simplifie en gŽnŽral trop la vie. Il peut en effet choisir certains paramtres pour le cookie comme le nom de domaine auquel le cookie doit tre renvoyŽ par le navigateur et le chemin. Inutile de dire que le dŽveloppeur choisira normalement le domaine le plus large (yahoo.com ou cyrilgodefroy.com par exemple) et le chemin lui ouvrant le plus de possibilitŽs (/ en l'occurrence). Ce qui fait que toutes les requtes envoyŽes par le navigateur une fois que le cookie est lˆ contiendront le mme cookie.

Un cookie peut avoir diffŽrentes tailles : la taille d'un identifiant, la taille d'un identifiant de session (plus gros), la taille d'un identifiant d'identitŽ (encore plus gros). Donc la taille peut varier de 0 ˆ 1000 ou 2000 octets. Et cette taille de cookie est reproduite ˆ chaque requte sur une ressource du domaine et du chemin dŽfinis pour le cookie.

 

Site

Taille de requtes

Paypal

1001 octets

Yahoo

356 octets

Google

438 octets

TF1

292 octets

Voila

246 octets

SFR

385 octets

Bouyges TŽlŽcom

685 octets

Orange

357 octets

MySpace

452 octets

 

Le tableau ci-dessus montre que suivant les sites web , les requtes ont des tailles diffŽrentes, pour certaines assez importantes (Paypal, BouyguesTelecom).

Pour vous conforter dans l'idŽe que les cookies peuvent tre lourd, en voici quelques uns:

- MySpace

MYUSERINFO=; domain=.myspace.com; expires=Wed, 19-Jan-2005 08:28:17 GMT; path=/ MYUSERINFO=; domain=myspace.com; expires=Wed, 19-Jan-2005 08:28:17 GMT; path=/ MSCulture=IP=82.238.217.64&IPCulture=fr-FR&PreferredCulture=fr-FR&Country=FR&timeZone=0&ForcedExpiration=0&USRLOC=QXJlYUNvZGU9MCZDaXR5PVBhbGFpc2VhdSZDb3VudHJ5Q29kZT1GUiZDb3VudHJ5TmFtZT1GcmFuY2UmRG1hQ29kZT0wJkxhdGl0dWRlPTQ4LDcxNjcmTG9uZ2l0dWRlPTIsMjUmUG9zdGFsQ29kZT0mUmVnaW9uTmFtZT1BOA==; domain=.myspace.com; expires=Sun, 15-Jul-2007 21:27:29 GMT; path=/

Je dis bravo : deux fois le mme cookie, sur deux domaines diffŽrents...

- SFR

JSESSIONID=590A163AEEFD806BDE9ECEF37B3AF76F; PSWsessionID=230925066.0.0000; s_cc=true; s_sq=%5B%5BB%5D%5D

- Paypal

KHcl0EuY7AKSMgfvHl7J5E7hPtK=GgdN_CkjIZ241UgTtTkkyGHJM6UzLHab3odd6dWHW1uWus3ZMsh3BL3RK8-YwzEvSzZ0Ay9BEsomyLjW; cookie_check=yes; s_pers=%20s_favsn_paypalglobal_1%3D7628769626047%7C1499205713501%3B; login_email=...; upct=96; Apache=8////.....20999118236932791; SzWDZL1Tw4729rjVwzEIbk4eZ7u=CMZp3C6FrsJHDUEHRNykHszAfPrEUljq34IlvDlbUJxmO40wLsydPieCiNt_JSEZKXB6VnSMyNRd1OTTU_KLHTI-6k9asA1UZ3XKux2G; OL6S9fXi8y9NkAzRyU8cgsycszO=FE-j1sUlASmKiFjgOnM69JHCw0AXPa-tVDGQm9D4V5Uz4TNYBRlJnG3jQM9kYPRg6GGqIY0VVpyIWjW47xCZeyJUnxro4_z2j_2sv6Z1N8lfB21P; s_sess=%20s_cc%3Dtrue%3B%20s_refresh%3DHomepage%257E%255B1%255D%3B%20s_sq%3Dpaypalglobal%253D%252526pid%25253DHomepage%252526pidt%25253D1%252526oid%25253DLog%25252520In%252526oidt%25253D3%252526ot%25253DSUBMIT%3B; HaC80bwXscjqZ7KM6VOxULOB534=9uS_zYnvvEWYb_Ji7k7TDu3-UTNooFTK_h4M7JCWs-YMRfLDTX83BOGFgvEnJB0b-DkUWtrGh-nLXzaptAua3CI8Et8lndlp31CFTvr9RFhdjRXjsti3raztZg704vksJ5cWBG; cookie_contact_phone=; cookie_welcome=

- Google

PREF=ID=a4abafc91afcc710:TM=1176054507:LM=1176054507:S=MQ0FDkekAB16M1PV

Comment se dŽbarasser des cookies

Il est plus facile pour un dŽveloppeur de crŽer un cookie que pour vous de vous en dŽbarasser : une fois que ce genre d'information existe, il a tendance ˆ se rendre indispensable et ˆ conserver son emprise. On ne peut donc pas se dŽbarasser des cookies comme cela. Il faut Žviter au maximum de les utiliser avant de les enlever.

La deuxime mŽthode ˆ utiliser est de ne mettre les cookies que sur des sous domaines trs prŽcis, par exemple www.yahoo.com, ou mail.google.com. Ainsi quand on va sur movies.yahoo.com ou ww.google.com, on n'envoie pas ces cookies avec la requte. Si on crŽe un sous domaine img pour hŽberger uniquement les images (par exemple), les requtes envoyŽes vers ce serveur img.monsiteweb.com ne contiendront pas de cookie dŽposŽs sur www.monsiteweb.com.

La troisime mŽthode consiste ˆ se crŽer un autre domaine pour servir les images et les ressources statiques. C'est dans le cas ou vous ne pouvez vraiment pas vous passer de mettre un cookie sur l'intŽgralitŽ du domaine, sur *.monsiteweb.com. Cette mŽthode pose d'autres problmes : alertes de sŽcuritŽ qui peuvent survenir pour vous prŽvenir de cross site scripting (une technique de hacker pour passer des infos d'un site ˆ l'autre). Par exemple sfr a s-sfr, et yahoo a yimg, quant ˆ wanadoo-Orange, ils ont woopic (?!).

Enfin, on peut demander ˆ un CDN de venir ˆ la rescousse pour distribuer vos fichiers les plus lourds et les fichiers images ˆ votre place, et ainsi rŽduire nettement votre facture ÔcookiesÕ. On reviendra sur les CDN plus tard.


 

RŽduire la taille des pages sŽcurisŽes

Un facteur que certaines personnes ont tendance ˆ oublier : Faire un site au protocole https est compliquŽ et lourd. Un site https aura par ailleurs tendance ˆ consommer plus de ressources serveur et client et plus de bande passante (ˆ cause du chiffrement des donnŽes). Si vous envoyez des requtes lourdes ˆ cause des cookies, celles ci seront encore plus lourdes ˆ cause du chiffrement.

Le https cÕest le mal

Faire intervenir un changement de protocole au milieu dÕun parcours peut tre dramatique pour la performance de celui ci: tous les efforts faits dans les pages prŽcŽdentes pour cacher le contenu sont rŽduits ˆ nŽant car les ressources ont une adresse diffŽrente (https://www.monsiteweb.com/ressource1.gif au lieu de http://www.monsiteweb.com/ressource1.gif), car on demande au serveur et au navigateur de chiffrer et de dŽchiffrer toutes les ressources, car lÕon chiffre toutes ses requtes aussi (le chiffrement se fait dans les deux sens).

JÕai vŽcu lÕexpŽrience personnelle de changement de protocole sur des parcours, et le rŽsultat Žtait systŽmatique : 100% des mesures sur les pages de changement de protocole Žtaient hors seuils (et pas quÕun peu).

Le https est indispensable

Je vous rappelle dÕabord la loi : Tout responsable de traitement informatique de donnŽes personnelles doit adopter des mesures de sŽcuritŽ physiques (sŽcuritŽ des locaux) et logiques (sŽcuritŽ des systmes dÕinformation) adaptŽes ˆ la nature des donnŽes et aux risques prŽsentŽs par le traitement.

Le non-respect de lÕobligation de sŽcuritŽ est sanctionnŽ de 5 ans d'emprisonnement et de 300 000 Û d'amende. (art. 226-17 du code pŽnal)

Seules les personnes autorisŽes peuvent accŽder aux donnŽes personnelles contenues dans un fichier.

La divulgation dÕinformations commise par imprudence ou nŽgligence est punie de 3 ans d'emprisonnement et de 100 000 Û dÕamende. (art. 226-22 du code pŽnal).

Evidemment, la CNIL nÕa pas les moyens de faire respecter ces lois et directives.

Utiliser le protocole https est donc indispensable:

- Le certificat que votre serveur vous authentifie et prouve votre identitŽ. Quand on sait ce qui peut se passer sur internet, et qu'on conna”t l'ingŽniositŽ des escrocs, on se mŽfie.

- il y a des informations que votre visiteur vous envoie qui doivent rester secrtes: mot de passe, numŽro de carte bleue...

- vous devez prŽserver l'identitŽ de vos client et protŽger leurs donnŽes. C'est une obligation lŽgale qui si elle n'est pas respectŽe vous expose ˆ des poursuites pŽnales. Donc ds que vous affichez des donnŽes personnelles (adresse, nom, points, facture...), vous devez chiffrer le trafic.

 

Pas question dans ses conditions de se passer du https. Il faut donc se poser la question de l'amoindrissement de son impact et des raisons pour lesquelles il ralentit autant vos pages.

GŽrer des ressources rares

En allant visiter les pages de tests avec une connexion sŽcurisŽe ˆ https://cyrilgodefroy.com/fr/testqos/, on peut dŽcouvrir ou valider certains faits concernant l'usage du https.

Avant que vous ne vous jetiez sur l'url, sachez que je n'ai pas de certificat contresignŽ par une autoritŽ de certification: si vous tes sŽrieux, vous ne faites pas entirement confiance aux requtes que vous ferez. Rien de secret entre nous toutefois: vous pouvez accepter ce certificat, au moins pendant la session.

https = pas d'astuces d'amŽlioration

Le https fait Žchec ˆ certaines mesures d'amŽliorations que nous avons ŽvoquŽes:

- le cache est considŽrŽ comme non sŽcurisŽ sur le disque. Il a en effet pu tre touchŽ en dehors de la connaissance du navigateur. Donc le navigateur ne met pas en cache les ressources sŽcurisŽes sur le disque. Cela ne veut pas non plus dire qu'il recharge tout ˆ la fois: il y a un cache de session en mŽmoire vive. Quand vous fermez le navigateur, tout dispara”t.

- il est dŽconseillŽ d'utiliser diffŽrents sous domaines, voire diffŽrents domaines. Dieu merci, cette recommandation n'est pas bloquante: vous pouvez continuer ˆ servir des images depuis un nom de domaine qui n'a pas de cookie.

- il y a peu de connexions sur internet explorer: pas de parallŽlisation du tŽlŽchargement des ressources. En tout cas, moins

Comment rŽduire lÕimpact des pages https

Tout dÕabord, il faut que vous vŽrifiiez que votre plate forme https est ˆ la hauteur : cartes accŽlŽratrices, choix du package de sŽcuritŽ SSL, etc jouent ŽnormŽment dans la performance pure de votre chargement dÕŽlŽments en protocole https. Comparez alors la vitesse de chargement dÕune page en http et une page en https.

Ensuite, vous pouvez minimiser l'impact du passage du http au https gr‰ce ˆ plusieurs techniques et dans certaines situations.

Des frames? Oui encore un peu, merci..

La premire technique, hŽritŽe des annŽes 90, est d'utiliser des frames: mettez vos ŽlŽments de navigation dans une frame ou plusieurs frames, par exemple en haut et en bas de votre page, et servez ces pages en mode http. Limitez l'usage du https au contenu qui a besoin d'tre protŽgŽ pendant le transfert et faites que toute la frame et toutes ses ressources soient en https.

Plusieurs inconvŽnients ˆ cette technique. Tout d'abord, toute la page n'est pas sŽcurisŽe, et le navigateur le montrera avec quelques indicateurs, dont le cadenas (cassŽ).

ensuite, c'est des frames, avec tout ce que cela implique de difficultŽs, dÕŽnervement et de travail inutile et bte.

In fine, ce n'est pas une bonne solution.

Faire des redirections

La technique suivante pour limiter les pages https est d'utiliser des redirections client aprs les formulaires fournis en https pour revenir en http : un formulaire d'authent par exemple n'a pas besoin d'tre sur une page https, mais il faut que la requte POST quand on clique sur OK soit en https. Ensuite on peut faire une redirection client pour revenir sur du https. C'est par exemple ce que fait bytel.

Est ce que tout ce qui doit tre sŽcurisŽ l'est bien avec cette technique? Vous seuls pouvez le dire... et la CNIL.

Les vraies techniques qui vont permettre de rŽellement amŽliorer votre affichage en https sont les mmes que pour le http:

- peu d'ŽlŽments par page, notamment css et js

- des cookies de petite taille en allant chercher des ressources sur un domaine ou un sous domaine diffŽrents de celui qui cre les cookies.

- un cache et des directives efficaces et une utilisation intelligente de vos ressources. Le cache session n'est pas un vain mot. Exploitez le ˆ fond.

Faites des pages hyper simples en https. Au mieux pour une page en https, il suffit d'une ressource : la page. Je suis sur que vous pouvez en avoir une qui s'affiche en moins de 1 seconde, https compris. Alors la prochaine fois qu'un designer vous fait une page d'espace client, de paiement, etc, dŽsinstallez photoshop et illustrator de son ordinateur avant qu'il commence, ou fixez lui des rgles trs strictes en appelant ˆ son intelligence: il n'est normalement pas lˆ pour vous mettre des batons dans les roues.


 

Compresser pour aller plus vite

Comment fonctionne la compression?

Une des premires solutions pour rendre un site web plus rapide que les dŽveloppeurs me citent, c'est cette solution, de compression du contenu. Je ne sais pas d'o a vient, quelle est cette maladie... Non je rigole.

Le fonctionnement est le suivant : plut™t que de faire passer sur le rŽseau un fichier de plusieurs dizaines de kilo octets, le serveur web le compresse, et envoie une instruction au navigateur pour que celui ci sache que le fichier doit tre dŽcompressŽ. Le navigateur dŽcompresse alors le fichier qui redevient tout ˆ fait normal.

On peut faciliter la vie du serveur en compressant ˆ l'avance les fichiers. La charge pour celui ci est alors rŽduite. Par exemple, le module compres de lighttpd conserve des versions compressŽes des fichiers quÕil envoie.

Le WebInspector de Safari note les ressources qui pourraient bŽnŽficier de ce mode de compression avant transmission pour vous prŽconiser de les compresser.

Quels ŽlŽments compresser

Il n'est pas astucieux de compresser tous les ŽlŽments qui sont envoyŽs par le serveur. Je vous rappelle que la compression est une opŽration mathŽmatiquement exigeante qui prend du temps processeur : compresser tous les ŽlŽments sur un serveur ˆ fort trafic augmente donc encore la charge sur ce serveur.

Par ailleurs, les ŽlŽments qui sont dŽjˆ compressŽs ne gagnent rien ˆ tre encore compressŽs. Parfois mme, le fichier compressŽ est lŽgrement plus gros que le fichier d'origine! Les fichiers qui sont dŽjˆ compressŽs (gif, jpeg, png, swf... notamment) ne doivent donc pas tre compressŽs. Il faut limiter la compression aux ressources qui sont au format texte : html, css et javascript.

Tous les navigateurs ne sont pas Žgaux devant la compression http : il existe en effet deux modes de compression, et tous les navigateurs ne les implŽmentent pas, voire certains ont des bugs dans leur implŽmentation. Premier ŽlŽment, le navigateur doit dire au serveur s'il accepte la compression dans les enttes : il utilise l'instruction Accept-Encoding : gzip, deflate. Certaines versions de Netscape Navigator 4 disent supporter la mŽthode zlib alors qu'ils ne le font pas, etc : cÕest une zone de configuration assez dŽlicate, et qui souffre de nombreux Žcueils.

Par exemple, des fichiers PDF n peuvent pas tre compressŽs car ce nÕest pas le navigateur qui les exploite, mais directement le lecteur PDF, qui ne sait pas dŽcompresser des fichiers.

Enfin, la plupart des navigateurs ne lisent les fichiers compressŽs que sÕils ont explicitement demandŽ ˆ en avoir.

Comment compresser avec Apache

On peut compresser ˆ plusieurs niveaux. On peut compresser par le serveur web, par le serveur dÕapplication ou le langage de script.

Comme plus haut pour les directives de cache, je vais prŽsenter la configuration qui peut tre mise en place avec Apache 2, car cÕest certainement le serveur web le plus utilisŽ.

Apache2 vient avec un moduel spŽcifique pour la compression, le module mod_deflate. Celui ci est utilisŽ en appliquant la directive

SetOutputFilter DEFLATE

Ce module fonctionne ensuite par inclusion de certains types de ficheirs, exclusion de fichiers, et peut aussi travailler avec des BrowserMatch (pour identifier des navigateurs un peu grincheux).

Voici une configuration typique:

<Location />

    SetOutputFilter DEFLATE

    DeflateCompressionLevel 9

    SetEnvIfNoCase Request_URI  \

        \.(?:gif|jpe?g|png)$ no-gzip dont-vary

    SetEnvIfNoCase Request_URI  \

        \.(?:exe|t?gz|zip|gz2|sit|rar)$ no-gzip dont-vary

</Location>

 

Toute cette compression peut avoir un impact sur la performance de votre serveur web : compresser peut en effet utiliser une part importante de vos ressources machine.

Compresser avec PHP

Php bŽnŽficie d'un module de base pour compresser le contenu qui est renvoyŽ en html. Votre php doit tre compilŽ avec le module zlib qui va bien. Vous pouvez utiliser la commande phpinfo pour avoir une page web vous indiquant tous les modules compilŽs dans voter php. Pour utiliser ce module, il suffit de l'appeler :

<?php

ob_start( 'ob_gzhandler' );

?>

 

Comme il faut compresser toute la rŽponse et positionner cette instruction en premier, faites attention ˆ positionner cette instruction en haut de page. Vraiment au premier caractre.

Compresser (minifier) les ressources javascript

Le javascript est rempli de vide et de contenus inutiles. Si,si. CÕest un fait que tous les langages, avec les commentaires, les retours chariot, les espace etc, sont remplis de rien, mais de rien qui a du poids.

Or envoyer des contenus qui ont un poids trop important est inutile. On va donc essayer de rŽduire la taile des javascripts.

Il existe pour ce faire un programme souvent citŽ pour sa simplicitŽ dÕutilisation, lÕefficacitŽ du rŽsultat obtenu (compression de 10 ˆ 50% de la taille), et le fait que lÕon peut toujours lire le code mme une fois quÕil est minifiŽ.

DÕautres programmes peuvent tre utilisŽs, comme celui qui vient avec dojo, ou dÕautres qui brouillent le contenu du code. Leurs rŽsultats pour le moment sont moins bons.

JSMIN, The JavaScript Minifier  (http://www.crockford.com/javascript/jsmin.html)


Utiliser un CDN

CDN ques aquo?

Un CDN est un Content Delivery Network, un rŽseau de livraison de contenu, une enrteprise qui a crŽŽ son propre rŽseau ˆ lÕintŽrieur dÕinternet pour tenter de rapprocher le contenu des utilisateurs. Ces entreprise sont apparues dans les annŽes 90, et ne sont pas trs connues du grand public, mais sont souvent utilisŽes par les gros groupes pour rendre possible et efficace la diffusion de gros contenus aux utilisateurs.

Le principe est simple : offrir un cache du contenu le plus proche possible de lÕutilisateur final. La rŽalisation de cet objectif est moins simple, puisquÕil faut dŽterminer quel serveur est proche de lÕinternaute, comptabiliser la requte (pour tre payŽ et conna”tre le trafic), rapatrier le bon fichier au bon moment (mieux vaut trop t™t que trop tard), gŽrer sa durŽe de vie etc.

Ces fonctionnalitŽs font quand mme quÕutiliser les services dÕun rŽseau de distribution de contenu est rŽservŽ aux sites ˆ trs fort trafic et ayant des ressources importantes.

Je connais de nom 3 rŽseaux : Akamai, Savvis et Limelight Networks. NÕayant pas eu la chance de bŽnŽficier de leurs services, je ne peux pas faire de recommandation. Par contre, vous trouverez des utilisateurs de ces rŽseaux en France, comme LibŽration.


 

 


 

 

 

 

 

 

 

PARTIE III

Appliquer les meilleures pratiques

sur son site



Comment analyser et amŽliorer son propre temps de chargement

Nous avons vu de manire gŽnŽrale les outils ˆ disposition, les erreurs les plus frŽquentes, les techniques pour amŽliorer le temps d'affichage, mais qu'est ce qui va vous faire gagner du temps ˆ vous? Comment allez vous procŽder?

Fixer des objectifs rŽalistes

Vous n'arriverez pas ˆ afficher en 4 secondes une page contenant 300 images et faisant appel ˆ beaucoup d'ŽlŽments Ajax ou simplement ˆ du javascript un peu coton. Vous n'arriverez pas non plus ˆ empiler toutes les fonctionnalitŽs que vous dŽsirez dans le design et le look and feel que vous voulez sans souffrir un peu sur le temps d'affichage (car aprs tout il faut beaucoup de ressources pour faire un joli site). Il faudra que vous fassiez la part des choses et que vous vous fixiez des objectifs rŽalistes

Il y a quelques annŽes, on considŽrait qu'une page devait se charger (ou au moins commencer ˆ appara”tre) en 2 secondes. Ce prŽcepte est toujours assez vrai. Je l'Žtendrais en disant qu'il faudrait qu'une page s'affiche en 5 secondes compltement. On peut augmenter ce seuil pour des pages qui deviennent compliquŽes, mais dans ce cas il faut les prŽvoir et mettre une temporisation rendant plus agrŽable ou plus perceptible le fait que le site fonctionne, et qu'il fait quelque chose de dur.

 

AppleMark

 Paypal cherche ˆ  se souvenir du solde ˆ 9 chiffres de mon compte, cela prend du temps, mais je suis prŽvenu.

Ces objectifs doivent porter sur les pages d'accs ˆ votre site web  (home mais aussi pages d'accueil de catŽgories lors de promos ou de pubs), et sur les parcours complets qu'il y a derrire : c'est moins grave si votre page d'accueil met 6 secondes ˆ se charger si cela vous permet derrire de fournir les autres pages en moins de 3 secondes.

Ces objectifs doivent surtout porter sur les pages d'accs aux services : accueil, accs au compte etc. Cela ne sert ˆ rien d'avoir des pages derrire la page d'accueil qui se chargent en 3s si les utilisateurs sont partis sur la home car elle Žtait trop lente.

 

Est ce que je viens de dire deux choses qui allaient dans des directions contraires? C'est pour vous dire qu'il faudra revoir vos objectifs en fonction des rŽsultats et des succs que vous aurez obtenus.

Le critre qui vous permettra de vous positionner par rapport au temps de chargement d'une page, c'est son poids total : si elle est trs lourde (plus de 700Ko), aucun espoir de descendre sous les 4 secondes.

Rassembler les donnŽes des parcours les plus importants

Il faut que vous vous restreignez : vous ne pourrez pas obtenir rapidement des rŽsultats magiques sur toutes les pages. Il faut donc travailler en premier lieu sur les parcours les plus importants. Plus importants parce qu'ils sont quotidiens pour vos utilisateurs, ou plus importants parce qu'ils font du business : ils sont critiques car il s'agit de l'achat, de l'inscription, etc.

Ensuite, rassemblez les donnŽes : non pas un parcours, pas 10, mais 50 ou cent. Vous ne pouvez pas baser vos analyses sur des tests unitaires. Construisez vos parcours en numŽrotant les pages, en faisant des captures des pages par lesquelles vous devez passer, de manire ˆ toujours effectuer le mme parcours. Au dŽmarrage de chaque parcours, videz votre cache, effacez vos cookies et relancez votre navigateur pour vous mettre dans la peau de votre internaute.

Construisez un tableau de rŽsultats avec le temps d'affichage complet de chaque page du parcours. Notez les infos au fur et ˆ mesure. Pour dŽterminer le temps d'affichage d'une page, comptez ˆ partir du moment o vous actionnez le lien, et ne vous fiez pas aux chronos qu'on peut trouver avec les navigateurs : ceux ci peuvent se remettre ˆ zŽro au cours de l'affichage d'une page.

Prenez des traces de vos parcours, pour pouvoir les analyser  a posteriori. L'outil que je vous conseille pour cela est HttpWatch : les traces conservŽes sont rŽutilisables telles quelles. Les traces prises avec TamperData sont moins lisibles aprs coup. Sauvegardez au fur et ˆ mesure les traces de vos mesures de parcours en utilisant le nŽmero du tests que vous venez d'effectuer.

Une fois que vous avez des traces consŽquentes sur votre parcours, concentrez vous sur les pages les plus lentes ˆ afficher en moyenne : faites une moyenne du temps d'affichage des pages d'un parcours, et prenez les plus lentes. Allez ensuite vŽrifier les traces http de ces pages. Http Watch rouvre les fichiers de type hwl, alors vous pouvez conserver toutes vos mesures sous ce format, qui est plus complet et peut Žventuellement vous permettre d'aller voir aussi les requtes, rŽponses et les headers.

Voici ensuite les choses que vous devez aller vŽrifier.

1. RepŽrer les pages de type text/html qui prennent du temps

2. Faites la chasse aux redirections

3. Comparez la taille des requtes et leur nombre ˆ la taille des rŽponses

4. VŽrifiez qu'au cours d'un parcours les ressources sont servies par le cache

5. Page par page, vŽrifiez quelles ressources sont tŽlŽchargŽes en premier

6. Identifiez les pages qui doivent tre refondues

RepŽrez les pages de type text/html qui prennent du temps

Certaines pages sont infailliblement lentes : elles font appel ˆ un systme distant, elles crent un raport dans un format inhabituel pour le web, elles sont mal conues... Ces pages doivent tre dŽbusquŽes dans les situations rŽelles (et pas seulement dans la phase de dŽveloppement). Elles devraient dŽjˆ tre connues du dŽveloppeur ou de l'intŽgrateur de la prtie applicative du site. Si il n'est pas capable de vous les citer, vous pouez faire la liste pour lui. Tout ce qui dŽpasse une seconde en moyenne est suspicieux, tout ce qui dŽpasse les 3 secondes est carrŽment trop lent.

Comment agir face ˆ ces pages? Suivant les justifications qui peuvent tre faites, vous avez deux options : 

si les systmes derrire sont rŽellement complexes (systme de rŽservation de transports aŽriens, catalogues de prix de plusieurs sites web...), vous devez traiter l'attente comme quelque chose d'inŽluctable et prŽvenir l'internaute de celle ci. La capture de la page Paypal est un bon exemple.

si la page est lente alors qu'elle ne devrait pas l'tre d'aprs le dŽveloppeur, renvoyez le vŽrifier son code et ses flux sur la production. Les flux doivent tre de bout en bout : depuis l'entrŽe de la requte dans l'infrastructure d'hŽbergement jusqu'au renvoi de la rŽponse ˆ la sortie de cette infrastrucutre en passant par les requtes aux bases de donnŽes.

Faites la chasse aux redirections

Une faon assez nulle de perdre du temps que l'on rencontre trop souvent est la redirection. Toutes les requtes ayant pour rŽponse des codes 300 et quelques (essentiellement 302 et 301) sont des redirections. Ces redirections s'insrent de purement sŽquentielles dans le chargement de vos pages : impossible d'accŽder ˆ la page finale sans passer par les pages de redirection et de subir le temps de rŽponse de ces pages.

 

L'existence de ces redirections n'est pas forcŽment innocent, motivŽ par la volontŽ de protŽger l'application d'utilisateurs qui soumetraient plusieurs fois le mme formulaire, ou de leur Žviter une navigation en protocole https sŽcurisŽ inutile. Le problme est quand les redirections sont au nombre de deux ou plus successivement, ou quand elles pallient des mauvaises configurations. 

Par exemple, on accde souvent aux url sans taper le / de fin pour indiquer l'accs ˆ un rŽpertoire. Le navigateur rŽpond alors par une redirection. Or on peut le forcer ˆ rŽpondre directement sans effectuer la redirection. Evitez vous 400ms de round trip totalement inutile.

Comparez la taille des requtes et des rŽponses

Dans HttpWatch, il y a un onglet 'summary' qui fait automatiquement le travail de somme du poids des requtes et du poids des rŽponses. Vous pouvez aussi copier le contenu des colonnes dans un tableur, faire vous mme la somme des colonnes requtes et rŽponses. Cette somme vous permet d'avoir une premire apprŽciation du trafic entre votre navigateur et le serveur dans les deux sens.

Si vos requtes sont supŽrieures en poids aux rŽponses, il y a un problme Žvident (sauf dans le cas d'un upload). Si vos requtes dŽpassent 10% de vos rŽponses, il faudra faire la chasse aux requtes trop lourdes. 

La vision synthŽtique ne doit pas vous empcher d'aller faire le mme travail dans le dŽtail sur une page. Vous verrez assez vite les requtes de statistiques et de publicitŽ : ce sont souvent les plus lourdes. Vous verrez si vous risquez d'avoir un problme ˆ cause de la taille des requtes assez vite. Ne sous estimez pas l'influence de ce facteur : il n'est peut tre pas Žvident sur votre copnnexion en cÏur de rŽseau 100 Mb/s, il est plus Žvident sur une connexion ADSL ˆ 1 Mb/s assymŽtrique disposant de 128 Kb/s sur le sens montant (du navigateur vers le serveur).

VŽrifiez l'usage du cache

Cette recommandation suppose que vous avez mis en place des directives de cache, Žvidemment. Si vous n'en mettez pas, ne vous attendez pas ˆ des miracles de ce c™tŽ. Le navigateur fera du best effortÉ mais celui ci peut tre trs limitŽ. Par contre vous devez vŽrifier que vos directives de cache sur vos ressources statiques sont bien transmises, qu'elles sont appliquŽes et qu'elles sont efficaces.

L'efficacitŽ se traduit dans HttpWatch par ce mot magique : (Cache) et par le chiffre qui va avec : 0. Il peut aussi se traduire par une ligne absente. Si vous avez une page avec votre logo mais que vous ne voyez pas de requte pour celui ci, tout va bie :  il vient du cache.

Par contre si vous voyez ces codes : 200 ou 304, c'est que vous n'avez pas bien fait votre travail, juste ˆ moitiŽ. Pourquoi ˆ moitiŽ? Parce que le navigateur ne croit pas en la validitŽ de la ressource dont il dispose. Il a donc besoin  de revalider celle ci. Cela nous pose deux problmes de performance : un parce que l'on refait un roundtrip (une boucle requte rŽponse), et que ce roundtrip peut tre sur un fichier bloquant (type javascript). Deux parce que chaque requte pse, bien entendu... Vous devez regarder dan sle dŽtail les requtes et rŽponses sur la ressource en question : 

¥la durŽe du cache est elle bonne

¥y a-t-il une directive du type must-revalidate

¥y a-t-il un cookie envoyŽ dans la requte de la ressource

Quelles ressources sont tŽlŽchargŽes en premier?

L'ordre de tŽlŽchargement des ressources a une importance grande, on lÕa dŽjˆ vu. Surtout les ressources de type javascript (mais pas seulement). Commencez par vŽrifier que les css sont chargŽs en premier. S'il y en a trop (plus de deux), vous pouvez noter de faire un progrs de ce point de vue.

Ensuite vŽrifiez l'usage du javascript. Le tŽlŽchargement d'un fichier externe javascript au milieu du corps de la page doit tre proscrit. Le mieux serait de le charger ˆ la fin (mme si ce n'est pas toujours possible). En effet comme cela il ne bloque pas le chargement des autres ressources. Au pire, essayez de rassembler les fonctions dans un ou deux fichiers javascript, un pour les fonctions statiques et un deuxime pour les fonctions dynamiques, puis utilisez ces fonctions par l'usage de javascript inline, c'est ˆ dire du javascript directement dans le html.

VŽrifiez que vous n'avez pas d'aberrations dans le chargement : @import dans les fichiers css de style, des fichiers javascript et css intercalŽs les uns avec les autres.

Au fur et ˆ mesure que vous vŽrifiez ces ressources texte statiques, vŽrifiez qu'elles sont minifiŽes (pour les javascripts) et passŽes en gzip ou en deflate (compression) pour toutes les ressources texte. Le WebInspector de Safari vous signale rapidement toutes les ressources qui pourraient bŽnŽficier de compression mais n'en ont pas.

Identifiez les pages qui ont besoin d'tre refondues

Certaines pages ne passeront jamais sous le seuil que vous leur avez fixŽ ˆ la base : il est mme impossible qu'elles le fassent en sortie de plateforme d'hŽbergement. Ces pages sont simplement trop lourdes, trop compliquŽes en nombre d'ŽlŽments ˆ charger, trop compliquŽes en structure (tableau dans un tableau dans un tableau ...).

Ne vous Žreintez pas avec ces pages. Sachez les identifier rapidement pour y revenir plus tard. Elles vont juste rŽussir ˆ Žpuiser vos ressources, votre patience et votre ingŽniositŽ, et vous n'arriverez pas ˆ un bon rŽsultat. Dans ce cas, vous tes perdant. Concentrez vous d'abord sur les pages les plus faciles ˆ corriger.  Vous y gagnerez plus avec celles ci en gratificaion immŽdiate.

Les pages les plus dures, n'hŽsitez pas ˆ les remettre sur la planche ˆ dessin : planche ˆ dessin graphique, html, applicative, ergonomique. Changez leur seuil pour fixer un objectif rŽaliste : une page de 900 Ko  pour 100 ŽlŽments mettra fatalement plus de 5 secondes ˆ se charger sur une connexion ˆ 1 Mb/s (800/(1024/8) = 7 s au mieux pour un fichier unique).


 


Une home qui fait snap!

Votre page d'accueil est certainement le premier contact que font les internautes avec votre site. Or on n'a qu'une seule chance de faire bonne impression : il n'existe pas de deuxime premire rencontre. Votre premier objectif de superperformance est donc d'avoir une home qui fait snap!

J'ai rencontrŽ plusieurs personnes qui ne voyaient la home que comme la premire page d'un parcours. A ce titre ils pensaient qu'elle devait avoir la mme apparence et la mme construction que les autres pages, motamment pour "mettre dans le cache les ŽlŽments ˆ rŽutiliser sur les autres pages".

Foutaises!

La page d'accueil de votre site est la plus importante et la plus spŽciale. Elle doit tre traitŽe comme un joyau unique et mŽrite tous vos efforts. Souvent elle sera la seule page visitŽe de votre site. Mme s'il repart, l'internaute doit rester sur une bonne impression. Alors ne la traitez pas comme les autres pages.

Encore une fois, inspirez vous des meilleurs. Regardez la home de Google, 2 fichiers et 94 ms. Moins de temps qu'il ne faut pour se rendre compte qu'on a appuyŽ sur entrŽe. Vous allez me ressortir: oui mais c'est un moteur de recherche, c'est pas pareil. SI. Un fichier html et une image: c'est tout ce qu'il faut charger.

Regardez la home de Yahoo, si vous n'tes pas convaincu. Ne me dites pas qu'elle est comme celle de Google: des images, des blocs, des photos, de la pub. De la pub avec de la vidŽo! Si vous trouvez quelque chose de moins performant en web 1.0, dites le moi. Les mmes rgles de construction sont appliquŽes.

Tout envoyer en une requte

On l'a vu tout au long des pages prŽcŽdentes: demander des fichiers ˆ charger, c'est bien trop long, et il faut faire son possible pour Žviter toute requte supplŽmentaire.

On peut envoyer moins de choses, allŽger les choses, ou tout envoyer en une fois. C'est ce qu'on essaie de faire avec le pipelining: envoyer plus de contenus dans la mme requte.

Pour notre page d'accueil, nous allons donc rassembler tous les fichiers qui peuvent l'tre: html, css et javascript. Plusieurs images deviendront une seule image.

Prenez votre Žditeur de texte, ouvrez votre home et votre feuille destyle, votre javascript (vous ne devriez dŽjˆ plus en avoir qu'un). Puis intŽgrez ces deux fichiers en interne :

Vous venez de gagner deux requtes, sŽquentielles qui plus est.

Ensuite, si votre design et votre animation Žditoriale le permettent, agrŽgez plusieurs images en une. Par exemple, les catŽgories du menu de gauche de la page d'accueil de Yahoo! sont une seule image.

Vous n'tes pas obligŽs de faire une grosse image map, vous pouvez aussi utiliser des sprites css (http://www.alistapart.com/articles/sprites). Cette technique vous permet dÕutiliser une grosse image contenant de nombreux ŽlŽments ˆ afficher , et dÕafficher juste une partie de cette image, un carrŽ ˆ lÕintŽrieur de celle ci.

AppleMark

Les icones de Yahoo sont toutes dans un seul fichier image ou presque..

 

Un exemple des rŽsultats en appliquant une partie des recommandations, et sans faire de nettoyage dans les scripts ou les styles:

http://cyrilgodefroy.com/fr/testqos/snap/avant.html

http://cyrilgodefroy.com/fr/testqos/snap/apres.html

 

 


 


Et le web 2.0 dans tout a?

On n'a pas beaucoup ŽvoquŽ les applications web 2.0, utilisant ˆ foison les interfaces riches construites gr‰ce aux scripts javascripts comme prototype, JSON, scriptaculous, DOJO, etc. Et pour cause : ces applications sont plut™t nouvelles et peu de gens rŽalisent aujourd'hui de telles choses. C'est le travail de spŽcialiste ˆ l'intŽrieur du travail de spŽcialiste.

Il ne faut pas trop s'inquiŽter de ces applications : les rgles qui prŽvalent ˆ l'existence de pages trs performantes sont les mmes pour les applications web 2.0. (et 3.0 ) : le javascript se chargera toujours sŽquentiellement, les css aussi sur Firefox, les requtes sont aussi lourdes. En Žtant rigoureux comme pour une application normale, vous obtiendrez des temps d'affichage Žquivalents et aussi bons. 

Deux diffŽrences mŽritent notre attention : le principe d'une application riche embarquŽe dans le navigateur, utilisant une seule page pour fonctionner fait dispara”tre la notion de temps d'affichage des pages. Quand j'arrive sur ma page docs.google.com, mon webmail yahoo ou netvibes, j'ai peut tre un temps d'affichage un peu plus important, mais je suis prŽvenu et je n'ai ce temps de chargement qu'une fois. Le reste du temps, toutes mes requtes ˆ l'application ont un temps d'exŽcution assez rapide, sans doute beaucoup plus rapide que si j'Žtais passŽ par un cycle requte/rŽponse complet.

 

L'autre diffŽrence concerne le XmlHttpRequest : ce dr™le d'objet qui sert ˆ faire de l'Ajax (du chargement asynchrone de pages web) ne se comporte pas tout ˆ fait de la mme faon que le navigateur de base.  

J'ai rŽcemment eu ˆ auditer la performance d'une page qui faisait du web 2.0 : un multi contenu agrŽgeant des flux extŽrieurs et un menu de contenus configurables. L'utilisation de js et de requtes asynchrone Žtait assez colossal : sur la mme page on passait de 65 requtes ˆ 115 requtes en ajoutant ces deux ŽlŽments. La performance s'est bien sžr ŽcroulŽ. On est passŽ d'une page qui s'affichait en moisn de 3 secondes ˆ une page qui s'affichait en plus de 7 secondes. 

Pourquoi tant de dŽcalage? A cause des suspects habituels d'abord : trop de javascripts, insŽrŽs en cÏur de page plut™t que d'appeler leurs fonctions en inline, des requtes ˆ tire larigot (une par contenu cachŽ), qui chacune Žtait courte, efficace, mais qui agglomŽrŽes donnaient une performance dŽsastreuse. 

J'ai fait mes recommandations. N'Žtant pas ma”tre du dŽveloppement il m'a fallu composer avec une Žquipe de dŽveloppement rŽticente ˆ refaire le travail (difficile) qu'elle avait dŽjˆ fait, mais sans prendre en compte des objectifs de performance d'affichage.

JÕai aussi eu des expŽriences dŽsagrŽables avec Dojo : leur systme (malin) de localisation fait que les fichiers sont en plusieurs bouts. On tŽlŽcharge donc beaucoup de fichiers javascripts. CÕest un problme en soi. Je conseille donc de se mŽfier de Dojo, voire de faire sa propre version mono fichier.


 

Conclusion

Le sujet de la performance des pages web est un sujet riche, qui se caractŽrise par l'excellence dans tous les domaines de la crŽation web : excellence ergonomique, applicative, html et bien sžr http. C'est un travail de spŽcialiste mŽticuleux et prŽcis, ayant une culture diverse et profonde de la chose web : cache, https, javascripts font partie de domaines diffŽrents, un profil rare sinon inexistant. Ce travail est d'autant plus intŽressant qu'il fait donc intervenir diffŽrentes spŽcialitŽs, et permet de remettre tous les acteurs de la crŽation de site web autour de la table, ou de la page : vous ne rŽussirez ˆ mettre de la performance dans vos pages que si vous communiquez auprs de tous les intervenants et que si vous avez le courage de refaire des choses qui pourtant marchent 'bien'. 

Dans ce contexte, une approche agile du dŽveloppement de sites et d'applications web sera prŽfŽrable et vous permettra d'atteindre vos objectifs. Une approche compartimentŽe est le meilleur moyen de voir les intervenants se renvoyer la balle et se dŽfausser mutuellement l'un sur l'autre.

C'est aussi un sujet d'expertise assez rŽcent.  Il est donc en Žvolution. Je vais faire l'effort Žvident de continuer ˆ travailler sur les causes de lenteurs de sites web, et ˆ analyser le comportement des navigateurs par rapport ˆ plusieurs comportements. Je mettrai ˆ disposition les mises ˆ jour des informations disponibles dans ce livre au fur et ˆ mesure.

 


 


Annexes

Les sites ˆ tester

Top sites of France Alexa

Vous pouvez aussi trouver une liste des 30 groupes faisant le plus de trafic sur Le Journal Du Net

Les articles de rŽfŽrence

Des articles sans intŽrt Žcrits par des gens qui ne savent pas de quoi ils parlent

Yahoo Performance Research La task force performance de Yahoo (http://yuiblog.com/blog/2006/11/28/performance-research-part-1/).

Serving Javascript fast Un dŽveloppeur de Flickr (http://www.thinkvitamin.com/features/webapps/serving-javascript-fast)

MnotÕs web log  Mark Nottingham est gourou chez Yahoo, il a beaucoup travaillŽ chez Akamai, 2 titÕ boites (http://www.mnot.net/blog/Caching/index.html)

http://www.websiteoptimization.com/ Des gens qui vendent aussi de lÕoptimisation de site web

http://www.die.net/musings/page_load_time/ Un ingŽnieur qui travaille sur les applications Web 2.0 dÕune start up : Google.

14 rules for fast web pages Encore un gars de chez Yahoo. Il faut croire que cette entreprise se pose des questions sur la performance (http://www.skrenta.com/2007/05/14_rules_for_fast_web_pages_by_1.html).

http://code.google.com/p/minify/ Une librairie pour Žviter de faire des erreurs avec ses css est ses javascripts en php.

http://www.webperformance.org/compression/gzip-compress.html pour savoir un peu mieux comment utiliser le mode de compression de Apache, et bien sžr, mod_deflate - Apache HTTP Server (http://httpd.apache.org/docs/2.0/mod/mod_deflate.html)

Yahoo Performance Group un groupe de personnes bien intentionnŽes (http://developer.yahoo.com/performance/).