Vous êtes sur la page 1sur 14

Performances

PHP
Audit et optimisation LAMP

Julien Pauli
Cyril Pierre de Geyer
Guillaume Plessis

Prface dArmel Fauveau

Groupe Eyrolles, 2012, ISBN : 978-2-212-12800-0

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page V Jeudi, 5. janvier 2012 9:09 09

Prface
Amener un projet web maturit est un processus complexe, dont la gestion des performances est un aspect dcisif. En effet, ces dernires importent autant, si ce nest
plus, que les choix techniques et mthodologiques qui ont t faits. La raison en est
simple mais elle chappe pourtant souvent aux dveloppeurs et aux chefs de projets :
les performances sont directement perceptibles par lutilisateur, sous la forme dune
sensation de vitesse, mais aussi de disponibilit. Do leffet dsastreux dun serveur
LAMP qui narriverait plus traiter les demandes entrantes !
Cest un fait, lutilisateur se soucie peu des choix architecturaux et nen a gnralement pas mme connaissance ; en revanche, il nest jamais indiffrent aux performances, bonnes ou mauvaises...
Voil pourquoi le succs de lexprience de navigation de lutilisateur repose sur vous,
qui lisez ce livre. La rapidit et la bonne tenue de votre application ( savoir des
temps de rponse courts et une continuit de service sans faille) sont des conditions
ncessaires voire suffisantes ladoption de votre projet. Il est donc important
dapprendre soulager lempreinte mmoire, la charge CPU, les accs disques, le
rseau et la bande passante, qui sont autant de maillons dune chane dlicate et
fragile : larchitecture du systme. Et cest prcisment le rle dun audit et le but de
loptimisation que den prendre soin.
Mais comment faire ? Il nexiste pas de solution prte lemploi et il ne sagit pas
dune science exacte. La matrise des performances est un art qui saffine avec le
temps et lexprience ; elle ncessite une remise en question permanente, a fortiori
dans un contexte web o les usages et les technologies voluent sans cesse. La matrise des performances passe donc par lapprentissage et la bonne comprhension des
diffrentes briques logicielles qui composent votre socle technique. Elle implique
galement la prise en main doutils et la mise en uvre de bonnes pratiques. Il vous
faudra notamment connatre et comprendre le fonctionnement, le rle et les points

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page VI Jeudi, 5. janvier 2012 9:09 09

VI

Audit et optimisation LAMP

faibles des diffrents rouages du systme, pour tre en mesure doptimiser les performances de ce dernier sans en compromettre ni la stabilit ni la robustesse.
Cest prcisment ce que cet ouvrage, rdig par des auteurs passionns, vous propose
de dcouvrir. Aprs une prsentation de larchitecture LAMP, vous apprendrez
couter votre plate-forme serveur par le biais de lanalyse des fichiers journaux et de
divers outils de monitoring. Vous dcouvrirez comment mener bien des tirs de
charge de grande envergure avec des donnes fictives pour simuler des situations de
production relles. Vous apprendrez compiler, paramtrer et optimiser finement
Apache, MySQL et PHP. Vous dcouvrirez comment soulager PHP de coteuses
tapes de parsing et saurez choisir judicieusement votre moteur de stockage MySQL.
Vous apprendrez enfin identifier avec prcision les points de congestion dans votre
code et vos requtes. Les diffrentes techniques de rplication MySQL nauront plus
de secret pour vous.
Au-del de votre plate-forme LAMP et des soucis de diminution de charge ct backend, vous vous apercevrez que les problmatiques de performances et doptimisation
se rpercutent galement sur le rseau et au cur du navigateur. Prs de 90 % du
temps pass traiter et afficher une page web est consomm par les changes rseau
et les traitements ct client. Nouvelle frontire en termes de recherche et dinvestigation, faisant lobjet de nombreuses tudes actuelles, loptimisation ct frontend est
donc primordiale. Vous apprendrez limiter le nombre de requtes HTTP, rduire
la taille des ressources et mieux grer le cache du navigateur.
Comme vous le constaterez, il est possible dagir chaque tape de votre projet, du
code jusquaux diffrents protocoles rseau. Il est mme recommand de nen ngliger
aucune.
Je me permettrais un dernier conseil : loptimisation ne devrait intervenir quen toute
fin de projet, lorsque celui-ci rpond aux exigences fonctionnelles dictes par votre
cahier des charges. Le faire trop tt est en effet souvent source derreur... alors quil
nest jamais trop tard pour sen proccuper.
Bonne lecture !

