Tensin

Aller au contenu Aller au menu Aller à la recherche

Mot-clé - optimisation

Fil des billets - Fil des commentaires

mardi, août 3 2010

Optimisations web et outils associés

Venant de découvrir ShowSlow (un site qui aggrège les données remontées par YSlow et Page Speed, voir ci-dessous), j’en ai profité pour appliquer cette astuce toute bête sur tous mes sites qui le permettent et qui n’étaient pas forcément à jour.

Au programme dans ce billet : une optimisation toute simple de l’usage du cache pour toutes les ressources (par .htaccess), et le rappel de quelques outils d’aide au diagnostic (que j’imagine tous les développeurs web connaissent, mais sait-on jamais) : YSlow, Page Speed, ShowSlow et WebPageTest.

Tous ces outils sont intéressants, mais il ne faut pas s’attendre à avoir des gains de performances de l’ordre de 100%. Par ailleurs, ces outils se focalisent tous sur l’analyse des performances côté navigateur, il ne faut pas oublier l’analyse et les optimisations côté back-office.

Optimisation de l’usage du cache pour toutes les ressources (par .htaccess)

Le principe consiste, pour optimiser la conservation en cache des ressources statiques commes les images, les .css ou les .js, à forcer une durée de rétention importante via une directive stockée dans un .htaccess

Avantages : tous les fichiers du site (ou du répertoire concerné par le .htaccess) sont automatiquement paramétrés avec ce délai d’expiration. Les fichiers resteront donc systématiquement dans le cache du navigateur (jusqu’à purge manuelle ou expiration de la durée indiquée).

Inconvénient : il ne sera en l’état pas possible de modifier ces fichiers. Autrement dit si un de ces fichiers est modifié en ligne, il ne sera pas récupéré par les visiteurs qui seront déjà venus précédemment sur le site (mais des solutions existent, sur une base de versionning de fichiers, voir cet excellent article de ce non moins excellent blog).

Le code à mettre dans le fichier .htaccess (à adapter au besoin sur le type de fichiers concernés et la durée de conservation dans le cache) :

<IfModule mod_expires.c>
SetEnv mod_expires On
ExpiresActive On
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/x-javascript "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
</IfModule>

Installation du module expire sous Apache :

sudo a2enmod expires 

That’s all !

En utilisant les outils ci-dessous (et en partant à chaque fois d’un cache vide) on constate bien une (légère) différence de temps de chargement, et différence dans les résultats d’analyse.

Outillage en rapport.

YSlow

YSlowYSlow est une extension FireFox qui enrichit le plugin FireBug, Le principe est ensuite, une fois une page analysée, de lister un certain nombre d’éléments pertinents à corriger / modifier pour obtenir de meilleures performances, notamment (tout est rappelé sur la page Best practices for speeding up your web site) :

  • réduire le nombre de requêtes HTTP = concaténer les fichiers qui peuvent l’être (.css, .js) ;
  • paramétrer correctement les expirations de cache (cf. ci-dessus par ex.) ;
  • mettre en place une compression GZip (soit au sein du framework utilisé (la plupart le permette), soit par soi même (en PHP via les méthodes de capture de flux, etc.), soit encore par une paramétrie globale par ex. côté Apache) ;
  • mettre les feuilles de style en début de page ;
  • et les scripts en bas de page ;
  • rendre les ressources .css et .js externes (afin qu’elles puissent être mises en cache) et les compresser (avec Google Closure ou YUI Compressor) ;
  • etc.

Page Speed

Page TestAutre extension pour FireFox, toujours sous forme d’ajout à FireBug, toujours sur le même principe : analyser la page, et faire une liste de recommandations en conséquence.

Au final j’ai quand même plus tendance à utiliser YSlow et à me passer de Page Speed, même si certains trouvent certains avantages à Page Speed. Evidemment, çà ne coûte pas grand chose d’installer les deux (les deux s’intégrant parfaitement dans FireBug) et de faire une passe sur son site avec chaque outil (qui ne prend qu’une ou deux secondes).

Le site de Page Speed : http://code.google.com/intl/fr-FR/speed/page-speed/

Showslow

Show SlowIl s’agit d’un site (à installer soi-même sur son serveur), développé en PHP, et qui permet d’historiser les valeurs remontées par YSlow et Page Speed, en automatique (une fois son FireFox correctement configuré). Ce n’est clairement pas indispensable, mais çà permet d’avoir un historique des performances de ses sites web.

Il suffit de suivre la documentation d’installation, bien faite et tout à fait suffisante, pour installer la coeur de l’outil, et d’ensuite paramétrer les deux plugins FireBug en conséquence.

WebPageTest

