performances magento

Suppression des logs de la base de données Magento

Magento sauvegarde dans sa base de données les informations relatives aux accès au site par les visiteurs.

Dans sa table de log, on trouve les champs log_url, log_url_info, log_visitor et log_visitor_info. Cette table peut grossir considérablement avec le temps, particulièrement sur un site à fort trafic, et affecter les performances du serveur hébergé. Par défaut, l'épuration de cette table n'est pas activée.

Pour l'activer et rélger les différentes options relatives au système de log, il convient de se rendre dans l'interface d'administration, menu Système -> Configuration, puis Système sur la gauche, puis dans l'onglet relatif aux logs.

Cluster de base de données Magento

Si tout se passe bien pour vous, votre commerce devrait s'étendre jusqu'aux limites du serveur hébergé que vous utilisez.

Lorsque ce moment arrive, que malgré toutes les optimisations mises en oeuvre, l'afflux de visiteurs commence à faire ralentir le site, il est temps de passer à une architecture multi-serveurs.

Tout a déjà été prévu dans Magento pour faciliter la mise en place d'une replication de base de données. Avec une base de données dédiée à la lecture, et une autre, dédiée à l'écriture, un système de réplication entre les deux pour garder les données synchronisées, on peut facilement doubler les capacités au niveau des accès aux données. Imaginez cela couplé à un load-balancing sur plusieurs front office... mais cela fera l'objet d'un autre billet.

Voici un lien expliquant la procédure de mise en place de la réplication, et ici un exemple de configuration du fichier racine_magento/app/etc/local.xml permettant de mettre en place la base de lecture et celle d'écriture :

[...]
       <resources>
            <db>
                <table_prefix><![CDATA[]]></table_prefix>
            </db>
            <default_setup>
                <connection>
                        <host><![CDATA[ip_bdd_ecriture:port]]></host>
                        <username><![CDATA[user]]></username>
                        <password><![CDATA[password]]></password>
                        <dbname><![CDATA[nom_bdd]]></dbname>
                    <active>1</active>
                </connection>
            </default_setup>
            <default_read>
                <connection>
                        <host><![CDATA[ip_bdd_lecture:port]]></host>
                        <username><![CDATA[user]]></username>
                        <password><![CDATA[password]]></password>
                        <dbname><![CDATA[nom_bdd]]></dbname>
                    <active>1</active>
                </connection>
            </default_read>
        </resources>
[...]

default_setup correspond à la base de données d'écriture.

Magento et mpm_worker

Concernant le fonctionnement d'Apache, le module mpm_prefork est le module par défaut. Il est très robuste mais aussi très consommateur de ressources. Chacun de ses processus utilise son propre espace mémoire, chaque nouveau processus réserve un nouvel espace en RAM.

Le module mpm_worker est plus récent, mieux pensé. Beaucoup plus performant, il permet de multi-threader les requêtes, le lancement d'un thread étant beaucoup plus rapide que celui d'un nouveau processus, conservant aussi le même espace mémoire. Il s'agit de l'une des meilleures optimisations possible pour la plateforme Magento hébergée.

La principale raison pour laquelle mpm_worker n'a pas encore remplacé mpm_prefork, est qu'il lui faut utiliser des extensions thread-safe, ce qui n'est pas toujours le cas, notamment avec mod_php. D'où la nécessité d'utiliser fastCGI en lieu et place de mod_php (voir ce billet). À noter que mpm_worker remplace mpm_prefork, et vice versa. Il n'est pas possible de conserver les deux.

Pour l'installer, un apt-get sur une debian ou un ubuntu suffit, sinon il convient de recompiler Apache avec l'option --with-mpm=worker lors du ./configure. Pour vérifier si l'installation a bien fonctionné, utiliser la commande " httpd -l " si tout s'est bien passé, worker apparaîtra dans la liste des modules chargés par Apache.

Magento et FastCGI

Très gourmand en ressources, en RAM notamment, un Magento mal configuré peut facilement épuiser les capacités d'un serveur très puissant.

