Benchmark : les performances finales
Pour évaluer ces optimisations, j’ai naturellement fait une série de tests. J’aurais pu terminer par cette partie, mais je trouve ça plus sympa de la mettre au tout début. Au moins, ça montre où on va. Voici donc comment j’ai réalisé ces tests de performance :
- J’ai installé une distribution Debian 5 vierge, avec Apache, PHP5 et MySQL (configuration de base) ainsi que la dernière version de Wordpress 2.9.2. J’ai ajouté quelques articles bidons, et les 10 plugins les plus populaires de Wordpress.
- Puis j’ai fait mes premiers tests. En moyenne, sur ma machine virtuelle, en simulant 1000 utilisateurs en ligne simultanément, qui appellent aléatoirement la page d’accueil, l’accueil d’une catégorie, la page d’une recherche ou la page d’un article, la page se charge en 3622,1 millisecondes. Ca peut paraitre beaucoup, mais c’était une machine virtuelle, et il y avait quand même 1000 personnes en parallèle.
- J’ai fait mes optimisations sur Wordpress, configuré un Squid en profondeur, configuré correctement MySQL et Apache.
- J’ai relancé mes tests. Toujours sur ma machine virtuelle, et toujours en simulant toujours 1000 utilisateurs en ligne simultanés, qui appellent aléatoirement la page d’accueil, l’accueil d’une catégorie, la page d’une recherche ou la page d’un article, la page se charge en moyenne en 129,4 millisecondes.
Soit un chargement moyen 27 fois plus rapide !
Attention aux plugins, attention aux thèmes
Même si cela ne rentre pas directement en compte dans mes tests, c'est le premier conseil que je peux vous donner : il faut faire attention à certains plugins. Certains d’entre eux sont très mal codés, et consomment beaucoup de ressources.
C’est dommage, car un tout petit plugin peut parfois écrouler les performances globales de votre blog. Si vous n’avez pas le niveau pour analyser la source de ces plugins, essayez quand même de regarder les appréciations globales sur Wordpress Plugins, dans les commentaires.
C’est aussi valable pour les thèmes. C’est même encore plus traitre, car on ne s’attend pas à ce qu’un thème puisse être une « usine à gaz ». Pourtant, certains proposent tellement d’options qu’ils sont super lourds. Je pense par exemple au thème Mystique.
Pour les thèmes, pensez aussi à regarder la taille des images et des fichiers Javascript. Ces fichiers doivent en effet être chargés par vos lecteurs : s’ils sont lourds, le chargement des pages sera forcement plus longs. C’est désagréable pour les lecteurs.
Désactiver la révision des articles
Depuis la version 2.6, Wordpress inclut un système de « révisions ». En gros, lorsque vous modifiez ou enregistrez un article, un nouvel enregistrement est ajouté dans la base de données. C’est pratique lorsque vous écrivez à plusieurs et que vous souhaitez garder une trace de toutes les modifications réalisées (avec la possibilité de revenir en arrière), mais c’est très consommateur en ressources.
En effet, un article peut ainsi se retrouver en 15 ou 20 exemplaires dans votre base de données. La taille de votre base de données sera donc décuplée, ce qui l’alourdira. Du coup, en plus de consommer plus d’espace disque, elle sera légèrement plus lente.
Si vous n’avez pas besoin de cette fonctionnalité, autant la désactiver directement. Pour cela, modifiez le fichier wp-config qui se trouve à la racine de votre Wordpress, puis ajoutez la ligne suivante :
{{< highlight bash >}}define('WP_POST_REVISIONS', false);{{< /highlight >}}Vous pouvez également purger votre base de données, en effaçant l’ensemble des “revisions”. Rassurez-vous, cela n’aura aucun impact sur l’affichage de votre blog ; seuls l’historiques des modifications sera supprimés. Pour cela, connectez-vous à votre base de données MySQL (via phpMyAdmin, par exemple), et lancez la requête SQL suivante :
{{< highlight bash >}}DELETE FROM wp_posts WHERE post_type = 'revision';{{< /highlight >}}Ajouter un cache Gravatar
Wordpress intègre le service Gravatar, qui permet d’associé automatiquement un avatar selon l’adresse email de l’auteur d’un commentaire. C’est notamment ce service qui permet d’ajouter automatiquement ma petite photo, à coté de tous mes commentaires.
Cependant, les serveurs Gravatar ne sont pas toujours très véloces. Surtout qu'ils ne demandent pas au navigateur de les mettre en cache. Une image, une requête HTTP. Avec 50 commentaires, 50 requêtes HTTP supplémentaires. Ca peut vite devenir lent pour le visiteur !
Heureusement, un plugin vous permet de mettre en cache ces avatars. Vous avez ainsi le contrôle sur l’expiration du cache navigateur, et limitez les requêtes vers les serveurs Gravatar.
Héberger vos images sur des IPs différentes
Quand un navigateur charge une page, il charge également l’ensemble de ses images, et l’ensemble de ses fichiers Javascript. Pour cela, il fait une requête HTTP par objet. Seulement, pour ne pas surcharger le pauvre serveur, il se limite généralement à 2 ou 3 requêtes simultanées sur la même IP… ce qui prend au final encore plus de temps !
Pour contourner cela, une idée est d’avoir plusieurs IP. Si vous avez un serveur dédié, vous pouvez facilement créer un sous-domaine, pointant sur votre serveur avec une autre IP, pour héberger toutes vos images. Si vous êtes en mutualisé, c’est déjà plus dur. La solution est alors d’avoir plusieurs hébergeurs, avec des IP différentes.
Et ensuite ?
La suite sera détaillée dans les prochains billets. Par contre, pour la suite, il sera nécessaire d’avoir la main sur la configuration du serveur. Au programme : mise en place d’un cache léger en mémoire vive, configuration d’Apache et MySQL, mise en place d’un cache lourd (via l’installation et la configuration d’un proxy).
En espérant que ce premier article puisse vous servir, même s'il concerne pour le moment que les bases de l'optimisation. J'attends vos conseils et remarques, pour rédiger au mieux la suite de cet article.
Vos réflexions
Je reprends, en faisant plus court :
Ton article est complètement réussi : tu m'as fait un lien :)
Plus sérieusement, je retiens le coup de désactiver la révision des articles. Le top serait que les sauvegardes soient supprimées automatiquement après la publication et quelques jours.
Bravo pour l'article !
<i>Au passage, pas cool que des updates Twitter soient protégées, du coup, impossible de savoir ce que tu racontes de beau pour éventuellement t'ajouter</i>
Oui, la suite est déjà bien avancée. J'espère tout finir ce week-end. Merci à toi pour avoir publié mon article.
@Keeg :
Merci. Il serait en effet possible de faire un plugin pour purger la base serait en effet possible. Il faudrait que j'y réfléchisse.
Pour Twitter, j'avais déjà quelques aprioris avant de m'inscrire, donc je préfère garder la main sur les personnes qui peuvent me lire. Du moins, pour l'instant.
Moi qui avait des soucis avec ma BDD, c'est regle :-)
"Au programme : mise en place d’un cache léger en mémoire vive"
Je ne suis pas contre le Guest Blogging, mais j'aime autant quand il est fait par de vrais blogueurs. Pas des développeuses qui s'improvisent blogueuse une journée... Là, on sent directement le coté "débutant" de l'article (au niveau de sa rédaction), et c'est dommage car tu as l'air plutôt calé dans ton domaine !
Mais bon, maintenant que tu as commencé, autant finir cette série... Je dis juste que j'aurais préféré avoir le même contenu, mais écrit par Julien Guyomard, avec son style d'écriture.
Je te trouve un peu dur. Ok, ce n'est pas ma plume, ok, ce ne sont pas mes expressions. Et alors ?
D'autant plus qu'il s'agit d'un article technique. Il s'adresse à une population relativement <em>experte</em> dans ce domaine, et relativement à l'aise avec des documentations austères. Et oui, suffit de regarder les sources de Wordpress pour voir que ce n'est pas aussi poétique qu'ils le prétendent. Pas au sens de Victor Hugo, du moins. Du code, du code et encore du code. Avec allitération en IF, svp.
Et puis, comment une non-blogueuse pourrait un jour devenir une blogueuse si elle ne se jette pas à l'eau ? ;)
@Louna : Oui, l'ajout d'un cache sera expliqué dans le prochain article. Ca sera peut être même le coeur du prochain article.
Je vais essayer de mettre en application tous ces conseils
Merci :)
Et plus particulièrement pour avoir dégoté le plugin GravatarLocalCache qui permet enfin de cacher les gravatar, et propose une alternative au plugin Gravatars2 qui est abandonné depuis bien longtemps !
Vivement la suite.
@Reaves : La suite arrive dans quelques jours, et devrait être encore plus technique ;)
Installer le thème Mystique: done !
Installer plein de plugins inutiles: done !
Activer la révision des articles: done !
YOUHOU ! Oh wait...
Bon je vais de ce pas me remettre le nez dans la config de mon blog qui est le parfait exemple de ce qu'il ne faut pas faire...
Merci pour ce superbe article !