Dec 23rd 2009 Amélioration du temps d’affichage du site.
Depuis quelques temps mon serveur commençait à prendre un peu trop de charge. Le load average du serveur tournait en permanence au-dessus de 20 (alors qu’il n’aurait pas dû passer au dessus de 4). La faute à quelques scripts un peu trop gourmand en CPU et surtout en lecture/écriture sur disque.
Le plus important écrivait 70Mo par minute, soit plus d’1Mo par seconde. A ça s’ajoutait un peu plus pour la lecture. D’autres scripts accédaient non stop à une base de données contenant 500Mo de data diverses… Et comme je suis loin d’être un pro de l’optimisation je vous laisse imaginer le résultat.
J’ai donc été obligé de changer de machine, de réécrire mes scripts et de faire quelques petites optimisations. Dans l’ordre :
Location d’un serveur plus puissant. Un HG-2010 SSD chez OVH. SSD car les accès disques sont importants, et le produit proposé par OVH me semblait pas trop mal. J’ai en plus pris l’option 48Go pour la RAM, tant qu’à faire autant le faire en grand.
Allégement de la base de données est stockant le résultat des requêtes en RAM avec Memcached (d’où l’option 48Go). De mémoire j’ai alloué 24Go à Memcached, de quoi mettre beaucoup de données.
Utilisation du module mod_expires d’apache. J’ai appris que ce module pouvait faire en sorte de mettre en cache des données dans le navigateur de mes chers visiteurs. Les images sont donc stockées 1 mois ainsi que les fichiers CSS et JS. Pour éviter les bugs avec un CSS ou un JS pas à jour, à chaque mise à jour je change les noms (fichier.css?version=1.15 par exemple). J’ai fait quelques tests avec Firebug + page Speed de Google et le gain est loin d’être négligeable. Le tout peut se gérer avec quelques lignes dans le .htaccess
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css “access plus 1 month”
ExpiresByType text/javascript “access plus 1 month”
ExpiresByType application/x-javascript “access plus 1 month”
ExpiresByType application/javascript “access plus 1 month”
ExpiresByType image/x-icon “access plus 1 month”
ExpiresByType image/ico “access plus 1 month”
ExpiresByType image/vnd.microsoft.icon “access plus 1 month”
ExpiresByType image/png “access plus 1 month”
ExpiresByType image/gif “access plus 1 month”
ExpiresByType image/jpeg “access plus 1 month”
ExpiresByType image/jpg “access plus 1 month”
ExpiresByType application/x-shockwave-flash “access plus 1 month”
</IfModule>
Pour les quelques images dynamiques j’ajoute un header en PHP
header(”Pragma: public”);
header(”Cache-Control: maxage=”.$expireGraph);
header(’Expires: ‘ . gmdate(’D, d M Y H:i:s’, time()+$expireGraph) . ‘ GMT’);
header(”Content-type: image/png”);
Mes 10 fichiers CSS et 13 fichiers js ont été regroupés et compressés avec minify. Je gagne 21 hits sur chaque visiteur + des pages qui gagnent encore en vitesse d’affichage.
J’ai placé le code Google Analytics asynchrone. Je n’ai pas mesuré l’impact, je me fie à la compétence des ingénieurs de Google. Seul petit hic, je n’ai plus d’évènement et je n’ai pas encore trouvé d’où provient le bug… Il faut dire que je n’ai pas cherché longtemps.
Toutes mes anciennes données en cache – celles qui prenaient 1Mo/ seconde en écriture disque – sont passées en RAM avec memcached. Une vrai révolution dans ma façon de coder mais la forte diminution des accès disque a fait passer à lui seul le load average de la machine à 10 (sur le nouveau serveur) à 0.5/2.
Il me reste encore à utiliser les sprites dans les CSS. Mais pour ça il me faudra un peu de temps. Les images et moi ça fait 2. Quand ce sera fait je devrais gagner une vingtaine de hits par visiteurs… Encore un point non négligeable pour la charge serveur et la rapidité du site.
Le bilan de tout ça ?
D’après Google le temps d’affichage moyen d’une page par un visiteur est passé de 6 à 4 secondes (gain >30%). J’ai bon espoir de descendre sous les 3 secondes d’ici quelques temps. Je serais de toute façon limité à cause du temps d’affichage des bannières pub et du marqueur Xiti (d’ailleurs je suis en train de réfléchir à l’enlever)
Google passe moins de 0.5 seconde à crawler une page contre 1.5 seconde avant mes optimisations diverses.
Petite déception, je n’ai pas de modification du nombre de pages vues par visites ou une diminution significative du taux de rebond. Il faut croire que mes visiteurs étaient patient…
Il parait que la rapidité des sites va entrer dans l’algo du classement des sites dans le moteur de recherche. C’est un bon argument pour aller le plus loin possible sur cette route.
7 Comments » Posted by Arnaud Jeulin / Gestion site Internet
Si vous utilisez 