Le php permet d'ajouter du dynamisme aux pages, mais a besoin d'être généré à la volée pour toute requête. Mod_php, le module php par défaut d'Apache, n'a qu'un défaut : il a été conçu pour fonctionner avec un processus différent pour chaque N requêtes. Ce qui signifie que sur un serveur très chargé, des dizaines de processus mod_php peuvent tourner en même temps, consommant de ce fait la RAM et forçant le serveur à swapper, engendrant d'énormes ralentissements. Ce phénomène est amplifié si le keepalive d'Apache est activé, car même non-utilisé, un processus mod_php resterait en RAM jusqu'à l'expiration du keepalive.

Afin de tirer profit de keepalive, et de sauvegarder la RAM du serveur, nous recommandons, pour votre plateforme hébergée, d'utiliser fastCGI. FastCGI ne lance qu'un nombre déterminé de processus, qui ne change pas. Ils restent en RAM et traitent toutes les demandes liées au php, au déficit de quelques millisecondes de chargement de page, tout en permettant d'utiliser keepalive.

Voir ce lien pour la procédure d'installation.

Magento et cache Flat catalog

À partir de la version 1.3 de Magento, l'équipe des développeurs a rajouté une optimisation majeure : le cache Flat Catalog.

Il permet de mettre en cache une version "flat" des tables du catalog. Au final, on obtient un gain de 40% de temps de chargement des pages sur le front office du site hébergé -ainsi qu'une meilleure gestion de la mémoire-, contre un ralentissement de quelques pages sur le back office.

L'activation se fait comme suit :

  • dans l'interface d'administration, Système -> Configuration, puis dans le menu de gauche "Catalogue", onglet "Frontend", cocher Oui pour les deux options concernant le Flat Catalog.
  • toujours dans l'interface d'administration, Système -> Gestion du cache, recréer les deux caches concernant le Flat Catalog.

eAccelerator et Magento

Alternative pour la gestion du cache php, eAccelerator semble donner un gain de 10% à 20% supérieur à APC sur une plateforme Magento (voir les benchmarks).

La procédure d'installation est la suivante :

  • télécharger les sources sur le site officiel ;
  • configuration, compilation et installation avec cette série de commandes :
    phpize
    ./configure --with-eaccelerator-shared-memory --with-eaccelerator-sessions --with-eaccelerator-content-caching --with-php-config=PATH
    (pour le PATH : whereis php-config)
    make && make install
  • ajouter les lignes suivantes dans php.ini :

    [eaccelerator]
    extension="eaccelerator.so"
    eaccelerator.shm_size="128"
    eaccelerator.cache_dir="/tmp/eaccelerator" 
    (créer le dossier et chmod 777)
    eaccelerator.enable="1"
    eaccelerator.optimizer="1"
    eaccelerator.check_mtime="1"
    eaccelerator.debug="0"
    eaccelerator.filter=""
    eaccelerator.shm_max="0"
    eaccelerator.shm_ttl="0"
    eaccelerator.shm_prune_period="0"
    eaccelerator.shm_only="0"
    eaccelerator.compress="1"
    eaccelerator.compress_level="9"

Puis redémarrer Apache.

Ensuite, éditer/ajouter les lignes suivantes dans racine_magento/app/etc/local.xml :

<cache>
    <backend>eaccelerator</backend>
    <prefix>alphanumeric</prefix>
</cache>

Il faudra penser à rafraichir le cache depuis l'interface d'administration du site hébergé.

Compilation intermédiaire du code PHP de Magento

Sans optimisation de ce côté, le serveur doit repasser par toutes les phases de compilation / interprétation du langage PHP pour chacune des pages du site.

Il existe des gestionnaires de cache de compilation intermédiaire du code PHP, tel que APC, qui soulagent la charge processeur du serveur en mettant en cache le code PHP dans un format de code binaire intermédiaire, ce qui épargne à l'interpréteur de recompiler l'intégralité du code PHP à chaque requête. Il s'agit de l'une des meilleurs optimisations possible pour Magento, du fait de l'importance du PHP dans son code.

La première chose à faire est d'installer APC :
par exemple sous Debian : apt-get install php-apc

Puis, dans php.ini, d'ajouter les lignes suivantes :

