Optimisations apache/php/postgres pour site à haut volume – partie 3

Encore des optimisations apportées au serveur de Delain, pour faire suite à ce post.

Désactivation du atime

Par défaut, chaque système Linux enregistre la date de dernier accès à un fichier. Cette opération ne prend quasiment aucune ressource en temps normal, mais pour un serveur web, chaque fichier est accédé en permanence, et cela peut vite prendre beaucoup de ressources, sans compter que cette information est la plupart du temps complètement inutile. Le plus simple pour désactiver cette fonctionnalité est de modifier le fichier /etc/fstab en rajoutant l’option noatime aux partitions ciblées (par défaut… toutes ^^). Il suffit ensuite de démonter/remonter les partitions pour que cela prenne effet immédiatement. Cette opération est sans risques, et apporte un gain non négligeable.

Passage aux connexions persistantes

La méthode de connexion à postgres via php était jusqu’à maintenant très standard : on ouvre la connexion en début de page, on fait la/les requêtes, et on ferme la connexion. Cette méthode a l’avantage de ne pas laisser traîner de slots ouverts, mais en contrepartie, il y a une toute petite latence au moment de l’ouverture de la connexion. Je suis passé en connexions persistantes (méthode pg_pconnect au lieu de pg_connect), ainsi, la connexion n’est pas fermée en fin de page, et elle pourra être réutilisée immédiatement par une autre page si besoin.

Le gain de temps est indéniable, mais il y a une contrepartie : on va générer beaucoup de connexions en attente sur postgres. Il faut donc vérifier la variable max_connections dans le fichier postgresql.conf et l’adapter à ses besoins (j’ai du doubler cette valeur) et il faut également suivre avec attention les logs de postgresql pour voir si on n’arrive pas à saturation des connexions possibles.

Utilisation poussée de APC

(extrait de la doc php) "Le "Alternative PHP Cache" (APC) est un cache d’opcode libre et ouvert pour PHP. Son objectif est de fournir un framework libre, ouvert et robuste pour la mise en cache et l’optimisation de code intermédiaire PHP."

Par défaut, APC utilise 16 Mo de cache, ce qui au final est très peu. J’ai poussé cette limite à 64 Mo par paquet, avec un maximum de 8 paquets (a priori, on ne dépasse pas pour le moment le premier paquet). De plus, apc travaille par défaut sur un fichier temporaire sur le disque. Pour le forcer à travailler en mémoire, il faut renseigner le paramètre apc.mmap_file_mask comme ce qui suit :

apc.shm_size=64M
apc.shm_segments=8
apc.mmap_file_mask=/apc.shm.XXXXXX

Cela va créer un ramdisk (tmpfs) dans lequel apc va pouvoir travailler plus rapidement.

De plus, APC permet grace à la fonction apc_store de mettre des variables dans la mémoire partagée. Ces variables ont la même valeur pour tout le monde. Dans delain, il y a 4 variables "globales" (url, chemin local sur la machine, chemin des images, préfixe) qui étaient appelées à chaque page. L’objectif est de passer ces variables dans la mémoire partagée afin qu’elles ne soient plus appelées par chaque page/client.

Laisser un commentaire