Upload
the-coding-machine
View
221
Download
0
Embed Size (px)
Citation preview
8/6/2019 Amliorez les performances de vos projets web
1/56
1/56
8/6/2019 Amliorez les performances de vos projets web
2/56
Introduction
Une histoire qui se rpte souvent ...
Vouscommencezrcolterlefruitdevosefforts,votresitewebestun
succs flicitations ! Cependant,voussentezquevotresitedevient
plus lent etun beaujour, avec encore un peu plus de succs et donc
plus de trafic, votre site web ne rpond plus... sur une page, sur une
fonctionnalit particulire, ou encore de manire globale, en cas de
tropforteaffluence.
Lorsque l'on rencontre des problmes de performance, il estsouvent trop tard. Le site est dj en production et l'activit de lasocitpeuttrefortementpnalise.Lorsqu'unsitedevientlent,plus
de50%desvisiteursarrtent leurnavigation.Pour l'quipeduprojet,
trouver une solution rapidement devient la premire proccupation.
Or, en matire d'optimisation, les solutions sont trs nombreuses.
Danslaplupartdescas,dessolutionssontappliqueslesunesaprsles
autresdanslaprcipitationavecunedpensed'nergieincroyable:les
quipestravaillentlanuit,leweekend..."maiscettefois,c'estsr,onalabonnesolution!"Danslaplupartdescas,ilfautcomprendrequecessolutionsuniqueset
appliques sans discernement vont vous faire perdre un temps
prcieux.Mmesisouvent,onfinitquandmmepartrouver,avecun
peudechanceetauprixd'effortsconsidrables.
Notreconvictionestquel'applicationd'unedmarchestructureetrationnelleest laclpouramliorer lesperformancesdevotresiteet passer ce cap difficile. Mme (voire surtout) s'il s'agit d'unesituationdecrise.
De l'importance de mettre en place un plan
d'amlioration continu des performances
Au del de l'aspect douloureux des mauvaises performances, il est
essentieldemettreenplaceunpland'amliorationdesperformances
pouraumoinsdeuxraisons:
1. denombreusesstatistiquessurlessiteseCommercemontrentque rduire les temps d'affichage des pages rduit le taux
d'abandondepanier;
2. lesmoteursderechercheprennentdeplusenplusencomptele confort des utilisateurs. Une des seules mesures leur
dispositionest letempsdechargementdespages.Amliorer
les performances de son site permet donc d'amliorer son
rfrencementnaturel.
2/56
8/6/2019 Amliorez les performances de vos projets web
3/56
A qui sadresse ce livre blanc et comment l'utiliser ?
Ce livre blanc s'adresse l'ensemble des acteurs faisant face des
problmesdeperformancessurdesapplicationswebenproduction.
NOTE : les conseilsportentsur les architecturesLAMP (PHPMySQL)
mais la plupart s'appliquent aussi aux applications web de type
Java/J2EEouRuby.
Nous nous sommes fixs l'objectif de faireunguidequi soit lepluspratiqueetefficacepossible. Nous n'avons donc pas cherch citerl'ensemble des outils de diagnostic ni rpertorier l'ensemble des
solutions. Avec cet ouvrage vous devriez facilement comprendredansqueldomainerechercherunesolutionettrouvercettesolutiondanslaplupartdescas.
Il est rare que les performances d'un site (mme si c'est dommage)
soient
rellement
tudies
avec
attention
au
dmarrage
du
projet,
souventpourdesquestionsdebudget.Maisvouspouvezmalgrtout
utiliser cet ouvrage avant de mettre votre site en production. La
dmarcheestidentique.
Pourquoi ce livre blanc ?
De nombreux ouvrages ou articles expliquent des points prcis pour
amliorer les performances. Ils dtaillent par exemple comment
amliorer lesperformancesdePHP,commentparamtrerMySQLou
bien encore quelles sont les meilleures architectures techniques.
Pourtant,
rares
sont
ceux
qui
traitent
de
la
dmarche
d'ensemble
qu'il
faut suivrepour amliorer lesperformancesune fois l'applicationdploye.
Les performances de votre site dpendent troitement de votre
activitetde l'architecturetechniquequevousavezmiseenplace.Si
vousavezunsitequineprsentequedescontenus,lepoidsdespages
et la gestion du cache seront essentiels et ce qui concerne les
optimisations des bases de donnes ou du code n'auront pas ou peu
d'impacts pour vous. Cependant, toute la dmarche, l'outillage et de
nombreusessolutionspourrontvoustreutiles.
Heureusement,lesarchitecturesLAMPsontsuffisammentdiffuseset
classiques pour tre, dans la plupart des cas, correctement
dveloppes. Il est rare qu'une application soit structurellement
tellementmalconuequ'ilfaillereprendreleprojetdepuisledbut.
Enrevanche,peudesocitdisposent lafoisde l'exprienceetdes
connaissances permettant de solutionner ces problmes de
performance.Ilssonttroppeufrquentspourenfaireunespcialitet
les problmes rencontrs ont des solutions dans des domaines de
comptence trs diffrents (matriel, base de donnes,
dveloppementsetc.).
Mettre enplace un plan d'amlioration des performances exige de la
srnit. Ce qui est rarement le cas lorsque des problmes de
3/56
8/6/2019 Amliorez les performances de vos projets web
4/56
performance se posent. Cet ouvrage vise donc partagerl'exprience de The Coding Machine. Il indique les diffrentestapes permettant de conduire les diffrentes investigationsncessairesetprsentelessolutionsenvisageables.
A propos de The Coding Machine et des auteurs
The Coding Machine est une socit de services informatiques
spcialise dans les projets innovants. La multiplicit des projets sur
desarchitecturesPHPMySQLet l'intrtquenous leurportonsnous
incitentrgulirement publierdesarticlesdebloglorsquelesujetest
courtoucriredeslivresblancslorsquelesujetdevientplusvaste.
CelivreblancatcritparDavidNgrier,associdirecteurtechnique,
JeanGuillaumeDujardin,associgrantetKevinNguyen,managerdeprojetweb.
LesauteursdecetouvrageainsiquetoutelquipedeTCMsetiennent
videmment votre disposition si vous prouvez des difficults
mettreenplacecepland'actionsd'amliorationdesperformancesou
sivoussouhaiteznousfairepartd'unproblmequenousn'avonspas
trait (le sujet est vaste !), partager des lments de rflexion avec
nousoubientoutsimplementnousfairepartdevosremarques.
4/56
8/6/2019 Amliorez les performances de vos projets web
5/56
5/56
8/6/2019 Amliorez les performances de vos projets web
6/56
6/56
8/6/2019 Amliorez les performances de vos projets web
7/56
7/56
8/6/2019 Amliorez les performances de vos projets web
8/56
1.1 - Dmarche
1.1.1 - Introduction - Quelques rflexions pour bien
dmarrer...
1. Ne recevoiraucune chosepour vraie tant que son espritnel'auraclairementetdistinctementassimilpralablement.
2. Trierses difficults afin de mieux les examiner et lesrsoudre.
3. tablir un ordre depenses, en commenantpar lesplussimplesjusqu'auxpluscomplexesetdiverses,etainside lesretenirtoutesetenordre.
4. Passertoutesleschosesenrevueafindenerienomettre.Descartes,discoursdelamthode.
Toutescestapessont rigoureusement lesmmes lorsde lamiseen
placed'unpland'amliorationdesperformances:
1.nepasappliquerdesolutionsprconues:vousrisquezdeperdredu temps mettre en place une solution qui ne rsout pas votre
problme. La premire tape est de reproduire les conditions dans
lesquelles les performances se dgradent et d'identifier de manirecertaineleproblme.
2. commencer dans l'ordre : gnralement il y a un problmedominant. Ilnesertriendersoudrelespointssecondairesavant le
premier.Lesperformancessontsouventamlioresparlesactionsles
plussimples.Parexemple,s'ilyaunproblmesurl'accsdesdonnes,
onpeutobtenirunfacteur100entravaillantsurlesindexdelabasede
donnes tandis que changer les serveurs permettrait d'obtenir unfacteur4.
3.mettreenplace lessolutionsjusqu'aubout : dans laplupartdescas, il ne se pose pas un maisplusieursproblmes de performance.Vousdevez lesidentifieretlesrsoudreunparun.Vousvousrendrez
certainement compte que trouver une premire solution n'est que le
dbutdeladmarche.L'cueildanscecaslestdecroirequecen'tait
pas la bonne solution et de l'abandonner pour en chercher une autreplus"universelle".C'estuneerreur.Lesperformancess'amliorenten
accumulantlessolutions.
4.procderdemanire itrative : lesperformancesvonts'amlioreraprs ces premires actions, mais cela ne suffira peut tre pas. Il est
importantdemesurerleprogrsetd'itrer.
8/56
8/6/2019 Amliorez les performances de vos projets web
9/56
1.1.2 - Vue d'ensemble de la dmarche
1.CONSTATERLEPROBLEMEDEPERFORMANCE:Cette tape consiste chercher les premires pistes d'optimisation.
Elle
est
conduite
l'aide
des
outils
de
surveillance
de
la
production.
L'objectif est de trouver une orientation la recherche de solutions
dansundesquatredomainessuivants:
1. applicatif(ApachePHP)2. basededonnes3. rseau4. infrastructurematrielle
NOTE : dans les premires itrations de la dmarche, certaines
solutions sont videntes. Dans le cas d'un problme surune page ou
unefonctionnalitprcise,ilestsouventsimpled'identifierrapidement
d'o vient le problme. Aussi, si la solution est vidente, il suffit de
proposerunecorrectionetdepasserdirectementl'tape3.
2.REPRODUIRELEPROBLEMEETTROUVERUNESOLUTION:Ladeuximetapeconsistereproduirelesconditionsdanslesquelles
lesperformancessedgradent.Celapermettradetravaillerbeaucoup
plus rapidement sur le problme, et parfois mme sans solliciter
lenvironnementdeproduction.
Une fois que les conditions dans lesquelles les performances ne sont
pasbonnessontidentifies,ilconvientdemettreenuvreetdetester
lesdiffrentessolutions.
3.MISEENPRODUCTIONETMESUREDELIMPACTDeuxlmentsperturbentlamesureexactedel'optimisationapporte
:
1. les diffrences entre les environnements : pour des raisonsconomiques, il est rare d'avoir un environnement de pr
productionparfaitementidentiqueceluideproduction;
2. lesconditionsdanslesquelleslesperformancessedgradent:il est parfois impossible ou trop coteux de reproduire ces
conditions.Parexemple,silesperformancessedgradentlors
dunpicd'audience,reproduirel'accsauservicedenombreux
utilisateurssimultanmentpeuttrecomplexe.
Aussi, dans bien des cas, la seule mesure valable est faite sur
l'environnement de production. C'est pour cela que mettre en place
une dmarche pralable a beaucoup d'importance. Elle permet de
9/56
8/6/2019 Amliorez les performances de vos projets web
10/56
rduire le risque etde rduire le temps ncessaire la miseen place
desdispositifsd'optimisation.
10/56
8/6/2019 Amliorez les performances de vos projets web
11/56
1.2 - Etablir les premires pistes
d'optimisations
1.2.1 - Ressources touches
Un projet est un assemblage de plusieurs ressources matrielles et
logicielles.Aussi,soumiseunefortecharge,unedecesressourcesest
susceptible de limiter la performance de l'ensemble. Les outils de
surveillance des infrastructures de production permettentde
dterminer quelle ressource est lie la dgradation des
performances.
Parmilesressourcesmatrielles,ilya:
1. CPU;2. RAM;3. BandePassante;4. DisquesDurs.
Parmilesressourceslogicielles,onpeutciter:1. Nombredefichiersouverts;2. Nombredecursutiliss;3. Nombredeconnexionslabasededonnes.
Afind'tablirdespistesdesolutionstudier, ilconvientdemesurer
l'utilisation des diffrentes ressources cites cidessus afin de
dterminer quelles sont celles qui sont exploites de manire trop
intense.
Ces mesuresserventaussicomprendre sousquelles conditions et
quels moments les performances sont moins bonnes. De nombreux
outils permettent d'effectuer ces mesures. Ils sont dcrit dans les
paragraphessuivants.
NOTE : il ne faut pas croire que la libration de la ressource la plus
sollicite permetncessairementd'amliorerdemanirespectaculaire
la performance de l'ensemble. Bien souvent, produire une premire
optimisationvaconduiretrouverqu'uneautreressourceestsature
sontour.C'estpourquoiladmarcheestitrative.
NOTE : dans cette dmarche il faut respecter un certain ordre. Lesressourcesmatriellesdoiventsystmatiquementtreanalysesavant
les
ressources
logicielles
(mais
cela
ne
signifie
pas
que
les
solutions
sont ncessairement matrielles). Par exemple, il faut sassurer que
lutilisationduCPUparlabasededonnesnestpascritiqueavantde
sepenchersurlaconfigurationdunombredeconnexionslabasede
donnes.
BON A SAVOIR : LedisquedurdoittreanalysaprslaRAMenraison
duphnomnedeSWAPquifaitporterlexcdentdemmoireutiliseparledisquedurlorsquelaRAMdisponibleestinsuffisante.
11/56
8/6/2019 Amliorez les performances de vos projets web
12/56
1.2.2 - Etablir les premires pistes d'optimisations - les
outils serveur
Si vous savez quel moment prcis se produisent les problmes de
performance,vouspourrezutiliserdesoutilsdemesuretempsrel.Ces outils sont pour la plupart utiliss en ligne de commande sous
Linux.
1.TOP
La commande TOP est loutil de monitoring des systmes linux parexcellence.TOPproduitunelistedesprocessus actifsduserveur,etdtaille leur consommation de temps processeur (CPU) et demmoire(RAM).Ilindiquegalementlachargemoyennedusystmesur troispriodes :1minute, 5minutes et15minutes.Sicetoutilne
permetpasdeconnatredirectement l'origineduproblme,cechiffre
aideconfirmers'ils'agitd'unpicd'activitoubiensi lamachineest
saturedepuisuncertaintemps.
NOTE : Il est noterque TOP a t pens de manire ne pas faire
parti luimme des processus le plus consommateurs de ressources
quilmesure.
BON A SAVOIR : TOP est un outil extrmement utile. Il permet
didentifier les problmes les plus vidents sur la consommation de
RAMetdeCPU.Enrevanche,ilestpossiblequeTOPnedtecteaucun
problmeapparent,alorsquevotremachineestbelleetbienralentie.
Celaseproduitnotammentsileproblmesesitueauniveaudesaccs
disque,ouencoreauniveaudesressourceslogicielles.
2.IOSTATS
La commande IOSTATS est utilise pour contrler la charge despriphriques entre/sortie en observant leur temps dactivit parrapport leur taux de transfert. Cette commande est souvent utile
pourharmoniser lachargelecture/critureentrelesdiffrentsdisques
durs.
3.IOTOP
Si laccs en lecture/criture de votre disque est satur (par exemple
trop de requtes INSERT, UPDATE ou DELETE peuvent surcharger
votredisqueencriture),lacommandeTOPpeutsavrerinsuffisante
comme expos cidessus. IOTOP prsente, de la mme manire que
TOP, lesprocessusquiconsomment leplusde lectureetdcrituresurvotresystme.
4.DSTAT
DSTATestunoutildemesuretransversal.AlorsqueTOPsespcialise
danslactivitCPUetIOTOPdanslesaccsdisques,DSTATpermetde
surveiller lactivit sur le serveur de manire transverse. Lutilisateur
peut dcider dafficher des indicateurs tels que lactivit CPU,lactivitdesdisques,lactivitrseau,etcctecte.
12/56
8/6/2019 Amliorez les performances de vos projets web
13/56
8/6/2019 Amliorez les performances de vos projets web
14/56
1.2.3 - Les outils de monitoring
Si vous ne pouvez pas prvoir loccurrence des problmes de
performance,ilseraplussimpledeseservirdoutilsdemonitoringafin
depouvoiraccderlhistorique desmesuresdevosressources.
1.MUNIN
Muninpermetdesurveiller lesdiffrentesressourcesdevosserveurs.
Un client est install sur chacune des machines, et les donnes
mesuressontagrgesintervallergulierversunemachinecentrale
(oleserveurMuninsetrouve),etprsentessousformegraphique.
Munin permet, dans son installation la plus simple, de surveiller
lutilisation du disque, de la RAM, du CPU et du rseau. Cet outil est
OpenSource etilexistedenombreuxpluginspermettantdemesurerdautresressources,tellesque:
1.
Les
temps
de
rponse
(http
response
times)
;
2. La consommation CPU pour une slection de processus(multimemoryplugin);
3. Taux dutilisation des connections MYSQL(mysql_connections)...
BON A SAVOIR :LagranularitminimaledeMunin(intervalledetemps
entre deux mesures) est de 5 minutes. Si vous faites face des
problmesdeperformancelorsdepicsdechargetrscourts(de515
minutes), Munin peut savrer insuffisant pour vous apporter des
informationssuffisammentdtailles.
2.NAGIOS
Nagiosestunoutildesurveillancedeserveurs.ContrairementMunin,
Nagios nest pas un outil de mesure de lactivit. Il est utilis
uniquementpourremonterdesalertes.Extensibleavecdesplugins, il
peutremonterdesalertescomme:1. ActivitCPUtropimportante;2. Indisponibilitduserveurweb;3. RAMinsuffisante;4. Tempsderponsesdgrads...
Lorsquune alerte est remonte, l'outil peut tre paramtr pour
prendre des actions, comme envoyer un mail dalerte aux
administrateurs,ouencoreenvoyerdesSMS.
NOTE : Si les problmes de performance se produisent de manirealatoire et non reproductible, Nagios peut tre utilis pour vous
alerter des problmes rencontrs. Vous pourrez alors vous connecter
au serveur pour effectuer des mesures plus approfondies en temps
rel.
3.AUTRESOUTILS
D'autres outils vous permettent de connatre l'activit de votreinfrastructure. Par exemple, un outil de web analytics permet de
connatre approximativement le nombre de visiteurs sur votre
plateforme.
14/56
8/6/2019 Amliorez les performances de vos projets web
15/56
D'autresoutils(mergents)vouspermettentd'avoirunevisionencore
plusprcisedevotreactivit.ParexempleCollectd(http://collectd.org)permetdedescendresouslabarredes5minutesimposeparMunin.
1.2.4 - Etablir des premires pistes en fonction des
ressources
1.CPU/RAM
SilapistesorienteversuneactivitcritiquedelaRAMouduCPU,cest
probablement parce que la commande TOP aura indiqu que lesprocessus apache (PHP) ou mysqld (BDD Mysql) consomment une
quantit trop importante de ces ressources. Selon le processus
concern,ilfaudraalorsidentifierplusprcismentlaoulescausesde
cetteactivittropimportante:APACHE/PHP :sivotreproblmeseposesurunepageenparticulier
(sauflapaged'accueilolesproblmessontsouventlisaunombrede
connexions simultanes), il est utile danalyser le code excut par
celleci pour dceler un potentiel dfaut. Si, au contraire il sagit de
lensemble de lapplication, cest certainement d un trop grand
nombre dutilisateurs. Il est alors intressant de mettre en place des
mises en cache (ct serveur et ct client) ou des traitements
asynchrones afin de limiter lengorgement lors dun afflux trop
important.
MYSQL :Untrsgrandepartiedesproblmesdeperformancelis
labasededonnespeuttrersolueenutilisantlesindexadquatsou
en mutualisant les requtes. Avant cela, il faut systmatiquement
tablir
une
liste
dtaillant
la
fois
la
frquence
de
la
requte
(ou
du
typederequte)etlecotdecetterequte.AUTRE PROCESSUS :Vouspourriezconstaterviatopquunautre
processus de votre serveur occupe la totalit de votre temps
processeur.Ilestalorsimportantdidentifierlecoupable.Sivousavez
installdautresservicessurvotreserveur,lundentreeuxpourraittre
lecoupable.Parexemple,unproblmesurunserveurdemailouune
base de donnes fulltext, etc pourrait dclencher cette
consommationCPUquiralentiraitvotreserveur.
Si vous ne connaissez pas le nom du processus, nhsitez pas vous
aider dune recherche sur Google pour en apprendre plus. Et si vous
tes persuads de navoir jamais install le processus incrimin,
investiguez!Votreserveurapeuttretpirat.Cestcertainementle
cas si vous laissez un accs SSH disponible depuis Internet avec des
motsdepassestropsimples.Noubliezpasquunhackernapasbesoin
des accs root pour installer et excuter ses programmes. Un
simpleaccsutilisateursuffit. Ilpeutalorstransformervotremachine
en serveur de fichiers ou bot, et les processus que vous voyez dans
topsontcoupsrnfastes.Tirezvue!
2.BANDEPASSANTE
Pourobtenirunepremirepisted'optimisation,vousdevezrechercher
leouleslmentsquiconsommentdelabandepassante.Parexemple,
une page qui renvoie une vido de 100 mo peut dgrader les
performancesdevotresitewebsielleestappeledenombreusesfois.
15/56
8/6/2019 Amliorez les performances de vos projets web
16/56
APACHE : La premire piste examiner sont les logs Apache afin
d'observer combien consomme chaque requte et rechercher quelssontlespagesoulesfichiersvolumineux.Eneffet,leslogsApachesont
assez flexibles et il est possible de les configurer pour afficher la
quantitdedonnesenvoyeschaquerequte.
NOTE : Lorsquon mesure la bande passante du serveur, il est
importantdegarderlespritqueleserveurnestpasleseulsaturer.
VotreconnexioninternetADSLsatureracertainementavant.SiIOStat
ne montre pas de surconsommation rseau, la raison dun affichagelentpourraittrevotreconnexioninternet,ounimportequellment
rseauentrevotreclientetvotreserveur.
4.DISQUEDUR
Vos consommations de RAM et de CPU semblent normales et votre
bandepassantenestpassature.Ilyadegrandeschancesquevotre
disque dur soit le facteur limitant. A moins que votre applicationneffectue un trs grand nombre de lecture/criture sur le disque
(ouvertureetmodificationdefichiers,crationdedocuments,etc),ilest probable que MYSQL soit responsable. En effet, les requtes
MySQLSELECTpeuvent provoquerdesaccsdisqueen lecture (si le
rsultat de cette requte nest pas en cache), et les autres types de
requtes (INSERT, UPDATE, DELETE) font systmatiquement des
accsencriture.
5.AUCUNDECESPOINTSNESEMBLECRITIQUE?
Lesystmepeuttrebridparsesressourceslogiciellesoupardes
latencesrseau.
Quelques pistes : nombre de threads MySQL, Nombre de fichiers
ouvertssimultanment.
16/56
8/6/2019 Amliorez les performances de vos projets web
17/56
1.3 - Reproduire le problme &
tablir le diagnostic
1.3.1 - Reproduire les problmes de performance
Reproduire les conditions dans lesquelles les performances se
dgradentestdeplusenplusduraufuretmesurequel'oneffectue
des optimisations. Or, savoir si l'on fait le bon scnario de test est
presque aussi importantque de faire la bonne optimisation (cellequi
nous permettra vraiment d'amliorer les performances sur
l'environnement de production). L'objectif est donc de simuler le
fonctionnement de votre site web sur un seul des aspect (base de
donnes,accsdisqueetc.).
1.ABabestunoutildvaluationdesperformancesdevotreserveurweb.Ilindique le nombre de requtespar secondeque votreapplication est
capabledeprendreencharge.Lesdeuxparamtresprincipauxsontle
nombrederequtessimultanesainsiquelenombretotalderequtes
effectuer.
BON A SAVOIR : BienquilsoitpossibledutiliserdautresparamtrespourpasserdesvaleursPOST,descookies,etc.cetoutilnestpasfait
pour simuler efficacement lactivit dun ou plusieurs utilisateurs qui
naviguent sur votre site, mais plutt pour simuler larrive massive
dutilisateurs
sur
une
page.
En
effet,
ab
nintgre
pas
de
notion
de
scnario,carilnepeuttesterquuneseuleURLlafois.
2.JMETER
Jmeter est une application que l'on peut dployer sur un poste de
travail (il vaut mieux qu'il soit ddi afin que le dveloppeur qui s'en
sert puisse travailler pendant les runs de tests). C'est un outil qui
permetdesimulerungrandnombrederequtesconcurrentesHTTPet
donc de simuler le comportement du site avec un grand nombre de
visiteurs.L'outilproduitunesynthsegraphiquedesrsultatsdutest.
NOTE : Dans le cas d'une architecture LAMP, l'outil ne prsente
d'intrtquepourlesrequtesHTTP.Enrevanche,ilpermetdetesterbeaucoup d'autres lments annexes (Serveurs de mails, connexion
JDBC,etc.).
BON A SAVOIR : Jmeter n'mule pas compltement un navigateur
(contrairementunoutilcommeslnium).Ilestdoncplusdifficilede
crerunjeudetestsquisoitreprsentatifducomportement exactde
l'application.
3.SELENIUMGRID(REPRODUCTIONDESCENARIO)
Selenium est une boite outils permettant de raliser des tests ensimulant lactivit dun ou de plusieurs utilisateurs sur un site web.
GrceunpluginFirefox,vousavez lapossibilitdenregistrerun
17/56
8/6/2019 Amliorez les performances de vos projets web
18/56
scnario en naviguant sur le site, puis de le rejouer volont, en
vrifiantquelaffichagedespagesestconformeauxattentes.SeleniumGridvouspermetdesimulerunemonteenchargedevotre
application enjouant plusieurs fois le mme scnario en parallle. Si
vousdisposezdesuffisammentderessources, ilvousserapossiblede
reproduirelesproblmesdeperformance.
4.BATCHSDEREQUTESSQL
Obtenir la liste des toutes les requtes faites la base de donnespendant lexcution dun scnario reprsentatif, puis le rejouer vous
permettra de simuler limpact de lapplication sur la charge de votreserveurdedonnes.
Pourfairecela,vouspouvezsoitcriredansunjournallesrequtesau
niveau de lapplicatif, soit configurer MySql pour tracer toutes les
requtes(paramtrelogdevotrefichiermy.inioumy.cnf).
Vous avez la possibilit de rejouer ce batch de faon unitaire pour
mesurerlegaindeperformancegrce vosoptimisations,maisaussidelancerplusieursbatchsenparalllepoursimulerunpicactivit.
1.3.2 - Etablir le diagnostic
Comme expliqu auparavant, la solution est parfois vidente, il nest
parfoispasncessairedepousserplusloinlanalysedevotreproblme.
En revanche, dans certains cas il faut prciser le diagnostic afin
dappliquerlacorrectionapproprie.
Danscecas, ilexistedesoutilsetdesdmarchessimplespermettant
dinvestiguerplusenprofondeurlutilisationdesressources:
1.LOGSAPACHE
SYMPTOMES :Votresiterpondcorrectemententempsnormal,mais
lestempsderponsesedgradentsouslacharge.
Les logsApachetracenttoutes lesrequtesfaitesauserveurapache.
En lesconfigurantcorrectement,vousaurez lapossibilitdobtenir le
temps de rponse de votre site. En utilisant des outils de parsing
appropris (AWStats, Visitors, ou WebLogExpert), vous pourrez
facilement visualiser le comportement de votre site en fonction du
nombredutilisateursconnects.
2.LOGSMYSQL(DONTSLOWQUERIES)
SYMPTOMES : MySQL consomme normment de CPU ou le disque
dursature.
Les logs MySQL retracent l'activit de votre serveur de donnes. Le
journal de log simple (celui configur par dfaut) pourra vous
renseignersurlastabilitduserveurMySQL.Lefichierdeslowqueries(ilestparfoisncessairedeconfigurercelog)
listel'ensembledesrequtesdontladured'excutionestsuprieure
unseuildonn(luiaussiconfigurable).
18/56
8/6/2019 Amliorez les performances de vos projets web
19/56
Les requtes contenues dans ce fichier seront donc celles qui
mobilisent le plus le serveur, et donc souvent celles qui devront treoptimises.
Exemple de configuration du log slow queries (dans le fichier de
configurationMySQL):[mysqld]
port=3306
log_slow_queries = 1
long_query_time = [seuil]
log-slow-queries = [chemin vers le fichier de log]
3.ANALYSE/PARSINGDECODEXDEBUG
SYMPTOMES :PHPconsommenormmentdeCPU.
La fonctionProfilerdeXdebug estunoutilquipermetd'analyser les
tempsd'excutiondevotrecodePHP.Ilpermetdesavoircombiende
temps est pass dans chacune des fonctions du code, et donc de
dterminerquellepartiedecodeestmoinsperformante.
4.MYSQLTUNER
MysqlTunerestunscriptcritenPerlquivouspermetd'prouveruneinstallationMySQLrapidementetdefairedesrecommandationspour
amliorer les performances et la stabilit de la base de donnes. Il
produitunrapportdtaillant:
lespossibilitsoffertesparlaconfigurationencours; des mtriques telles que le nombre dejointures effectues
sans
index,
hit
ratio
du
cache,
...
des recommandations la fois sur la manire d'excuter lesrequtes,etsurlesparamtresdeconfigurationmodifier.
5.AUDITDELASTRUCTUREDELABDD
La structure de la base de donnes influence fortement ses
performances. Ainsi, il faut sassurer que vos tables contiennent les
indexappropris,quelesclstrangressontenplace.
Vrifiez aussi que les triggers ventuels ne nuisent pas aux
performances: si chaque insert dans une table implique lxecution
dunscriptcomplexe,ilvaudramieuxmettreenplacedesbatchsSQL
asynchrones(quandcestpossiblebiensr).
BON A SAVOIR : si les bonnes pratiques en matire de structurerelationnelle des bases de donnes recommandent le respect des
normes (on parle de base de donnes norme), la complexit derelationentrelesdiffrentestablespeutnuireauxperformances.Ilfaut
toujourspartirdunebasenormalise,celleci tantbien plus facile
maintenir. En cas de problme de performance, on effectuera une
dnormalisationaucasparcas.
6.RSEAUINTERNE/RSEAUEXTERNE
Sivousavezsparvotreserveurapplicatifetvotrebasededonnes,assurezvous au pralable que votre bande passante nest pas
consommeprincipalementeninterne.Eneffet,sivouseffectuezune
19/56
8/6/2019 Amliorez les performances de vos projets web
20/56
8/6/2019 Amliorez les performances de vos projets web
21/56
21/56
8/6/2019 Amliorez les performances de vos projets web
22/56
Sivousdisposezdunsiteinternetforttraficoudunserveuravecune
faible bande passante, vous pouvez apporter des optimisationsconsistantrduirelefluxquitransiteentrelesiteetlenavigateurdu
visiteur.Pourcela,ilestpossible:
dutiliserdessystmesdecache; d'viterd'envoyeroudedporterlenvoidefichiers; ou encore de rduire la taille et le nombre des fichiers
changs.
PRECISION SUR LES DIFFERENTS TEMPS DATTENTE :
Avantdecommencer,ilfautdiffrencier2typesdattentediffrents:
letempsdeconnexion etletempsdelatence.
UnnavigateurInternetdoitrecevoirl'ensembleducodeHTML(DOM)
duserveuravantdepouvoirafficherlecontenu.Pourchaquelment,
contenu,image,vidoetc.,lenavigateurseconnecteauserveurgrce
au protocole TCP/IP. Ce processus prend en moyenne 70ms pour un
serveur
proche
et
peut
aller
plus
de
300ms
pour
le
rseau
mobile.
Cestletempsdeconnexion.
Acela, ilfautajouter le tempsde latenceduserveurquinerpondra
pas toujours instantanment car il traite les demandes dans l'ordre
d'arrive.
Cestempssontirrductibles.Aussi,lesnavigateursrcentstablissent
simultanment plusieurs connexions avec le serveur. Ceci permet de
parallliserlestempsd'attente.
Sur unepage HTML classique, 70% du temps d'affichage n'est pas le
temps de tlchargement, mais le temps ncessaire la connexion
auquelsajouteletempsdelatence,lameilleuredesoptimisationsest
doncderduirelenombrederequtesauserveur.
BON A SAVOIR : Il est possible, si vous avez une architecture
comprenant plusieurs serveurs, que les dialogues entre ces derniers
impactentvosperformances.Mmesicecasesttrspeuprobable, il
est bon de s'en souvenir si vous ne trouvez pas d'o viennent vos
problmes de performances, notammentsi les serveurs sont distants
physiquement.
22/56
8/6/2019 Amliorez les performances de vos projets web
23/56
8/6/2019 Amliorez les performances de vos projets web
24/56
Achaquemodificationdunfichier,onenchangelenom:style.1.0.css
devientstyle.1.1.css. Ilestaussipossibledemodifier lURLdappelenpassantunparamtrefictif:style.css?c=1devientstyle.css?c=2.
BON A SAVOIR :Ceprocdesttrsperformantaprslechargement
de la premire page qui ne peut bnficier du cache. De plus, il fautprivilgierlarutilisationdesressourcesdanslesdiffrentespages.Par
exemple:UtiliserdanstouteslespagesunmmeetuniquefichierCSS.
24/56
8/6/2019 Amliorez les performances de vos projets web
25/56
2.2 - Rduire le nombre des
fichiers
SYMPTOMES : Vous voyez dans Firebug quun grand nombre de
fichiers sont chargs par page et que le temps daffichage de votre
pageestprincipalementdutempsdelatence.
2.2.1 - Limiter le nombre de fichiers CSS et JS
IlestpossiblederegrouperlesfichiersCSSouJSenunseul.Plusieurs
outilsenligneoffrentceservice.
BON A SAVOIR :Cependant,sivousutilisezunframeworkouunCMS,
vrifiezqueceluicineproposepasunmoded'agrgation.
2.2.2 - Regrouper les images - Sprite
Il s'agit ici de regrouper les images du thme qui sont couramment
utilises en une seule. Cette technique s'appelle "Sprite". L'avantage
estden'utiliserqu'unnombrerduitd'images.Enrevanche, ilfaudra,
via une feuille de style, afficher l'image en background et la
positionner.
NOTE :Idalementunepagedevotresiteseracompose:
1feuilledestylecss 1feuilledejavascriptjs 36imagespourlethme Leslmentsdynamiquesetspcifiquesdelapage.
25/56
8/6/2019 Amliorez les performances de vos projets web
26/56
2.3 - Rduire la taille
des fichiers
SYMPTOMES : La bande passante de votre site est sature, ou le
premierchargementdespagesestlentpourlesvisiteurs.
2.3.1 - Rduire la taille des images
Si vous avez des images qui ne font pas partie intgrante du thme,
vousdevezlesrduireaumaximum,viterdechargerdesimagestrop
grandes(doncd'unpoidsimportant).Ilestprfrabledelesrduireou
d'utiliserdesmcanismesautomatiquesdemisel'chelle.Uneimage
nedevraitjamaisdpasser500ko(saufexception).
BON A SAVOIR :Unoutilen lignepermetdecompresserunpeuplus
vos imagessansdtriorer laqualit.N'hsitezpas l'utilisersurvos
imagesavantdelesmettreenligne:
http://www.smushit.com/ysmush.it/
NOTE : Vous trouverez facilement sur le web de nombreux articles
traitantcethme(Gifvs.PNG,PNG8etc.).
2.3.2 - Limiter le poids des fichiers - Compression Gzip
Les fichiers Html, Css et Javascript sont des fichiers texte et donc
particulirementadaptsunecompressionZIPimportante.Letempsncessaire cette dcompression est ngligeable pour le visiteur. En
rduisant les flux envoys aux utilisateurs, vous raliserez une
conomiedebandepassante.
BON A SAVOIR : Ce gain de bande passante s'effectue au dtriment
dune consommation accrue de CPU (la compression utilise de la
puissanceserveur).
2.3.3 - Limiter le poids des fichiers - Minimify
Une autre possibilit pour limiter le poids de vos fichiers CSS et
JavaScriptestdelesminimiser.Laminimisationsupprimelesretourslaligne, lestabulations ainsique lescommentaires.La lecturedeces
fichiers devient donc quasiment impossible, mais ce nest pas un
problmeenproduction.
BON A SAVOIR : La plupart des bibliothques Javascript sont
disponibles en version "minimis". Elles sont donc plus rapides
charger.
Parexemple,laversion1.4.4mindejQuerypse76.6Kotandisquela
versionnormale(dedveloppement)pse178Ko.
26/56
http://www.smushit.com/ysmush.it/http://www.smushit.com/ysmush.it/http://www.smushit.com/ysmush.it/8/6/2019 Amliorez les performances de vos projets web
27/56
2.4 - Dporter des ressourcesSYMPTOMES : Vous avez effectu toutes les modifications
prcdentes,maisqueletempsdaffichagedevotrepageesttoujours
longetque laugmentation de labandepassantedevotreserveurest
impossible,vouspouvezutiliserunesolutionmultiserveurs.
2.4.1 - Multi-sites
Dployer son site sur plusieurs noms de domaine (ou sous domaine)
permet l'utilisateur de charger plusieurs fichiers simultanment sur
plusieurs serveurs. En effet, le navigateur ouvre un nombre de
connexiondfiniparnomdedomaine.Ainsiavec2serveursonouvre2
foisplusdeconnexion.
Le nombre de connexions simultanes ouvertes dpend de votrenavigateur.InternetExplorer6nouvreque2connexionssimultanes,
loFirefox3enouvre8.
Sivotrepagecontientunevingtainedimages / fichiersCSS / fichiers
Javascript, sous Internet Explorer 6, elles seront rparties sur 2
connexionsseulementsoit10 ressources charges en srieet non en
parallle.
Enrpartissantlesressourcessur2nomsdedomainediffrents,ilest
possible que le navigateur ouvrejusqu' 4 connexions (ou 16 pourFireFox).Doncdeuxfoisplusrapidespourchargerlapage.
Pour autant, il ne faut pas non plus tomber dans lexcs inverse en
possdant un grand nombre de domaine. Tout accs un nouveau
domaine entraine des temps de recherche au DNS (Domain Name
Serveur, Serveur de nom de domaine, temps de recherche duserveur). Que le serveur soit le mme ou non, ce temps sera
incompressible.Deplus, lefaitdemultiplier lenomdedomainepeut
entrainer une complexit de maintenance. Il est donc important decalibrerlerapportnombrederessource/nombrededomaine.
2.4.2 - Externaliser les ressources - CDN (Content
Delivery Network)
Si labandepassanteestsature, leCDNpermetdestockerunepage
complte pour la restituer lutilisateur le plus rapidement possible
sanspasserparleserveurweb.Cestunesortedecachedportdonc
qui ne charge pas le serveur principal. Deux outils open source se
dmarquent:Varnish&Squid
Un service plus volu permet de golocaliser les destinataires ce
systme repose sur un mcanisme de routage afin dutiliser les
serveurs les plus proches pour lui fournir les donnes de la page
dontilabesoin.Akamaiestleleaderdumarch.
NOTE : Google offre une sorte de CDN (en offrant une URL pour le
tlchargementdesbibliothquesJavaScriptstandard).Cettesolution
estunpeuanecdotique.
2.4.3 - Esi (Edge Site Includes)
27/56
8/6/2019 Amliorez les performances de vos projets web
28/56
Norme maintenue par le consortium W3C. Elle permet dereconstituer une page web grce des balises dans la page qui
offrent la possibilit de charger la partie statique directement du
serveurCDNetlapartiedynamiqueduserveurweb.
Exemple:Sivotresitepossdeunepageo lutilisateursera identifi
avecsonnom,ilvousestimpossibledelastockerdansleCDNcarelle
seradiffrentepourtouslesutilisateurs.LESIpermetdidentifiercette
zonegnredynamiquement pourstockerlensembleducontenude
lapage sauf lenomutilisateur.Cedernier sera rcupr directementdu serveur web par le CDN qui lagrgera dans la page envoye au
client.
28/56
8/6/2019 Amliorez les performances de vos projets web
29/56
2.5 - Dernires techniquesSYMPTOMES : Votre serveur rpond bien mais vous cherchez
optimiserletempsdaffichagedelapagepouraugmenterlaractivit
peruedusiteparvosvisiteurs.
2.5.1 - Chronologie de chargement
Cest une chose gnralement connue, mais dont les dtails et les
implications ne sont pas toujours bien mesurs : une page web est
constituedenombreuxcomposants,quisontchargslesunsaprsles
autresparlenavigateur.
Il faut sassurer que la page peut tre consulte de manire
confortable, mme si le temps de chargement est long. L'ide est
d'ordonner le tlchargement des lments en fonction de leurimportancepourl'utilisateur.Parexemple,lesbibliothquesJavascript
peuventtremisesenbasdepage.
NOTE : cette optimisation ne concerne pas directement les
performances mais a un vrai impact sur l'impression de vitesse pour
l'utilisateur.
2.5.2 Page speed, module Apache
Google fournit un module Apache nomm Page speed permettant
dacclrer la transaction serveurclient. Cet outil permet d'appliquer
un certain nombre de filtres sur les pages HTML, les fichiers CSS et
JavaScript, les images PNG et JPEG. Ces filtres permettent
d'automatiser de nombreuses optimisations sans avoir a parcourir
l'ensembleducodeduprojet.Lesgainsenperformancepeuventtre
trsimportantssurcertainssites.
BON A SAVOIR : L'outil peut tre trs consommateur des ressources
serveurs (processeur et mmoire). Il est donc prfrable de faire trs
attentionenutilisantcettesolution.
2.5.3 - Prcision sur les solutions prsentes
Ilexisteencored'autresmthodespouroptimiser lagestiondevotre
bandepassantecommeouvrirdesconnexionspersistantes,utiliserdes
balises meta HTML pour inclure des ressources directement dans le
codeHTML...Maiscellescipeuventdevenirrapidementcompliques
mettre en place. C'est pourquoi il faudra d'abord privilgier les
techniquesproposes dans les autres partiesavantde lesprendreen
considration.
29/56
8/6/2019 Amliorez les performances de vos projets web
30/56
30/56
8/6/2019 Amliorez les performances de vos projets web
31/56
3.1 Stocker les calculs en cache
SYMPTOMES :VotreserveurPHPouMySQLestsatur.Leprocesseur
estutilis100%,oudanslecasdelabaseMySQL,ledisquesature.
3.1.1 - Envoi sans calcul - cache spcifique
Silestempsdecalculd'unlmentdelapagesontimportantsetque
l'lmentchangepeu,ilestintressantdelesauvegardertelquelpour
lerestituerrapidementetsoulagerleprocesseur.
Parexemple,danslecasdestatistiquessimples(nombredutilisateurs
inscrits, etc), il peut tre intressant de stocker les statistiques en
cache.Danslecasdegraphiquescomplexes,ilpeuttreintressantdestockerl'image,gnreparlecodePHP,pouruneduredtermine
pluttquedereffectuerlescalculspourchaqueutilisateur.
3.1.2 - Memcache
Memcache est un systme de cache pour stocker les lments qui
concernent lasessiondesutilisateurs,desrsultatsderequtesetc. Il
permet dviter dutiliserdes ressources duserveurafin quil rponde
plusrapidement.Performant,ilpeutstockernimportequelobjetPHP
srialisable, et peut tre partag entre plusieurs serveurs dans le cas
dunearchitectureavecloadbalancing.
VouspouvezutiliserMemcachepourstockerdesrsultatsderequtes
SQLcoteuses,desstatistiques,etc
3.2 - Configuration PHP
ApacheSYMPTOMES : Les processus Apache / PHP utilisent la totalit des
ressourcesprocesseur.
3.2.1 - APC - Cache PHP
Tout comme Memcache, APC (pour Alternative PHP Cache) est un
systmedecache,maisladiffrencedeMemcache,APCestcapable
demettreencachelesopcodes.QuandunscriptPHPestexcut,il
estd'abordcompileninterneparPHP.PHPnestockepaslersultat
compil du script et donc, la prochaine excution du script, PHP le
recompilera.
APCestconupourstocker lersultatcompildanssoncache.Ainsi,
lorsque PHP excute le script, APC lui servira directement le script
compil.PHPn'aurapasbesoinderecompilerlescriptetconomisera
doncbeaucoupdetemps.
31/56
8/6/2019 Amliorez les performances de vos projets web
32/56
La simple installation dAPC peut diviser la charge des processusApache/PHPpar2ou3.Nhsitezdoncpaslutiliser!VouspouvezgalementutiliserAPCcommeuncacheclassique,mais
ladiffrencedeMemcache,APCnefonctionnequesurunserveur.
Dansdesenvironnementscomplexes,les2existerontctecte:APC
pourmettreencachelesopcodes,etMemcachepourmettreencache
lescalculs/requtes.
3.2.2 - Autres paramtrages Apache - PHP
SYMPTOMES : Le nombre de connexions simultans en pic est trs
important.LesprocessusApachesaturent,certainsclientsnereoivent
paslespageswebquandletraficestlev.
Apache permet de configurer le nombre de connexions simultanesquilpeutouvrir(c'estdirelenombrederequtesclientauxquellesil
peut
rpondre
simultanment).
Danslaplupartdesinstallations,vousutiliserezlesmodulesWorkerou
Prefork. Les installations LAMP classiques utilisent par dfaut le
modulePreforkmais il fautsavoirquedautressolutionsexistent.De
rputation, prefork serait plus stable et workers plus scalable. Quoi
quil en soit, chaque module MPM (que ce soit Prefork ou Worker)
utilisent des paramtres qu'il convient d'examiner car ils ne
conviennentpasforcmentdessitesayantunefortefrquentation.
Cesparamtrespeuventbridervotreapplication.
BON A SAVOIR : dans lejournal Apache, vous verrez facilement si le
MaxClientsestatteint.
NOTE :IlexistedesalternativesauserveurwebApache.Laplusconnue
est LightHTTPD. Ce serveur web est rput plus performant. Mais
avant de considrer cette option, sachez que la communaut
travaillant sous Apache est bien plus vaste, et que les gains en
performancenesontpastoujourssensibles.
32/56
8/6/2019 Amliorez les performances de vos projets web
33/56
3.3 - Limiter la consommation de
RAM/CPU
3.3.1 - FileHandlers et ResultSets
SYMPTOMES :VosressourcesRAMetCPUpeuventtreconsommes
par lapplicatif (PHP) en temps de calcul, ou par la base de donnes.
Dans le cas o vous avez diagnostiqu quil sagit dune
surconsommationdecesressourcesparleprocessusApache(https),il
sera ncessaire de passer en revue le code de lapplication et sa
configuration.
PHP, comme JAVA ou la plupart des langages de programmation
rcents grent automatiquement la libration des ressources qui ne
sont plus utilises (gre par le garbage collector). Nanmoins, les
FileHandlerset lesResultSetsdoivent imprativementtrefermsde
faon explicite, car ils ne sont pas pris en compte par le garbage
collector.
Ainsi,sivotreapplicationeffectuedeslectures/crituresurdesfichiers,
noubliezpasquechaquepointeurdefichiercrdoittreferm:$fh = fopen($filename, 'r');
while(!feof($fh)){
//...
}
fclose($fh);
Dautre part, si vous nutilisez pas de framework ORM qui gre lui
mmelarcuprationdesdonnes,veillezfermerlesResultSetsqui
onttouverts:$rSet =mysql_query("SELECT * FROM users");
while ($user=mysql_fetch_object($rSet)){
//...
}
mysql_freeresult($rSet);
3.3.2 - Autoload
SYMPTOMES :LaconsommationprocesseurdevosprocessusPHPest
tropleve.
Cette fonctionnalit permet de trouver une classe si elle na pas t
identifiedanslecontextecourant.Ainsi,votrecodePHPpeutcharger
les classes PHP dont il a besoin la vole. Par exemple, lobjet
$user, de la classe User ne peut tre instanci si le fichierUser.class.phpnapastinclus(require_once).
Exemple:/* Definir une manire de trouver la classe User */
function custom_autoload($className){
require_once
dirname(__FILE__) . "/classes/" .$className .".class.php";
}
33/56
8/6/2019 Amliorez les performances de vos projets web
34/56
/*
* Ajouter la fonction custom_autoload la liste
* des fonctions permettant de trouver une classe.
*/
spl_autoload_register('custom_autoload');
/* Sans autoload, cette instanciation aurait gnrune Erreur:
* Fatal error: Class 'User' not found in ...
*/
$user= new User();
Cet exemple semble trivial, mais imaginez que vous disposez dune
librairiedeclassesquevousutilisezpartoutdansvotreapplication.Par
dfaut,2optionssontenvisages:
Inclurelavolelesclassesquevousutilisezchaquefois,cequidevientvitefastidieux
Faire linclusion de tous les fichiers au dbut du script, maisvous
incluez
alors
des
fichiers
qui
ne
sont
pas
utiliss
dans
tous
lesscripts,douneconsommationinutiledeRAMetdetemps
processeur.
Utiliser lautoload est donc fortement recommand, et cette solution
estmmeplusefficacequecellequiconsisteinclure lesfichiers la
vole,carunrequire_oncedoitvrifiersicefichieratdjinclus
ounon.
34/56
8/6/2019 Amliorez les performances de vos projets web
35/56
3.4 - Dporter l'excution du
code
SYMPTOMES :LaconsommationprocesseurdevosprocessusPHPest
tropleveouletempsderponsedespagesesttroplong,mmesous
unechargenormale.
3.4.1 - Mettre en place des traitements asynchrones
Laconceptionlaplusintuitiveetlaplussimpledunprojetestsouvent
pense en synchrone. Nanmoins, la mise en place de processus
asynchrones permet la fois de diminuer le temps dattente de
lutilisateur,etdelisserlespicsdecharge.
Penseznotammentexternaliserlestchessuivantes:
Productionderapport,misejourdestatistiques Envoisdemails Appelsdeservicesexternes
3.4.2 - Ajax
LAjax (Asynchronous Javascript And XML) est une manire de
dialoguer avec le serveur aprs le chargement de la page, grce au
Javascript.Lintrtestdechargerleslmentsquiprennentdutemps
aprsquelenavigateurde lutilisateuraaffich lecontenude lapage
Internet.Sivousavezuncalcul longquevousdevez fairechaquefoisetque
malgr toutes les recommandations que vous avez suivies, vous ne
pouvezpasrduireletemps.Ilestprfrabledafficherlapagesanscet
lmentpuisdercuprerlersultatsurleserveurensuite.
Toutefois, ilfautfaireattentioncarcertainsmoteursderecherchene
pourrontpasindexerlecontenudecebloc.
NOTE /ATTENTION AUX FRAMEWORKS : Certains frameworks et
certains CMS doivent charger un ensemble de modules et doutilsavant de passer lexcution du code effectif. Dans la mesure du
possible, lorsque vous faites de lAjax essayez de charger le moins
dlmentspossiblepourlimiterladuredexcutionetainsiacclrer
leretourdinformation.
NOTE /PLUSIEURS REQUETES : Siunepageeffectueplusieursappels
AJAX,sachezquePHPnepourratraiterlarequtesuivantequunefois
que la session aura t libre (fonction session_write_close). En
effet,lasessiontantpardfautlibreenfindexcutionduscript,les
requtesAJAXpourrontalorstretraitessimultanment.
35/56
8/6/2019 Amliorez les performances de vos projets web
36/56
3.5 Eviter les fausses
optimisations LE CONTEXTE : Votre serveur PHP sature. Vous vous tournez vers
votre dveloppeur, qui vous explique quil a LA solution, il faut
absolument changer tous les guillemets doubles par des guillemets
simplesparcequeceuxcisontplusrapide.
Mfiezvousabsolumentdecesfaussesoptimisations!Lewebregorgedemythes.Commentlesreconnatre?
Gnralement, il sagit dun conseil sur une manire de coder bas
niveau.
Quelquesexemples:
Les boucles for qui dcrmentent la variable au lien delincrmentersontplusrapides
Laboucleforestplusrapidequelabouclewhile Il faut utiliser des guillemets simples au lieu de guillemets
doubles
Le dveloppement objet est plus lent que le dveloppementprocdural
Touscesconseilsrsultentdedbatssansfinentredveloppeursdelangagesdeprogrammation.
Vous trouverez sur Internet des benchmark foison comparant les
performancesentreguillemetssimplesetguillemetsdoubles.Et ilest
vrai que lors dune boucle qui concatne 100000 fois une chane de
caractres, les guillemets simples sont 3% plus rapides que les
guillemetsdoubles.Maisrestonsfocalissurlimportant!Sivouslisez
celivreblanc,vousntespaslarechercheduneamliorationde3%de vos performances, mais bien de 100 ou 200%. Oubliez donc ces
fausses optimisations, et concentrezvous sur de vraies solutions
commeltudedesindexouloptimisationdesflux!
36/56
8/6/2019 Amliorez les performances de vos projets web
37/56
37/56
8/6/2019 Amliorez les performances de vos projets web
38/56
Les principales solutions d'optimisation consistent rduire les cots
delecturedestablesMySQL.Trois typesdesolutionssontpossibles:1. Optimiserlagestiondesindex;2. Agrgerdesdonnes;3. Amliorerlesrequtes.
4.1 - Gestion des Index
4.1.1 - Indexation de la BDD
LES SYMPTOMES :votreapplicationsecomportebienlorsquelabase
dedonnesestvide.Mais lorsquelabasededonnesseremplitavecdes volumtries de production, lapplication ralentit. La base de
donnes consomme la plupart des ressources du systme: la
consommation CPU ou les accs disques atteignent 100%. Les logs
MySQLslowqueriesmontrentquecertainesrequtesSELECTsont
lentesexcuter.
LA SOLUTION :Entermesdebasededonnes,lapremiresolution
examinerestdevrifierquelesindexsontbiendfinis.QUEST-CE QUUN INDEX ?
Imaginons un bibliothcaire devant rechercher un livre parmi une
collection. Si ces livres sont empils dans le dsordre, il va devoir
parcourirsacollectionlivreparlivrepourtrouverlelivrequilintresse.
Delammemanire,dansunebasededonnes,siunetablelivre
contient
un
million
denregistrement
et
que
lon
cherche
un
livre
par
sonnom,lemoteurdelabasededonnesdevoirparcourirununtous les enregistrements. Le bibliothcaire va bien sr classer les
ouvrages. Une fois classs, il sera capable de retrouver un livre trs
rapidement,parsimpledichotomie.Entermesdebasesdedonnes,ce
classementsappelleunindex.Silacolonnenomestindexe,la
base de donnes pourra retrouver un ouvrage par son nom sans
parcourirlintgralitdelatable.
De lammemanireque lebibliothcairevapasserdunejournede
recherchequelquesminutes,labasededonnespasseradequelquessecondes de recherches quelques millisecondes. Et lefficacit des
indexaugmenteaveclatailledelabase!
Lavantage des bases de donnes par rapport aux classements
physiques est de permettre plusieurs tris la fois. On peut crer un
indexsurlenom,surlauteur,etsurlenumroISBNlafois.
COUT DUN INDEX : Bien sr, lorsquun nouveau livre arrive, il faut
lindexer. Ainsi, si les index permettent de gagner en temps de
recherche,ilsralentissentlgrementlinsertiondesdonnes.Unindexoccupe aussi de la place sur le disque dur. Cependant, dans une
application web typique, les donnes sont lues bien plus souvent
quelles ne sont crites. De manire quasi systmatique, le gain de
performanceapportparunindex dpasselargementsoncot.
ANALYSER LES REQUETES : Lorsqueloncrerun indexsurunebase
de donnes, il est important de tracer les amliorations que lindex
apporte sur le temps d'excution de la requte. Le plus souvent,
38/56
8/6/2019 Amliorez les performances de vos projets web
39/56
lamliorationestflagrante(onpassedeplusieurssecondesquelques
millisecondes).
BON A SAVOIR : Silamliorationnestpasflagrante,ilfautvrifierque
lindexestbienutilis.Pourcela,onutilisera lacommandeANALYZE
TABLE de MySQL: http://dev.mysql.com/doc/refman/5.0/fr/analyze
table.html
La lecture des analyses nest pas aise, mais cest un des meilleurs
moyens de comprendre le fonctionnement de la base de donnes.
Danscerapport,vousdevezvousassurerquilnyaplusdefullscan
sur les tables. Les fullscans correspondent un parcours de tous lesenregistrementssansutiliserdindex.INDEXER LES COLONNES DES REQUETES LES PLUS FREQUENTES /
LES PLUS COMPLEXES : LeslogsdeslowqueriesMySQLdevraient
mettreenvidencelesrequteslespluslentes.Analysezcesrequtes
et vrifiez notamment la partie WHERE et ORDER BY de la
requte. Les colonnes utilises devraient tre indexes. Vrifiezgalementsivotrerequteeffectueunejointureentreplusieurstables,
lesclefstrangresdevraienttreindexes.Loptionlog_queries_not_using_indexes permet dajouter au
logdesdeslowqueriestouteslesrequtesquieffectuentunfull
scan.Ellespourrontainsitrerapidementrepres.
BON A SAVOIR : Si vous utilisez des tables INNODB, nous vous
recommandonsvivementdedclarertoutes lesclefstrangres.Une
clef trangre dclare dans INNODB doit forcment tre indexe.
Ainsi, vous ne pourrez pas oublier lindex et vous viterez un futur
problme de performances. Vous pouvez consulter ce sujet larticle
surlesclefstrangresdeladocumentationMySQL:
http://dev.mysql.com/doc/refman/5.0/fr/exampleforeignkeys.html
4.1.2 - Les index multi-colonnes
Si votre requte SQL optimiser contient plusieurs colonnes dans la
clause WHERE, crer un index sur chacune des colonnes ne sera pas
optimal. La base de donnes utilisera en effet un des index, mais nepeutpasutiliserplusieurs indexsur lammetablesimultanment.La
basededonnesvaalorschercherutiliser lindex leplusefficace (le
plus discriminant). Pour ces cas, il est possible dutiliser des index
multicolonne.
En reprenant lexemplede labibliothque,onpourraitcrerun index
sur les auteurs, puis les noms douvrage. Les livres seraient dabord
classs par auteurs, puis par nom douvrage. Ainsi, il serait rapide de
retrouverunlivredontonconnaitlauteuretlenom.
BON A SAVOIR : Dans les index multicolonnes, lordre des colonnes
estprimordial.
4.1.2 Cardinalit des index
Il peut se produire des cas o la base de donnes dispose de la
possibilitdutiliserplusieursindexpourunemmerequteetdoivent
faire lechoixentre2 indexutiliser.Elleprendraalorsgnralement
lindex le plus discriminant, cestdire lindex qui dispose du plus
grandnombredevaleursdiffrentespourunemmecolonne.Onparle
decardinalitdelindex.
39/56
http://dev.mysql.com/doc/refman/5.0/fr/analyze-table.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/analyze-table.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/analyze-table.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/analyze-table.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/example-foreign-keys.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/example-foreign-keys.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/example-foreign-keys.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/example-foreign-keys.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/example-foreign-keys.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/example-foreign-keys.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/example-foreign-keys.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/analyze-table.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/analyze-table.html8/6/2019 Amliorez les performances de vos projets web
40/56
Parexemple,sinotretabledouvragepossdeunecolonneauteur
qui contient le nom de lauteur, et une colonne type qui contientsoitlivre,soitmagazine,lacardinalitdelindextypeserade
2, alors que la cardinalit de lindex auteur sera gale au nombre
dauteurs.
Siunebasededonnesalechoixentreles2index,elleprendralindex
auteurchaquefois.
La cardinalitestestime par la base dedonnes au furet mesure
des oprations.Pour les tables MyISAM,sion effectue un trsgrandnombredoprationsdesuppression/insertion,lacardinalitdunindex
peut tre fausse. La base MySQL prendra alors le mauvais index ce
quipeutnuireauxperformances.LacommandeANALYZETABLE
reffectuelecalculdecardinalitpourcorrigerceproblme.Attention
cependant, cette commande bloque la table le temps de son
excution. Il ne faut donc surtout pas lexcuter pendant un pic de
charge!
4.1.3 - Recherche de contenus text : index FULLTEXT
Danslerestedeceparagrapheddiauxindex,nousallonscependant
aborderuntypeparticulierdindex:lesindexFULLTEXT.
Reprenonslexempledenotrebibliothcaire.Ilvientdeclassertousles
ouvragesparordrealphabtique.Quelqu'unarrive,etluidemandede
retrouverunouvragedontilnesesouvientpascompltement dutitre.
Ilserappellecependantqueletitrefinitpardelamthode.
Notre bibliothcaire est bien embt. Son classement alphabtique
fonctionne,conditionquelonconnaisseledbutdenomdulivre,pas
lafin. Ilnevapasavoirdautrechoixquedeparcourirsacollectionde
livreentire.Delammemanire,unindexclassiquesurlacolonne
nomnepourrapastreutilissurunerequtedutype:SELECT * FROM books WHERE name LIKE %de la mthode
Si ce type de requte vous pose des problmes de performances, il
faudracrerunindexFULLTEXT.LesindexFULLTEXTpermettentderechercher rapidement du texte plac au milieu ou la fin dune
colonne.
BON A SAVOIR : Sous MySQL, il y a cependant des restrictions. Les
bases de donnes InnoDB ne supportent pas les index FULLTEXT. Il
faudra utiliser le moteur MyISAM, qui possde luimme dautres
limitations.
4.1.4 - Moteur FULL-TEXT spcialis (LUCENE, Apache
SOLR)
Vousavezappliqutoutes lesoptimisationscidessus,vousavezcr
des index de manire optimale, et malgr cela, vos requtes sont
toujourslentes.
Dans le cas de notre table livres, il sagirait dun client souhaitant
retrouverunlivredontlecontenudulivrecontiennelemotcollier,
maisaussi lemotgirafe.Lemcanismedevraittresuffisamment
souple pour permettre les fautes dorthographe (par exemple
40/56
8/6/2019 Amliorez les performances de vos projets web
41/56
giraffe au lieu de girafe), et ne retourner que les livres publis
aprs2009.Dans ce type dexemple, il faut envisager de revoir larchitecture de
lapplication. De toute vidence, MySQL nest pas bien adapt aux
recherches FULLTEXT complexes, et est incapable de raliser des
requtesapproximatives(fuzzysearches).
Sivoussouhaitezraliserdesrecherchesdecetype,etsivousavezdes
problmesdeperformancecausedecesrequtes,ilexistedesbases
dedonnesspcialisespourlarecherchedansunegrandequantitde
documentsfulltext.
LUCENE : Lucene est un moteur de recherche Fulltext. A lorigine
implmentenJava,ilenexisteuneimplmentation PHPdansleZendFramework:
http://framework.zend.com/manual/fr/zend.search.lucene.html
Lucenestockedesdocumentsetpermetderechercherenfulltext
dans le document ou ses mtadonnes. Il permet deffectuer des
fuzzysearchesetdesrequtescomplexes.
Limplmentation PHPdeLuceneestrelativementlenteparrapportson homologue Java. Aussi, Lucene ne devrait pas tre utilis si la
volumtrieesttropgrande.OnsetourneraalorsversSOLR.
APACHE-SOLR : serveur bas sur la version Java de Lucene. Il
sinterroge via webservices (sur un modle REST), et permet
facilement de stocker les documents puis de les chercher. Si vos
problmesdeperformancessontdusunefonctionnalitderecherche
FULLTEXT et que limplmentation de Lucene dans le Zend
Frameworknesuffitplus,ApacheSOLRestlasolutiondontvousavezbesoin:http://lucene.apache.org/solr/
NOTE : Nous avons prsent Lucene et Apache SOLR, qui sont lessolutionslesplusconnues,maisilenexistedautres.
NOTE : Dansceparagraphe,nousnavonsqueprsentlespossibilits
d'optimisation les plus lmentaires. Bien maitriser la gestion des
index de la base de donnes est primordial pour obtenir des
performancessatisfaisantesmaislesujetestvasteetdpasselecadre
de ce livre blanc. Il faudrait par exemple traiter des diffrents types
dindex(HASH,TREE,etc..).N'hsitezpasapprofondirlesujetavecladocumentationMySQL:
http://dev.mysql.com/doc/refman/5.0/fr/mysqlindexes.html
4.2 - AgrgationLa bonne gestion des index une importance directe sur les
performances de votre projet web. Mais il est possible de rencontrer
malgr tout des problmes lies au temps d'excution de certaines
requtes.C'estnotamment lecasdesapplicationsquiprsententdes
statistiques.
Agrgerdesdonnespermetdefairedesrequtessurlestablesmoins
volumineuses. Le principe est dappliquer un ensemble de prcalcul
sur la table puis de stocker le rsultat dans une nouvelle table. Les
donnesserontprisesdanslatableagrge.Lebutestdenavoirque
trspeudecalculfaireaumomentde l'excutionde larequteafind'amliorerletempsderponse.
41/56
http://framework.zend.com/manual/fr/zend.search.lucene.htmlhttp://framework.zend.com/manual/fr/zend.search.lucene.htmlhttp://lucene.apache.org/solr/http://lucene.apache.org/solr/http://dev.mysql.com/doc/refman/5.0/fr/mysql-indexes.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/mysql-indexes.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/mysql-indexes.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/mysql-indexes.htmlhttp://dev.mysql.com/doc/refman/5.0/fr/mysql-indexes.htmlhttp://lucene.apache.org/solr/http://framework.zend.com/manual/fr/zend.search.lucene.html8/6/2019 Amliorez les performances de vos projets web
42/56
4.2.1 - Agrgation en batch
Lune des techniques parmi les plus simples mettre en uvre pour
agrger des donnes consiste crer un script (PHP ou autre) qui
sexcutergulirementpoureffectuerdesprcalculs(batch).
Cescriptdevratrelancviaunetacheautomatique.Letempsentre2
excutionsestcritique.Eneffet,ilyaplusieursrponsespourunmme
problme:
Excuter trs souvent le script : Ceci permet davoir desdonnes proche du temps rel, et peut tre excut
rapidement,conditionquelabasededonnessyprte.Ilest
possiblequelarequtelaplussimplemetteplusieursminutes,
auquelcas ilsera impossiblede lancersouvent lescriptsous
peinedesaturerleserveur.
Excuter une fois parjour : Mme si le script est long, il nebloquera
pas
le
serveur.
Il
est
conseill
de
lexcuter
au
moment ou la charge serveur est la plus faible (souvent en
pleinenuit).
AVANTAGE :Lasolutionestsouventfaciledvelopperetdployer,
grandelibertdanslecode.
INCONVENIENT :Lesdonnesprsentesnesontpaslerefletexactde
la production. Selon les volumes, les tests sont parfois long et
complexesraliser.
4.2.2 - Agrgation direct (triggers)
Le
trigger
permet
de
crer
lagrgation
directement
en
base
de
donnes. A chaque nouvel enregistrement dans une table, il est
possibledecreruntriggerquieffectueraleprcalculetlenregistrera
directementdanslatableagrg.Ilfautcependantfaireattentionla
limitedesbasesdedonnes.
AVANTAGE :Tempsrel
INCONVENIENT : Maintenance, migration de base de donnes et
limitesencriture.
Exemple:Achacuninsertdanslatableprincipale,vousajoutez3lignes
danslatabledagrgation.Ainsiaulieudefaire1insert,ilyenaura4.
La base saturera donc beaucoup plus rapidement s'il y a de
nombreusescritures.
4.3 - Optimisation des requtes
la base de donnes4.3.1 - Rduire le nombre de requtes
SYMPTOMES :Votreapplicationeffectuepourchaquepageungrand
nombre de requte que vous voyez dans les logs MySQL (plusieurs
centaines).
Les
pages
sont
longues
safficher
bien
que
ni
le
serveur
PHP,nileserveurMySQLnesoientsaturs.
42/56
8/6/2019 Amliorez les performances de vos projets web
43/56
Sivotreapplicationeffectueuntropgrandnombrederequtes,labasededonnespeuttrelaraisondesmauvaisesperformances.Eneffet,
endehorsdutempsdexcutiondelarequte,ilfautcompterletemps
de latence la base de donnes. Or ce temps de latence nest pas
ngligeable,car ilestparfoisplus importantqueletempsdexcution
de la requte ellemme! De manire gnrale, il faut donc prfrer
une requte importante plutt que plusieurs petites requtes afin de
factoriserletempsdelatence.
Parexemple:
$result =mysql_query("SELECT * FROM users");
while ($user= db_fetch_object($result)){
$countResult =mysql_query("SELECT count(1)
FROM cars
WHERE user_id = $user->id");
// ...
}
Ce script excutera une premire requte pour rcuprer tous les
utilisateurs, puis, pour chaque utilisateur retourn, une nouvelle
requte sera effectue pour connatre le nombre de voitures quil
possde. Une meilleure pratique consiste lancer une seule requte
pourtoutrcuprerenuneseulefois:
$result = mysql_query("
SELECT u.*, count(c.id)
FROM users u JOIN cars c ON u.id=c.user_id
GROUP BY u.id");
while ($user= db_fetch_object($result)){
// ...
}
4.3.2 - Optimiser les requtes les plus critiquesSYMPTOMES :VotreserveurMySQLestsatur.
Pouroptimiserlesappelslabasededonnes,onestsouventtentdetraiterenprioritlesrequteslespluslonguestreexcutes.
Enralit,siunerequtemet10secondessexcuter,maisquelleest
peu appele, l'optimisation n'amliorera pas les performances de
l'application.Ilfautpluttsintresserauxrequtesquiconsommentle
plusdetempssurunintervalledetempsreprsentatifduneutilisation
normaledelapplication.
Une solution pour savoir quelles sont les requtes qui doivent tre
optimisesestdidentifier lensembledes requtesexcutessurunepriodereprsentative (lamiseenplacedu logdesslowqueriesavec
un seuil 0 permet de les voir toutes), puis d'analyser le rsultat en
comptant le nombre doccurrences des diffrentes requtes (au
paramtre prs). En pondrant ensuite le temps dexcution par le
nombre dappels de chaque requte, vous obtiendrez un classement
desrequteslespluscoteuses.
4.3.3 - Eviter les requtes imbriquesSYMPTOMES :VotreserveurMySQLestsatur.
43/56
8/6/2019 Amliorez les performances de vos projets web
44/56
Lexcution de requtes imbriques implique la cration dune table
temporaire.Siellepeuttrevite(cenestpastoujourslecas),ilvautmieuxeffectuerdesjointures.
Exemple:SELECT *
FROM users
WHERE user.role_id IN (
SELECT uid FROM users_roles
WHERE rid IN (
SELECT rid
FROM role
WHERE name IN ('administrateur', 'client')
)
)
Cette requte utilise 2 requtes imbriques, alors que lusage de
jointuresseraitplusperformant:SELECT *
FROM users uJOIN users_roles ur on ur.user_id = u.id
JOIN role r on r.id=ur.role_id
WHERE r.name IN ('administrateur', 'client')
44/56
8/6/2019 Amliorez les performances de vos projets web
45/56
8/6/2019 Amliorez les performances de vos projets web
46/56
4.5 - Base de donnes
Multidimensionnelles
Lagrgationdedonnesdansdestablesdagrgatspermetdoffrirdes
statistiques rapidement.Cependant,cetteapprochepeuttre limite
silesstatistiquesproduiresonttrsdiverses.
Prenons lexemple classique suivant: vous disposez de plusieurs
magasins dans le monde. Chacune des ventes est logue dans unetable qui contient le produit vendu, le prix, le vendeur, la date, le
magasin avec sa localisation gographique. A partir de cette table,
vouscrezunetabledagrgatpourconnatrelenombredeventespar
vendeur.
Puisvoussouhaitezcrerunnouvelindicateur(doncunenouvelletable
dagrgat)pourconnatrelesventesparmagasin.Deuxmoisplustard,
nouvelindicateur:lesventesparmagasin,parcatgoriedeproduitet
par mois. Au bout de quelques mois, votre base de donnes estencombredetablesdagrgatsdifficilesmaintenir.
Pour ces cas ou vous ne pouvez savoir priori quelles sont les
statistiques que vous souhaitez produire, les bases de donnes
multidimensionnelles sont la solution. Une base de donnes
multidimensionnelle (ou base OLAP) permet danalyser un grand
nombre de donnes sous des axes diffrents. Dans le cas de notre
magasin, la base de donnes multidimensionnelle effectuera
lintgralit des agrgats possibles en une passe (ce que lon appellecalculer lecubemultidimensionnel).Onpourraalors interroger labase
instantanmentsoustoutessesdimensions (cestdiresoustous lesaxes dagrgation possibles). Si vous tes habitus de Excel, vous
pouvez voir une table multidimensionnelle comme un tableau crois
dynamiquepouvantcontenirdesmilliardsdelignes.
Maintenir une base multidimensionnelle demande cependant des
efforts. Il faut mettre en place un script de chargement de la base
partirdevotrebaserelationnelle(MySQL).Enrsum,utilisezunebasededonnesmultidimensionnellesi:
Vousavezdesproblmesdeperformancesurunaffichagedestatistiques;
Cesproblmesdestatistiquessontdus lavolumtriedevosdonnes;
Vous ne savez pas priori quelles statistiques serontncessaires ou si la diversit des statistiques empche
lutilisationdetablesdagrgats.
Si vous dcidez dutiliser une base de donnes multidimensionnelle,
vousdevrezchoisirlabaseutiliser.Citonslesplusconnues:
Mondrian: une base de donnes multidimensionnelle opensource
Microsoft Analysis Services: la base de donnesmultidimensionnelledeMicrosoft
Essbase:labasededonnesmultidimensionnelledeOracle SAS OLAP Server: le serveur de base de donnes
multidimensionnelle
fournit
par
la
suite
SAS
danalyse
BI.
46/56
8/6/2019 Amliorez les performances de vos projets web
47/56
4.6 - Configuration MySQL
Votre site web neffectue plus que des requtes indexes. Vous avez
prcalcul toutes vos statistiques. Bref, vous avez puis toutes les
optimisationsrecommandesdanscedocument,etvousavezencore
unproblmedeperformances.
Alors (et seulement ce moment), vous pouvez regarder les
paramtresdoptimisationdeMySQL.
MySQLestunebaseproposantplusieursmoteursdegestiondestablesensonsein, lesplusconnustantMyISAMet InnoDB.Chacundeces
moteurspossdedesperformancesetdesparamtresdoptimisation
quiluisontpropres.
4.6.1 - MyIsam vs InnoDB
Le choix entre MyISAM et InnoDB nest pas anodin. La plupart du
temps, le choix est dict par les fonctionnalits de la base. Par
exemple, seul InnoDB permet de dclarer des contraintes dintgrit
surlabasededonnes.InnoDBdisposeaussidunjournal,quigarantit
quelesdonnesseronttoujoursdansuntatstable,mmesileserveur
debasededonnessarrteenpleinmilieuduneoprationdcriture.
Acontrario,MyISAMest leseulproposerun indexfulltext.Sivousavez besoin de cette fonctionnalit, le choix seront donc impos
directement.
Vousavezbiensrlapossibilitdemlangerlesmoteurs,chaquetable
pouvant utiliser un moteur qui lui est propre. Cette solution est
utiliser avec prcaution. En effet, chaque moteur dispose de cespropresrestrictions,notammententermesdebackup.Enutilisantles
deuxmoteurs,vouscumulezlesdeuxlimitations.
En termes de performance, chaque moteur possde sescaractristiquespropres.SivousavezchoisiMyISAMou InnoDBpour
lune des fonctionnalits qui lui est propre, mieux vaut rester votre
choix initial que dcider de changer pour un problme de
performances. Si par contre, votre choix a t effectu parce que
cest le moteur par dfaut, vous pouvez alors lgitimement vous
poserlaquestiondunchangementdemoteur.
InnoDBsembletrelemoteurprfrdelaplupartdesdveloppeurs.
Dunpointdevuedesperformancesuniquement, ilsediffrenciesur
deuxgrandspoints:ildisposedunjournal,etilsupportelerowlevel
locking.
Pourunebasededonnes,unjournalestunespacedanslequellabase
vacriretouteslesactionsdcritureeffectues.Danslapratique,cela
signifieque lesactionssontcrites2fois.Biensr,dunpointdevue
des performances, cela a un cot puisque les donnes sont crit en
double. Cependant, cest la seule manire de permettre degrer des
transactions (deffectuer desrollbacks), et surtout,cela garantidetoujours pouvoir rcuprer la base de donnes dans un tat stable,
quelquessoitlescoupuresduserveur.LefaitqueMyISAMnedisposepasdejournalnelerendcependantpas
systmatiquement
plus
performant.
En
effet,
lors
dune
opration
dcriture en base avec MyISAM, MyISAM bloque toute la table. A
47/56
8/6/2019 Amliorez les performances de vos projets web
48/56
contrario, InnoDB ne bloque que les lignes (le fameux rowlevel
locking).Ainsi, InnoDBestplusefficacequeMyISAMpour lesapplicationshauteconcurrencedaccs(typiquementuneapplicationweb).InnoDBpossdecependant des limitationsquilestbon de savoir.La
plus connue tant que la rcupration du compte de lignes dans une
table effectue un parcours de table complet (trs lent). Il faut donc
viterlesrequtesdutype:SELECT COUNT(*) FROM books
Enfin, InnoDB est activement dvelopp alors que MyISAM est plusstable.Onpeutdoncsattendrevoirdenombreusesamliorationsde
performancearriversurInnoDB.
InnoDB tant un systme plus complet que MyISAM, il dispose
galementdeplusdeparamtres.AlorsqueMyISAMestassezfacile
configurer,InnoDBdemanderaplusdetempspourobtenirunsystme
optimal.
LalistedetouslesparamtresInnoDBestprsentesurcettepage:
http://dev.mysql.com/doc/refman/5.0/en/innodbparameters.htmlMme si cette liste est longue, si vous souhaitez faire du finetuning
MySQL, nous vous conseillons de la parcourir en entier, certainsparamtresayantdesimpactssurdautres.
Nous ne parcourrons pas lintgralit des paramtres dans ce livre
blanc(cenestpaslesujet),maisallonsprsenterlesprincipaux.
4.6.2 - Taille du cache InnoDB
LeparamtreprincipalinfluenantlesperformancesMySQLserabien
srlatailleducache.Pluslecacheestgrand,moinsMySQLdevraaller
chercherdedonnessurledisquelorsderequtes,etdoncpluslabase
serarapide.
Sous InnoDB, la taille du cache est gre par le paramtre
innodb_buffer_pool_size . Par dfaut, il est initialis 128 Mo.
Surunserveurdebasededonnesddi,onpeutmonterjusqu80%
de la RAM du serveur. Attention cependant, MySQL aura besoin de
RAM galement pour stocker le programme, la structure de la base,
etcDeplus,sivousutilisezMyISAMenparallledeInnoDB,ilfaudra
galementlaisserdelaplaceenRAMpourlecacheMyISAM!
4.6.3 Nombre de connexions simultanes
Le nombre de connexions simultanes la base est limit par le
paramtremax_connections.
Si le nombre de connexions maximal est atteint, la base de donnesretournerauneerreur(Toomanyconnections).
Il est donc trs important que ce paramtre ne soit pas trop bas.
Chaque thread PHP pouvant ouvrir une connexion la base de
donnes,lenombredeconnexionsmaximumdemandeslabasede
donnesdevraittreenvirongalaunombredethreadsPHPautoriss
dans Apache (voir ce sujet la sectionAutresparamtragesApache
PHP).
NOTE : la commande SHOW STATUS MySQL permet de voir lenombremaximal deconnections simultanes ouvertessur le serveur,
48/56
http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.htmlhttp://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.htmlhttp://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.htmlhttp://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.htmlhttp://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_buffer_pool_sizehttp://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_buffer_pool_sizehttp://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html8/6/2019 Amliorez les performances de vos projets web
49/56
ce qui permet de voir en production si on se rapproche ou non du
maximumautoris.
ATTENTION : ne modifiez pas le paramtre max_connections sans
modifier le paramtre table_cache qui lui est associ. table_cache
reprsente le nombre de fichiers ouverts simultanment par MySQL.
En MyISAM, pour chaque connexion, lorsque MySQL accde une
table,MySQLouvreunfichier.SiMySQLfaitunerequteavecunjoin
sur2tables,ilouvre2fichiers,etc...
Dans l'idal, on devrait donc avoir table_cache =max_connections *
nombredejoinmaximum.DanslecasdeInnoDB,cenombrepeuttrediffrentpuisqueselonla
configurationde InnoDB,celuicicrittoutes lestablesdans lemme
fichier, ou crit une table par fichier (suivant la valeur du paramtre
innodb_file_per_table).
4.6.4 - Nombre de threads
SYMPTOMES : Vous disposez dun serveur trs puissant (plus de 8
curs).MySQLnesaturepasleCPU,maisceluiciplafonne20%ou
40%de la puissancemaximum.Les autres ressources (disque /RAM)
ne saturent pas non plus. Le serveur semble ne pas donner tout son
potentiel.
Pardfaut,MySQLn'ouvrepasplusde8threadspourInnoDB.
Leparamtrergissantcecomportement est
innodb_thread_concurrency:
http://dev.mysql.com/doc/refman/5.0/en/innodb
parameters.html#sysvar_innodb_thread_concurrency
Si vous disposez dun serveur ddi puissant (par exemple avec 24
processeurs),vouspourriezvouloiradapterceparamtre.
La recommandation MySQL est de configurer ce paramtre deux
foislenombredeprocesseurs+lenombrededisques.Nous vous recommandons cependant deffectuer des tests avec des
valeurs trs diffrentes pour voir le comportement de votre
application. En effet, en augmentant le nombre de threads, vous
augmentezlaconcurrenceetdonclerisquedelocks.
4.6.5 - Log file
SYMPTOMES :LedisquedurdevotreserveurMySQLsatureencriture
cause dun grand nombre de commandes INSERT / UPDATE /
DELETE.
Lorsqu'un utilise InnoDB, MySQL crit unjournal. Comme expliqu
prcdemment, l'ide dujournal est d'crire l'ancien tat de la base
avant de l'craser avec le nouvel tat. En cas de crash, on peut ainsi
toujours revenir en arrire. L'criture sur le disque est effectue en
double.Ceciestinhrenttouteslesbasesdedonnesrespectantles
normesACID(c'estdirequasimenttouteslesbasesSQLsaufMySQL
enmodeMyISAM). IlexistedansMySQLdesparamtrespermettant
d'assouplirl'crituredanslejournal(parexempledefairelcritureune
fois par seconde plutt qu' chaque UPDATE ou INSERT). Le
49/56
http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_thread_concurrencyhttp://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_thread_concurrencyhttp://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_thread_concurrencyhttp://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_thread_concurrencyhttp://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_thread_concurrency8/6/2019 Amliorez les performances de vos projets web
50/56
paramtre innodb_flush_log_at_trx_commit rgit ce
fonctionnement:
http://dev.mysql.com/doc/refman/5.1/en/innodb
parameters.html#sysvar_innodb_flush_log_at_trx_commit
http://www.mysqlperformanceblog.com/2007/11/01/innodb
performance
optimization
basics/
50/56
http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commithttp://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commithttp://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commithttp://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commithttp://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commithttp://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commithttp://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit8/6/2019 Amliorez les performances de vos projets web
51/56
51/56
8/6/2019 Amliorez les performances de vos projets web
52/56
52/56
Lorsque la mise en place d'une dessolutions prcdentes est coteuse,
il est intressant d'examiner
l'architecture physique de la
solution.
Les solutions associes
l'infrastructure matrielle sont
nombreuses et la plupart consistentaugmenterlenombredeserveurs.
Cette partie prsente quels sont les
moyens d'amliorer les
performances de votre application
grcel'augmentationdescapacits
matrielles.
5.1 - Upgrade
Leprincipedelupgradedesserveursestsimple.Ils'agitd'augmenter de faon constante les performances
physiques de sa machine: rajouter de la RAM,
augmenter la tailledesdisquesouajouterdesdisques,
augmenter la puissance du ou des processeurs, utiliser un systme
multicursCes actions permettent daugmenter les capacits du serveur pour
accueillir un plus grand nombre de connexions utilisateurs et/ou de
calculs serveur. Une fois upgrad, le serveur web sera capabledabsorberuneplusgrandecharge.
BON A SAVOIR : augmenter la puissance dun serveur cote
relativement peu tant quon reste dans une puissance standard,
maislerapportcot/performancecrotexponentiellementdsquelon
sortdelanorme.
Il est prfrable de rapidement s'orienter vers des solutions de
clusteringquifournissentunearchitectureplusrobustenotammenten
casdepanne.Aussi,ilestintressantdedfinirunseuilpartirduquel
il convient de stopper lupgrade, pour dmarrer une stratgie declustering.
8/6/2019 Amliorez les performances de vos projets web
53/56
53/56
5.2 - Clustering
5.2.1 - Sparer APACHE MYSQL
Pour beaucoup d'applications PHP
MySQL, laccsauxdonnesreprsente
un point majeur de lutilisation des
ressources serveurs (goulet
dtranglement). Or, dans le mme temps, lapplication a un besoin
nonngligeablederessourcespourfairefonctionnerlapplicationPHP.
Dansdenombreuxcas,cesdeuxdemandesderessourcessimultanes
peuventcrerdeslenteurs,voiredesdfaillances.
Une solution pour rsoudre ce problme est de sparer le serveur
Apache,contenant lapplicationPHP,duserveurMYSQLcontenant le
Systme de Gestion de Base de Donnes (SGBD). Ainsi, les actions
effectues sur lun des serveurs nimpacteront pas lautre et les
performancesenserontamliores.LeSGBDtantdansdenombreux
cas le goulet dtranglement dun site web, il sera ici trait de faon
ddieparununiqueserveurquinauraquecettechargegrer.
BON A SAVOIR : Dans ce cas, la latence augmente. L'application ne
doitpaseffectuerdetropnombreusesrequtesparpage.
5.2.2 - Load Balancing des serveurs APACHE
Le load balancing Apache
permet de distribuer le trafic
sur plusieurs serveurs.
Lobjectif est de multiplier le
nombre de serveurs capables
dhbergerlesitecibleetainsi
de partager la charge relative
aux actions utilisateurs sur
plusieursserveurs.
La distribution sera effectue par un serveur ddi (le loadbalancer).
Pour les sites trs fort trafic, on aura recours un boitier physique
(proposparleshbergeurs)afinderedirigerlesaccsausitewebsur
les diffrents serveurs. Un paramtrage fin est galement ncessaire
pour partager les donnes en cache, ainsi que les donnes sessions(APC,memcached).Labasededonnesdoitgalementtrepartage
pourtreaccessibledesdiffrentsserveursweb.
BON A SAVOIR : En plus d'amliorer les performances (plusieurs
serveurs rpondent en mme temps aux requtes utilisateurs), il y a
uneautreraisonpourmettreenplacecetteoptimisation : lasolution
est beaucoup plus robuste. En effet, comme plusieurs serveurs
fonctionnent en parallle, si lun dentre eux est dfaillant, les autres
sont susceptibles de prendre le relais instantanment. En revanche,
cela demande un suivi constant de lactivit des serveurs en utilisant
Nagios par exemple. Dans le cas contraire, un serveur peut devenir
indisponiblesanstoutefoisalerterl'administrateurdusite.
8/6/2019 Amliorez les performances de vos projets web
54/56
54/56
NOTE :lamaintenancedelasolutiondevientpluscomplexedufaitque
lesmodificationseffectuessurunserveurdoiventtrediffusesverstouslesautres.
5.2.3 - SQL Master / Slave
Dan