[apc]
apc.enabled="1"
apc.ttl="7200"
apc.user_ttl="7200"
apc.shm_segments="3"
apc.shm_size="128"

Et enfin, de redémarrer Apache.

Bien que nous recommandons – pour des raisons d'optimisations – d'utiliser le système de fichier tmpfs pour cela (voir ce billet), il est possible d'utiliser APC comme cache du dossier racine_magento/var/cache. Pour se faire, il convient de se rendre dans le fichier racine_magento/app/etc/local.xml et d'y ajouter les lignes suivantes, juste en dessous de <global> :

<cache>
    <backend>apc</backend>
    <prefix>alphanumeric</prefix>
</cache>

(dans le cas ou plusieurs Magento/sites web tourneraient sur le serveur d'hébergement, il faut remplacer alphanumeric par un préfixe unique, cela permet de différencier les caches d'APC afin de ne pas mélanger les données entre les sites).

Magento, Apache et KeepAlive

Une connexion TCP se termine automatiquement au terme d'une requête (par exemple, le téléchargement d'une seule des images de la page d'accueil du site Magento). Ainsi, une nouvelle connexion TCP devra être initiée lors d'une nouvelle requête, consumant temps et bande passante.

Afin de palier à ce problème, il est possible de garder une connexion TCP ouverte durant plusieurs requêtes, par l'envoi de paquets dits keepalive (tous les navigateurs récents le supportent). Ce procédé permet d'accélérer l'affichage d'une page lourde en images de près de 50%.

Pour l'activer, il convient de se rendre dans le fichier de configuration d'Apache (sous Debian : /etc/apache2/apache.conf), et de changer la ligne KeepAlive Off en KeepAlive On (plus d'informations ici).

En ce qui concerne Magento, il est essentiel de ne pas l'activer si on utilise mod_php, en effet, un processus mod_php est spawné par Apache à chaque fois que cela s'avère nécessaire. A cause de keepalive, le processus reste en RAM pendant le timeout du keepalive, ce qui peut impacter énormément les performances en épuisant temporairement la RAM du serveur et en swappant. En revanche, c'est une optimisation dont on ne saurait se passer avec fastCGI, qui lui spawn un processus unique qui reste de toute façon en RAM (voir ce billet).

Compilateur Magento

Magento-compiler est une extension créée par l'équipe des développeurs de Magento. Elle permet de créer une sorte d'archive de toute l'installation de Magento, afin de tout réunir en un seul fichier pour gagner du temps sur les accès disque.

Si la plateforme hébergée est installée sur un serveur ne disposant que de peu de RAM (moins de 2GB) et / ou d'un disque dur moyen (7200 tours par minute ou moins), l'extension peut permettre un gain de 30% à 70% sur le temps de chargement d'une page.

Avec un matériel plus puissant, le gain sera largement moindre, mais on peut tout de même observer un gain de l'ordre de 5%, ce qui n'est pas forcément négligeable si on réfléchit à l'agrégation de toutes les optimisations possibles.

Il faut noter que cette extension est encore en version beta, donc à utiliser avec prudence sur une plateforme en production.

Pour le téléchargement et la procédure d'installation, rendez-vous ici.

Extension Magento : Fooman Speedster

La compression Gzip dont nous avons parlé précédemment (voir ce billet), ne permet pas par défaut la compression du Javascript, ni celle du CSS, éléments pourtant très présents et volumineux dans les pages Magento.

Elles sont relativement compliquées à activer par soi-même, c'est pourquoi nous recommandons l'utilisation d'une extension Magento qui fait tout cela, et un peu plus : Fooman Speedster, l'une des extensions les mieux notées et les plus téléchargées et pour cause : en tirant parti de la librairie Minify, elle permet non seulement la compression du javascript et du CSS, mais aussi de les mettre en cache, de les combiner en un seul fichier, ainsi que de les garder à jour grâce à un système de version. Voir cette page pour la procédure d'installation.

On pourra optimiser encore un peu plus le fonctionnement de la plateforme hébergée en montant le dossier racine_magento/var/minifycache en RAM (se référer à ce billet).