Web Page TestDécouvert pour ma part dans la foulée de ShowSlow, WebPageTest permet de faire le même type d’analyses, certes en moins poussé, mais déclenchées cette fois en ligne, et surtout avec deux avantages notables :

  • les tests peuvent se faire depuis des machines hébergées en différents points du globe (Paris, Amsterdam, différentes villes en Amérique, la Chine, la Nouvelle-Zélande, …) ;
  • il est possible de tester l’accès à sa page sur différents navigateurs.

vendredi, mai 21 2010

Installation APR sous TomCat

J’utilise le serveur d’applications TomCat 6, aussi bien en développement sur poste local sous Eclipse/WTP qu’en environnement Linux (pour faire tourner Hudson ou Sonar).

Une petite optimisation permettant de gagner un peu de temps au démarrage est d’installer les APR : ApachePortableRuntime.

Avant :

INFO: Server startup in 8477 ms

Une fois APR installé :

INFO: Server startup in 7908 ms

Donc un gain pas énorme au final, mais vu que la manipulation d’installation n’est pas très compliquée, autant ne pas s’en priver.

La doc se trouve ici : http://tomcat.apache.org/native-doc/ Site officiel du module APR : http://apr.apache.org/

Installation de APR et APR-UTILS

Installation de APR :

tar xvzf ../apr-1.3.8.tar.gz 
cd apr-1.3.8/
./configure 
make && sudo make install

Installation de APR-UTILS :

tar xzvf ../apr-util-1.3.9.tar.gz 
cd apr-util-1.3.9/
./configure --with-apr=/usr/local/apr/bin/
make
sudo make install

Installation de Tomcat APR

cd jni/native/
./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/home/applications/java/jdk1.6.0_15 --with-ssl=no --prefix=/home/applications/apache/tomcat/6.0.18
make
make install

Démarrage autonome de TomCat

Il suffit de mettre en place partie setenv.sh comme indiqué dans la documentation pour lancement manuel de tomcat

Démarrage de TomCat sous Eclipse/WTP

Il suffit, dans les préférences du serveur sous WTP (Web Tools Platform), d’indiquer sous “Open Launch Configuration” / “Environnement” la même valeur de la variable LD_LIBRARY_PATH que ci-dessus (soit le chemin donné à la compilation jni ci-dessus sous “prefix”).

Exemple sur mon poste : Eclipse (paramétrie APR Tomcat)

Contenu du répertoire lib de Tomcat :

~/applications/apache/tomcat/6.0.18/lib> lr
total 6260
-rw-r--r-- 1 domain users   49019 2008-07-22 02:01 tomcat-i18n-ja.jar
-rw-r--r-- 1 domain users   42702 2008-07-22 02:01 tomcat-i18n-fr.jar
-rw-r--r-- 1 domain users   45686 2008-07-22 02:01 tomcat-i18n-es.jar
-rw-r--r-- 1 domain users  197443 2008-07-22 02:01 tomcat-dbcp.jar
-rw-r--r-- 1 domain users  742085 2008-07-22 02:01 tomcat-coyote.jar
-rw-r--r-- 1 domain users   83787 2008-07-22 02:01 servlet-api.jar
-rw-r--r-- 1 domain users   72183 2008-07-22 02:01 jsp-api.jar
-rw-r--r-- 1 domain users 1395264 2008-07-22 02:01 jasper-jdt.jar
-rw-r--r-- 1 domain users  511634 2008-07-22 02:01 jasper.jar
-rw-r--r-- 1 domain users  102282 2008-07-22 02:01 jasper-el.jar
-rw-r--r-- 1 domain users   27690 2008-07-22 02:01 el-api.jar
-rw-r--r-- 1 domain users  228471 2008-07-22 02:01 catalina-tribes.jar
-rw-r--r-- 1 domain users 1129912 2008-07-22 02:01 catalina.jar
-rw-r--r-- 1 domain users  123115 2008-07-22 02:01 catalina-ha.jar
-rw-r--r-- 1 domain users   49145 2008-07-22 02:01 catalina-ant.jar
-rw-r--r-- 1 domain users   10805 2008-07-22 02:01 annotations-api.jar
-rw-r--r-- 1 domain users   18501 2009-07-21 18:01 tomcat-devloader.jar
drwxr-xr-x 2 domain users    4096 2009-11-06 15:54 pkgconfig
-rwxr-xr-x 1 domain users  613512 2009-11-06 15:54 libtcnative-1.so.0.1.16
lrwxrwxrwx 1 domain users      23 2009-11-06 15:54 libtcnative-1.so.0 -> libtcnative-1.so.0.1.16
lrwxrwxrwx 1 domain users      23 2009-11-06 15:54 libtcnative-1.so -> libtcnative-1.so.0.1.16
-rwxr-xr-x 1 domain users     939 2009-11-06 15:54 libtcnative-1.la
-rw-r--r-- 1 domain users  880544 2009-11-06 15:54 libtcnative-1.a

