Recommandations de performance

Remarque : cet article est en cours de rédaction. N'hésitez pas à le compléter. Veuillez utiliser la page de discussion ou un forum adéquat de Moodle en français pour vos recommandations et suggestions d'améliorations.

Moodle peut être configuré de sorte de fournir de très bonnes performances, que ce soit pour de petits usages, ou pour une utilisation avec plusieurs dizaines de milliers d'utilisateurs. Les facteurs impliqués dans les performances d'exécution sont fondamentalement les mêmes que pour n'importe quel système basé sur PHP et une base de données.

Lorsque vous essaierez d'optimiser votre installation, focalisez-vous avant tout sur les éléments qui feront le plus de différence pour l'utilisateur final. Par exemple, si les habitudes d'utilisation de vos utilisateurs chargent plus le serveur web que la base de données, veillez d'abord à améliorer la performance du serveur web.

Obtenir une mesure de référence

Avant de tenter la moindre optimisation, vous devriez obtenir une mesure de référence de base des composants que vous essayez d'améliorer. Pour Linux, essayez LBS et pour Windows, utilisez le Performance Monitor. Lorsque vous aurez des données quantitatives sur les performances actuelles de votre système, vous pourrez déterminer si les changements que vous aurez apportés ont eu un réel impact.

Le but général des ajustements pour accélérer l'exécution est d'employer la mémoire vive (RAM) via des caches pour réduire l'activité des disques. Il est particulièrement important d'essayer d'éliminer autant que possible l'utilisation de fichiers d'échange (swap). Si votre système commence à swapper, c'est un signe que vous avez besoin de plus de RAM.

L'ordre d'optimisation préférentiel est généralement : stockage principal (plus de RAM), le stockage secondaire (disques durs plus rapides/meilleure configuration des disques durs), processeur (plus, et plus rapides).

Il peut être intéressant d'installer le plugin Benchmark afin de découvrir les éventuels goulots d'étranglement de votre système qui affectent en particulier le fonctionnement de Moodle.

Montée en charge