Armel Fauveau
Co-fondateur et directeur technique de GLOBALIS
Co-fondateur de lAFUP (Association franaise des utilisateurs de PHP)

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page VII Jeudi, 5. janvier 2012 9:09 09

Table des matires


Avant-propos ................................................................................. 1
Pourquoi ce livre ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
qui sadresse ce livre ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Structure de louvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

CHAPITRE 1
Prsentation de larchitecture LAMP ........................................... 5
Les diffrents composants LAMP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Le noyau Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Le serveur web Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Le langage PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Le serveur de base de donnes MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Communication entre les composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Lapplication tmoin : une application Drupal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Lenvironnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Dmarche de test et outil utilis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

CHAPITRE 2
Analyse et administration des logs ........................................... 13
quoi sert la journalisation, comment marche-t-elle ? . . . . . . . . . . . . . . . . . . . . . 13
Configurations recommandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Pendant le dveloppement ou laudit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
En production . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Synthse et recommandations de gestion de la journalisation . . . . . . . . . . . . . . 14
Archivage par rotation des fichiers de logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Les journaux dApache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Localisation et configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Les journaux daccs dApache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Quelques manipulations sur les fichiers de logs daccs . . . . . . . . . . . . . . . . . . 20
Utiliser les erreurs dApache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page VIII Jeudi, 5. janvier 2012 9:09 09

VIII

Audit et optimisation LAMP

Les journaux de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22


Configurer la journalisation des requtes lentes et/ou sans index . . . . . . . . . . . 23
Le fichier de log binaire pour la rplication . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Activer le fichier de journalisation gnral de MySQL . . . . . . . . . . . . . . . . . . 25
Les journaux de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Le journal derreurs PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Les diffrents niveaux derreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Configuration via le fichier php.ini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Configuration via Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

CHAPITRE 3
Superviser lactivit .................................................................... 31
Enregistrement et suivi graphique avec Munin . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Installation et prise en main de Munin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Installation du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Installation dun nud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Les plug-ins de Munin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Mise en avant des mtriques de suivi utilises . . . . . . . . . . . . . . . . . . . . . . . 36
Supervision avec Nagios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Installation de Nagios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Configuration de Nagios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
NRPE, la base pour une supervision distante . . . . . . . . . . . . . . . . . . . . . . . 43
Monitoring systme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Monitoring des processus Apache et MySQL . . . . . . . . . . . . . . . . . . . . . . . . 47

CHAPITRE 4
Figer, restaurer et charger une base de donnes MySQL ........ 51
Figer un tat de votre base de donnes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Quel type de sauvegarde pour votre base de donnes ? . . . . . . . . . . . . . . . . . . . 52
Sauvegarder la base dans un fichier texte : la sauvegarde logique . . . . . . . . . . . 53
Crer des sauvegardes logiques avec mysqldump . . . . . . . . . . . . . . . . . . . . . . 53
Crer des sauvegardes logiques avec phpMyAdmin . . . . . . . . . . . . . . . . . . . . 55
Crer des sauvegardes logiques avec MySQL Workbench . . . . . . . . . . . . . . . . 56
Restaurer votre base de donnes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Restaurer une sauvegarde logique avec phpMyAdmin . . . . . . . . . . . . . . . . . . . 58
Charger une base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Avec des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Directement avec PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
En reproduisant des scnarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Avec Selenium IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page IX Jeudi, 5. janvier 2012 9:09 09

Table des matires

CHAPITRE 5
Scnarios de test et tirs de charge ............................................. 63
Scnarios de test et outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Mthodes de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
laboration dune stratgie de tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Exploitation dApache et de ses logs pour mettre en place
des jeux de tests ralistes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Connatre la rpartition des requtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Tir de charge simple avec Apache Bench . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Installation et utilisation de http_load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Installation et utilisation de Siege . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Cration de lunit de mesure de nos tirs de charge . . . . . . . . . . . . . . . . . . . . . 72
Enregistrement et ralisation dun scnario avec JMeter. . . . . . . . . . . . . . . . . . . . 74
Installation et excution de JMeter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Excution de JMeter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Excution de JMeter en ligne de commande . . . . . . . . . . . . . . . . . . . . . . . . . 77
Excution de JMeter derrire un proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Briques de base de JMeter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Groupe dunits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
chantillons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Contrleurs logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Rcepteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Construire son premier plan de test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Simulation de lenvoi de formulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Contourner les jetons (tokens) bloquant les envois multiples de formulaires . . . 85
lments de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Factorisation de vos lments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Gestion des sessions/cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Mise en place du proxy JMeter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Configuration du navigateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Dmarrage du serveur proxy JMeter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Exclusion dlments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

