Le blog de romain.lamaison

Conférence sur "Les nouvelles technologies de l'ecommerce" à l'EPITECH

Les sociétés Stockho SI et Baobaz donneront une conférence sur "Les nouvelles technologies de l'e-commerce".

 

Lors de cette conférence, et en partenariat avec SUN Microsystems, différents résultats issus du R&D seront présentés et analysés. Les thèmes principaux abordés seront la technologie Magento, le cloud computing appliqué à l'ecommerce et l'optimisation des sites Magento.

 

Un cocktail sera organisé en fin de présentation pour permettre à tous d'échanger !

 

La conférence aura lieu le mercredi 22 mars 2010 à partir de 18:00 dans les locaux de l'EPITECH :

EPITECH - Amphi P04

14-16, rue voltaire

94270 Le Kremlin Bicêtre

 

Si vous voulez vous inscrire veuillez envoyer un mail à l'adresse conference [at] stockho.com.

 

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.

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).