La conception de Moodle (avec la séparation claire des couches de l'application) permet une grande montée en charge (jetez un oeil à la liste des grosses installations de Moodle).

Les grands sites hébergent généralement le serveur web et la base de données sur des serveurs différents. Cela n'est généralement pas nécessaire pour des installations de taille moyenne.

Il est possible de répartir une installation de Moodle sur plusieurs machines (load balancing), par exemple en utilisant plusieurs serveurs web. Ces différents serveurs doivent alors interroger la même base de données et utiliser le même stockage de fichiers (moodledata). En dehors de ceci, la séparation des couches de l'application est suffisamment complète pour rendre faisable ce type de partage de ressources. De façon analogue, la base de données peut être une grappe de serveurs (par exemple un cluster MySQL), mais cela n'est pas une tâche facile. Il est relativement simple de faire tourner des serveurs web en grappe, par exemple avec LVS ou d'autres solutions. La seule solution pas trop complexe pour un serveur de bases de données en grappe est MySQL Cluster, et elle comporte quelques problèmes. Pour une telle implémentation, il est conseillé de s'adresser à un expert en assistance, par exemple un Moodle Partner.

Voir aussi les discussions suivantes (en anglais) :

Configuration matérielle

Note : Le moyen le plus simple, rapide et efficace pour augmenter les performances est d'augmenter la mémoire vive (RAM) de votre serveur web. Installez autant de RAM que possible, c'est-à-dire 4 Go ou plus. Accroître la mémoire vive permettra de réduire l'usage de fichiers d'échange (swap) sur le disque et permettra à votre serveur de gérer plus de clients simultanément.

  • Une meilleure performance peut être atteinte en ayant la meilleure puissance processeur possible, c'est-à-dire plusieurs processeurs ou des processeurs multi-cœurs. Un EFI actuel ou un BIOS récent permettra l'hyperthreading. Vérifiez toutefois que ceci fasse une réelle différence quant à la performance d'ensemble des processeurs. Des outils permettant de mesurer cette performance seront utiles pour cela (Super PI, par exemple).
  • Si vous pouvez vous le permettre, utilisez des disques durs SCSI au lieu de disques SATA. Les disques SATA augmenteront l'utilisation du processeur de votre système, alors que les disques SCSI ont leurs propres contrôleurs intégrés et se débrouillent lorsque vous disposez de plusieurs disques. Si vous devez utiliser des disques SATA, vérifiez que votre carte mère et les disques eux-mêmes supportent NCQ (Native Command Queuing).
  • Achetez des disques durs ayant un bas temps de recherche (low seek time). Une telle option améliorera la vitesse de tout votre système, notamment l'accès aux rapports et statistiques de votre Moodle.
  • Dimensionnez votre fichier swap correctement. La règle générale est de le définir à 4 x la mémoire vive RAM.
  • Utilisez un système de disques durs RAID. De nombreuses configurations des systèmes RAID sont envisageables. La configuration suivante donne en général les meilleurs résultats :
    • installez un contrôleur RAID matériel ;
    • installez le système d'exploitation et la partition de swap sur un jeu de disques configurés en RAID 1 ;
    • installez Moodle, le serveur web et le serveur de base de données sur un autre jeu de disques configurés en RAID 5.
  • Utilisez des connexions réseau gigabit ethernet pour obtenir un meilleur débit et une faible latence. Une telle configuration est particulièrement importante dans le cas où le serveur web et le serveur de base de données sont hébergés sur des machines différentes.
  • Vérifiez les paramètres de votre carte réseau. Vous pourrez obtenir une amélioration de performance en augmentant l'utilisation des tampons ('buffers') et des descripteurs d'émission et de réception (à équilibrer avec les marges du processeur et de la mémoire) et déchargeant le système d'exploitation du calcul des sommes de contrôles TCP, en les faisant calculer par la carte réseau.
  • Étudiez cette étude de cas du test d'un serveur (Moodle 1.7) avec 300 utilisateurs.
  • Consultez le rapport qui l'accompagne montrant les statistiques du trafic réseau et de la charge du serveur.
  • Étudiez la configuration de moodle.org.
  • Voyez aussi cette présentation du SFSU à Educause (utilisant VMWare).

Système d'exploitation

  • Vous pouvez utiliser Linux (recommandé), un système Unix, Windows ou Mac OS X comme système d'exploitation pour le serveur. Les systèmes d'exploitation *nix nécessitent généralement moins de mémoire que les serveurs Mac OS X ou Windows pour faire les mêmes tâches, car le serveur n'a pas forcément une interface graphique. De plus, Linux n'a pas de coût de licence. Toutefois, si vous avez l'habitude d'un autre système d'exploitation, la courbe d'apprentissage peut être notablement raide. Si vous disposez d'un grand nombre de processeurs supportant SMP, vous pouvez essayer d'utiliser un système d'exploitation particulièrement configuré pour cela, par exemple Solaris.
  • Vérifiez votre propre système d'exploitation et les instructions du fournisseur pour les étapes d'optimisation :
    • pour Linux, consultez le site Linux Performance Team.
    • pour Linux, étudiez la commande hdparm. Par exemple, hdparm -m16 -d1 peut être utilisée pour activer la lecture/écriture sur des secteurs multiples et l'accès direct à la mémoire (DMA). Montez les disques avec les options async et noatime ;
    • pour Windows, configurez le serveur pour les applications réseau (Control Panel, Network Connections, LAN connection, Properties, File & Printer Sharing for Microsoft Networks, Properties, Optimization). Vous pouvez aussi chercher sur le site Microsoft TechNet pour des documents sur l'optimisation.
    • pour Mac OS X, les outils CHUD (Computer Hardware Understanding Development) sont particulièrement utiles pour aider à l'optimisation. Voyez également [1] et [2].

Performances du serveur web

L'installation de Firefox et de l'extension FireBug vous permettra de voir le temps nécessaire pour charger chaque composant. L'extension Yslow évaluera votre page par rapport aux 14 règles Yahoo (video) pour des sites web qui se chargent rapidement.

Performances de PHP

  • Vous êtes fortement encouragé à utiliser un accélérateur PHP pour baisser la charge CPU, comme APC (recommandé), PHPA, Xcache ou eAccelerator. Prenez garde à choisir un accélérateur PHP qui fonctionne correctement avec votre version de PHP et notez que Turck MMCache n'est plus maintenu et peut provoquer des erreurs avec PHP 5.
  • Les performances en lecture/écriture peuvent être améliorées si vous placez les pages du cache PHP sur un système de fichiers virtuel. Rappelez-vous que vous perdrez dans ce cas le contenu des caches lors du redémarrage du serveur.
  • Les performances de PHP sont meilleures s'il est installé comme un Apache/IIS ISAPI module, plutôt que comme CGI.
  • Vérifiez également le paramètre memory_limit dans php.ini. Réduisez-le à 16Mo pour les versions de Moodle jusqu'à 1.7 (voir cette discussion). À partir de Moodle 1.8, il est recommandé de fixer le paramètre memory_limit à 40Mo. Pour PHP 5.2.1, la valeur par défaut de ce paramètre est 128Mo.
  • Voir également HP_settings_by_Moodle_version (en anglais).

À METTRE À JOUR DEPUIS ICI

Performances d'Apache

  • Considérez le fait de réduire le nombre de modules qu'Apache charge dans le fichier httpd.conf au minimum nécessaire pour réduire la mémoire nécessaire.
  • Définissez correctement la directive MaxClients. Utilisez cette formule pour vous aider (elle utilise 80% de la mémoire disponible pour conserver une réserve) :
MaxClients = Total de la mémoire disponible * 80% / Utilisation maximale de la mémoire par les processus Apache
L'utilisation de la mémoire de Apache est habituellement 10 Mo. Pour trouver une valeur acceptable de MaxClients, il suffit donc de diviser par 10 la mémoire disponible de votre serveur (en Mo). Pour être plus précis, trouvez la valeur exacte du maximum de la mémoire utilisée par Apache en lançant la commande suivante dans le shell :
ps -ylC httpd --sort:rss
Si vous devez augmenter la valeur de MaxClients au delà de 256, vous devrez également définir la directive ServerLimit.
Attention ! Ne soyez pas tenté de fixer MaxClients à une valeur supérieure à la mémoire réellement disponible sur votre serveur, car dans ce cas la machine commencera à utiliser la mémoire virtuelle sur le disque et cela réduira considérablement les performances.
  • Utilisez la dernière version d'Apache : Apache 2 dispose d'un modèle de mémoire amélioré qui réduit encore plus l'utilisation de la mémoire.
  • Pour les systèmes Unix, Linux ou Mac OS X, essayez de diminuer la valeur du paramètre MaxRequestsPerChild (dans httpd.conf) à 20-30. Si vous descendez plus bas, la charge processeur pour créer de nouveaux processus annulera les gains de performance éventuels.
  • Sur un serveur très chargé, essayez le réglage KeepAlive Off (ne le faites que si vos pages Moodle ne contiennent pas de liens vers des ressources ou des images téléchargées) ou alors diminuez la valeur de KeepAliveTimeout à une valeur entre 2 et 5. La valeur par défaut est 15 (secondes). Plus cette valeur est élevée, plus de processus serveur seront maintenus en attente de connexions. Une valeur plus précise de KeepAliveTimeout est obtenue en observant le temps nécessaire à vos utilisateurs pour télécharger une page. Après avoir modifié l'un des paramètres KeepAlive, contrôlez l'utilisation de votre CPU, car il pourrait y avoir une surcharge lors de l'initiation de plus de processus de travail.
  • Comme alternative à KeepAlive Off, vous pouvez mettre en place un serveur proxy inverse (Reverse Proxy) entre votre serveur Moodle et vos clients pour mettre en cache les fichiers HTML avec des images. Il est alors possible de réactiver KeepAlive sur Apache.
  • Si vous n'utilisez pas de fichier '.htaccess', définissez le paramètre AllowOverride comme AllowOverride None pour éviter qu'Apache ne cherche vainement des fichiers .htaccess.
  • Définissez correctement le paramètre DirectoryIndex afin d'éviter la négociation de contenu. Voici un exemple tiré d'un serveur en production :
DirectoryIndex index.php index.html index.htm
  • À moins que vous n'effectuiez du développement sur votre serveur, définissez ExtendedStatus Off et désactivez mod_info ainsi que mod_status.
  • Laissez le réglage par défaut du paramètre HostnamesLookups Off pour diminuer les délais dus au DNS.
  • Essayez de réduire la valeur de TimeOut entre 30 et 60 (secondes).
  • Dans la directive Options, évitez Options Multiviews, qui lit le contenu des dossiers. Pour réduire encore plus les accès au disque, utilisez
Options -Indexes FollowSymLinks
  • Cache : Attention, ceci peut générer de gros soucis lors de mises à jour. On peut demander à Apache de charger les pages beaucoup plus rapidement en indiquant que le navigateur doit mettre en cache divers éléments de page, comme les images, et les réutiliser en les tirant de la mémoire locale plutôt que les demander chaque fois que la page est demandée. La procédure pour effectuer ceci diffère suivant les systèmes d'exploitation, mais en voici deux étapes :
  1. Installer et activez mod_expires - voyez la documentation ou les pages man
  2. Ajoutez ce code à la configuration du serveur virtuel, à l'intérieur de la section <directory> du dossier racine (ou dans le fichier .htaccess, si AllowOverrides est activé) :
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 seconds"
ExpiresByType text/html "access plus 1 seconds"
ExpiresByType image/gif "access plus 1 week"
ExpiresByType image/jpeg "access plus 1 week"
ExpiresByType image/png "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType text/xml "access plus 1 seconds"
</IfModule>
L'effet produit est que tout reste en cache, sauf les fichiers HTML et XML, qui changent dynamiquement. On peut de cette façon gagner plusieurs ordres de grandeurs de temps de chargement. Ajustez la durée de mise en cache d'après la fréquence de changement de vos images, etc.
Plus d'informations à ce sujet : www.metaskills.net
  • Autrement, vous pouvez augmenter la performance de votre serveur web en utilisant au lieu d'Apache le serveur web poids-plume (light-weight webserver) lighttpd en combinaison avec PHP en mode fastCGI. Lighttpd consomme moins de mémoire qu'Apache. Un seul processus Apache nécessite plus de RAM que la totalité de lighttpd avec tous ses processus fastCGI. Il est à remarquer que Lighttpd est relativement difficile à configurer et que son administration prend plus de temps.

Performances de IIS

Les paramètres à modifier sont situés à cet endroit de la base de registre :

 HKLM\SYSTEM\CurrentControlSet\Services\Inetinfo\Parameters\
  • L'équivalent de KeepAliveTimeout est ListenBackLog. Définissez sa valeur à entre 2 et 5.
  • Modifiez la valeur de MemCacheSize pour ajuster la taille de la mémoire en Mo que IIS utilisera pour son cache de fichiers (50% de la mémoire disponible par défaut).
  • Modifiez la valeur de MaxCachedFileSize pour ajuster la taille maximale en octets des fichiers placés en cache. La valeur par défaut est 262'144 (256 Ko).
  • Créez une nouvelle entrée DWORD dénommée ObjectCacheTTL pour modifier le temps (en millisecondes) durant lequel les objets en cache sont conservés dans la mémoire. La valeur par défaut est de 30'000 millisecondes (30 secondes).