Démarrage d’Eclipse / WTP

Si tout s’est bien passé on aura :

6 nov. 2009 15:59:20 org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.16.
6 nov. 2009 15:59:20 org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
6 nov. 2009 15:59:20 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: Failed to initialize the SSLEngine.
6 nov. 2009 15:59:20 org.apache.coyote.http11.Http11AprProtocol init
INFO: Initialisation de Coyote HTTP/1.1 sur http-8080
6 nov. 2009 15:59:20 org.apache.coyote.ajp.AjpAprProtocol init
INFO: Initializing Coyote AJP/1.3 on ajp-8009
6 nov. 2009 15:59:20 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 832 ms
6 nov. 2009 15:59:20 org.apache.catalina.core.StandardService start
INFO: D�marrage du service Catalina
6 nov. 2009 15:59:20 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.18
INFO: Using JVM encoding charset = UTF-8

samedi, octobre 3 2009

Libérer de la place sur des disques durs de données sous Linux avec tune2fs

hdd.jpgAstuce découverte récemment pour libérer de la place sur les disques durs (ext2/ext3/ext4) sous Linux.

En effet, lors du formatage, un paramètre peut être précisé pour indiquer à Linux qu’un pourcentage du disque doit être réservé à l’utilisateur root, afin que ce dernier puisse toujours écrire sur la partition même si elle est indiquée pleine. Ce comportement est important notamment pour les disques systèmes.

Celle valeur est par défaut (si non spécifiée lors du formatage) de 5%. Ce qui peut être énorme sur un disque de grande capacité, ou inutile sur des disques de données qui ne contiennet par ex. que des médias.

Utilisation.

Sur Ubuntu 9.04 il est possible de préciser cette valeur dès la phase d’installation (sous réserve ce reformater les partitions concernées avec l’installeur).

Lors d’un formatage manuel, c’est l’option -m (“-m reserved-blocks-percentage”) qui permet de préciser cette valeur (commandes mkfs.ext2 ou mkfs.ext3 par ex.). Voir le man de mkfs.ext3 de Karmic Koala :

-m reserved-blocks-percentage
Specify the percentage of the filesystem blocks reserved for the
super-user. This avoids fragmentation, and allows root-owned
daemons, such as syslogd(8), to continue to function correctly
after non-privileged processes are prevented from writing to the
filesystem. The default percentage is 5%.


Enfin, il est parfaitement possible de modifier cette valeur à chaud sur une partition (même déjà montée), avec la commande tune2fs.

Exemples.

Passer un disque à 0% de blocs réservés (rappel : c’est fortement déconseillé sur un disque système).

sudo tune2fs -m 0 /dev/sda9

Idem mais à 3%.

sudo tune2fs -m 3 /dev/sda1

Visualiser toutes les infos sur la partition (le pourcentage n’apparaît pas, seulement le nombre de blocs réservés).

sudo dumpe2fs -h /dev/sda9

Ainsi par ex. avec la valeur par défaut de 5% sur un disque de 1500GO, j’avais :

ubuntu:/> df /dev/sda1
Sys. de fich. Type    Tail. Occ. Disp. %Occ. Monté sur
/dev/sda1     ext3    1,4T  1,3T   12G 100% /mnt/internal/sata_1500go-media

Après réduction à 0% :

ubuntu:/> sudo tune2fs -m 0 /dev/sda1
tune2fs 1.41.4 (27-Jan-2009)
Initialisation du pourcentage de blocs réservés à 0% (0 blocs)

ubuntu:/> df /dev/sda1               
Sys. de fich. Type    Tail. Occ. Disp. %Occ. Monté sur
/dev/sda1     ext3    1,4T  1,3T   82G  95% /mnt/internal/sata_1500go-media

Soit 70GO de récupérés.

Pour les infos données par tune2fs :

ubuntu:/> sudo dumpe2fs -h /dev/sda1
dumpe2fs 1.41.4 (27-Jan-2009)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          f372549f-6945-43a5-9194-a04cd34e17b3
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              91578368
Block count:              366284000
Reserved block count:     0
Free blocks:              21345077
Free inodes:              91531060
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      936
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Sat May 16 10:55:59 2009
Last mount time:          Sat Sep 26 02:29:18 2009
Last write time:          Mon Sep 28 23:35:43 2009
Mount count:              28
Maximum mount count:      26
Last checked:             Sat May 16 10:55:59 2009
Check interval:           15552000 (6 months)
Next check after:         Thu Nov 12 09:55:59 2009
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      3c04a963-383a-4b2a-aed5-4322c7bb70b0
Journal backup:           inode blocks
Taille du journal:        128M