CHAPITRE 6
Optimiser la configuration de PHP ............................................. 91
Localisation du fichier de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Directives de configuration de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Options gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Gestion du tampon de sortie de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Compression des pages avant envoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

IX

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page X Jeudi, 5. janvier 2012 9:09 09

Audit et optimisation LAMP

Donnes en transit sur HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96


Options lies aux limitations des ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Directives lies aux donnes et aux rpertoires . . . . . . . . . . . . . . . . . . . . . . . . . 98
Gestion des inclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Gestion des sessions PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Ramasse-miettes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Gestion des extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

CHAPITRE 7
Administration de PHP .............................................................. 105
Rduction de la quantit de code compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Rappel sur le fonctionnement global de PHP . . . . . . . . . . . . . . . . . . . . . . . . 105
Compilation utile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Identification des fichiers inclus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Auto-chargement de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Cache dop-codes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Fonctionnement dun cache dop-codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Installation dun cache dop-codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Configuration du cache dop-codes APC . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Monitoring du cache dop-codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Tir de charge sur notre application de rfrence . . . . . . . . . . . . . . . . . . . . . . 116
Premier benchmark de rfrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Second benchmark de rfrence : avec APC . . . . . . . . . . . . . . . . . . . . . . . . . 117
Fragmentation de la mmoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Technologies de bas niveau utilises par le cache . . . . . . . . . . . . . . . . . . . . . . 119
Cache utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Compilation et personnalisation de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Quest-ce que la compilation de sources ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Tir de charge sur un PHP compil avec des optimisations . . . . . . . . . . . . . . . 121
Tir de charge du moteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Tir de charge de notre application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Compilation manuelle dApache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

CHAPITRE 8
Amliorer son code PHP ............................................................ 127
Quest-ce que le profiling applicatif ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Principe retenir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Mise en pratique du profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Installation de Xdebug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Installation dun outil de visualisation graphique . . . . . . . . . . . . . . . . . . . . . . 129

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page XI Jeudi, 5. janvier 2012 9:09 09

Table des matires

Exercice de profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129


Profiling de notre application Drupal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Mise en pratique du profiling Xhprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Installation de Xhprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Exercice de profiling avec Xhprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Un peu plus loin avec Xhprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Conclusion sur le profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

CHAPITRE 9
Administration et optimisation dApache .............................. 139
Apache : ce quil faut absolument savoir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Comment Apache est devenu un incontournable du Web . . . . . . . . . . . . . . . 139
Architecture et fonctionnement modulaire . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Modules multi-processus (MPM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
MPM prefork . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
MPM worker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Les autres MPM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Intgration de PHP via mod_cgi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Installation de PHP en CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Tirs de charge sur un script PHP en mode CGI . . . . . . . . . . . . . . . . . . . . . . 151
Fonctionnement de CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Intgration de PHP via mod_php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Installation de mod_php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Tirs de charge sur un script PHP interprt par mod_php . . . . . . . . . . . . . . . 156
Fonctionnement interne de mod_php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Configuration dApache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Syntaxe du fichier de configuration dApache . . . . . . . . . . . . . . . . . . . . . . . . 160
Porte des directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Fichiers .htaccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Localisation de la configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Optimisation dApache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Optimisation de la gestion des processus fils . . . . . . . . . . . . . . . . . . . . . . . . . 166
Tirs de charge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Optimisations gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Accs disque et temps processeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Mmoire vive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Alternatives Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Problme C10k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Prsentation de Nginx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Installation et configuration de Nginx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Interactions avec PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

XI

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page XII Jeudi, 5. janvier 2012 9:09 09

XII

Audit et optimisation LAMP

Tirs de charge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

CHAPITRE 10
Optimisations HTTP ................................................................... 183
Protocole HTTP : lessentiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
HTTP/1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Format dune requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Format dune rponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
HTTP/1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Connexions persistantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Pipelining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Outils danalyse et de manipulation des requtes HTTP . . . . . . . . . . . . . . . . 190
Curl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
LiveHttpHeaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
FireBug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Yslow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
TamperData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Optimisation via le cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Optimisation via le cache navigateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Exploitation de len-tte Expires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Exploitation de len-tte Cache-Control . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Exploitation de len-tte Etag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Optimisation par un reverse-proxy cache HTTP . . . . . . . . . . . . . . . . . . . . . . 202
Exploitation du mod_cache dApache . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Exploitation de Varnish : le cache HTTP . . . . . . . . . . . . . . . . . . . . . . . . . 205
Compression des documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Pourquoi compresser ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Compatibilit des navigateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Mise en place de la compression HTTP au sein dApache . . . . . . . . . . . . . . . 211
Mise en place de la compression HTTP au sein de PHP . . . . . . . . . . . . . . . 213
En rsum. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Vrifications essentielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Vrifications complmentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Liste rcapitulative pour optimiser le cache HTTP . . . . . . . . . . . . . . . . . . . . 216

CHAPITRE 11
Administration et optimisation de MySQL ............................. 219
MySQL, la base de donnes idale pour le Web . . . . . . . . . . . . . . . . . . . . . . . . . 220
Une adoption rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Un dveloppement chahut, mais dynamique . . . . . . . . . . . . . . . . . . . . . . . . 220
Fonctionnalits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page XIII Jeudi, 5. janvier 2012 9:09 09

Table des matires

Support du standard ANSI SQL-99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221


Gestion des partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Schmas dinformation et de performance . . . . . . . . . . . . . . . . . . . . . . . . . 222
Gestion du cache de requtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Gestion de la rplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Une architecture modulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Connexion de PHP MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Adapter MySQL aux ressources disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Installer MySQL sur un systme 64 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Migration vers une version 5.1+ de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 228
Adapter sa configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Paramtrage gnral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Paramtrage InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Le cache de requtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Connexions choues : augmenter max_connect_errors . . . . . . . . . . . . . . . . 232
Acclration des connexions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Bonne valeur de max_connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Une aide prcieuse : MySQLTuner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Optimisation du schma et des requtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Normalisation du schma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Choix des bons types de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Utiliser correctement les index : pas pas . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Identifier les requtes peu performantes . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Analyser le plan dexcution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Poser les bons index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Cas limite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Profilage de requtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Choix du bon moteur de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Quels sont les moteurs disponibles ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
MyISAM, le plus vloce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
InnoDB, le plus robuste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Blackhole, le trou noir pour vos donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Heap, rapide pour des donnes temporaires . . . . . . . . . . . . . . . . . . . . . . . . 247
Archive, idal pour la journalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Un moteur pour chaque problmatique . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Monter en charge grce la rplication MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 248
Matre-esclave(s) : gain en lectures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Matre-matre actif/actif : gain en critures . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Matre-matre actif/passif : haute disponibilit . . . . . . . . . . . . . . . . . . . . . . . 251
DRBD pour les petites structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Tungsten Replicator pour une rplication synchrone performante . . . . . . . . . 253

XIII

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page XIV Jeudi, 5. janvier 2012 9:09 09

XIV

Audit et optimisation LAMP

Rplication MySQL : les bonnes pratiques . . . . . . . . . . . . . . . . . . . . . . . . . . 253


viter certaines requtes non sres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Ne plus utiliser MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Empcher lesclave de crasher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Avoir un esclave au moins aussi puissant que le matre . . . . . . . . . . . . . . . . 255
Filtrage de la rplication : utiliser avec prcaution . . . . . . . . . . . . . . . . . . 256
Adapter le format des logs binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
En rsum. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Que veut-on optimiser dans une base de donnes ? . . . . . . . . . . . . . . . . . . . . 257
Comment seffectue la mise lchelle ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Quel type de mise lchelle ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
La plus frquente : la mise lchelle verticale . . . . . . . . . . . . . . . . . . . . . . 258
Plus complexe mais plus prenne : la mise lchelle horizontale . . . . . . . . . . 259

Index ........................................................................................... 263

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page 1 Jeudi, 5. janvier 2012 9:09 09

Avant-propos
Pourquoi ce livre ?
Pourquoi crire un livre si ce nest une affaire de passion ? En effet, pour nous, PHP
est une affaire de cur. Nous allons vous transmettre non seulement un savoir, mais
aussi une exprience et une passion.
Que ce soit dans le cadre de lcriture (co-criture des livres PHP 5 avanc, ZF en
action, articles dans la presse) ou dune forte implication associative (paquets Dotdeb,
cration de lAFUP (Association franaise des utilisateurs de PHP, PHPfrance, etc.),
nous travaillons depuis plus de dix ans la promotion et au dveloppement de PHP.
Au travers de ces expriences et de nos activits professionnelles respectives, nous
avons t confronts de nombreuses problmatiques, dont une rcurrente pour
toute application Web victime de son succs : loptimisation des performances.
Bien quil ny ait pas de solution idale gnrique, il existe une mthodologie et des pistes
pour multiplier les performances de la pile LAMP (Linux, Apache, MySQL et PHP).
Nous avons souhait vous transmettre ces connaissance au travers dune mthode
dapprentissage ludique : au fur et mesure de votre lecture, vous pourrez mettre en place
les optimisations signales prcdemment et, petit petit, amliorer votre application.

qui sadresse ce livre ?


Cet ouvrage est technique, il sadresse des informaticiens ayant une bonne exprience de la programmation PHP et de ladministration de serveurs.
Pour ladministrateur, nous avons mis en place une approche pdagogique lui permettant de comprendre de faon fine comment fonctionne la pile LAMP, son instal-

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page 2 Jeudi, 5. janvier 2012 9:09 09

Audit et optimisation LAMP

lation, son administration et sa gestion quotidienne. Au fil des chapitres, il apprendra


optimiser finement chaque partie et en mesurer les performances.
Quant au dveloppeur, il apprendra au travers de cet ouvrage le fonctionnement intime
de son langage ftiche, PHP, afin dtre en mesure doptimiser ses dveloppements. Il
acquierra une bonne vue densemble de la partie serveur web, au travers dApache, sans
oublier la communication HTTP, dont loptimisation est trs importante.
Enfin, tout lecteur curieux au sujet de la pile LAMP saura trouver des informations
dtailles concernant son fonctionnement et les manires de loptimiser, de mesurer
les temps de rponse, de jouer des scnarios de test, etc.

Structure de louvrage
Ce livre a t dcompos en 11 chapitres, chacun prsentant une partie spcifique
visant optimiser les performances dune application LAMP.
Le chapitre 1 est une introduction prsentant les composants LAMP, la manire
dont ils sont lis et les diffrents points quil conviendra de surveiller en vue dune
possible optimisation.
Le chapitre 2 explique comment utiliser les logs, ces informations de journalisation que vos composants LAMP enregistrent. Vous verrez comment les trouver,
les exploiter, et dans quel but.
Le chapitre 3 est ddi au monitoring, cest--dire la surveillance active en
temps rel de vos composants LAMP. En effet, ceux-ci sont capables de vous
avertir lorsquun problme de performance a lieu ; vous de savoir les couter.
Dans le chapitre 4, nous tudions les informations prsentes dans une base de
donnes. Nous montrons comment les sauvegarder et les restaurer dans le but de
monter une architecture parallle sur laquelle effectuer des tests.
Les tests de charge sont abords au chapitre 5 qui traite des outils ncessaires ce
travail et de leur mise en place.
PHP fera lobjet des chapitres 6, 7 et 8 qui le dcortiqueront de lintrieur pour
vous montrer comment il fonctionne, mais aussi et surtout comment optimiser ce
fonctionnement pour quil soit plus efficace.
Le serveur web est un composant crucial que le chapitre 9 prsente. Comment
fonctionne Apache, quelles sont les erreurs ne pas faire, comment en tirer des
performances maximales ? Nous aborderons galement les alternatives Apache.
Dans le chapitre 10, nous nous efforons de vous montrer que la communication
entre les composants est dune importance capitale en matire de performances.
HTTP sera donc lhonneur dans ce chapitre.

OptimisationLAMP_mssfBonMEPGael_corrs1eresIntegrees.book Page 3 Jeudi, 5. janvier 2012 9:09 09

Avant-propos

Enfin, le chapitre 11 traite du fonctionnement, de la configuration et de loptimi-

sation de MySQL, le serveur de bases de donnes Open Source le plus connu et le


plus utilis dans le domaine du Web.

Remerciements
Nous tenons remercier tous ceux qui nous ont aids rdiger ce livre :
aux familles, proches et amis pour leur soutien et leur patience pendant ces longs
mois de rdaction et de rflexion ;
aux ditions Eyrolles pour avoir cru en notre projet et lavoir soutenu ds le
dpart ;
Valrie Glane, Armel Fauveau, Olivier Dasini, Nicolas Henion (nicolargo),
Milamber et Frdric Hardy pour leurs contributions multiples au dveloppement
des divers chapitres ;
, dans le dsordre, Guillaume Rossolini, Stphane Crivisier, Sbastien Lucas,
Hugo Hamon, Charlotte Grafeille, Francis Nappez pour les diverses relectures
quils ont pu faire ;
et tous les autres dont nous navons pas le nom complet, que nous navons pas
pu recontacter ou que nous avons simplement oublis dans la prcipitation juste
avant limpression de cette page.
Merci tous, car sans vous, ce livre naurait peut-tre pas vu le jour.