Vous êtes sur la page 1sur 56

1/56

Introduction

Une histoire qui se rpte souvent ...


Vouscommencezrcolterlefruitdevosefforts,votresitewebestun succs flicitations ! Cependant, vous sentez que votre site devient plus lent et un beau jour, 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 est souvent trop tard. Le site est dj en production et l'activit de la socitpeuttrefortementpnalise.Lorsqu'unsitedevientlent,plus de50%desvisiteursarrtentleurnavigation.Pourl'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,on alabonnesolution!" Danslaplupartdescas,ilfautcomprendrequecessolutionsuniqueset appliques sans discernement vont vous faire perdre un temps prcieux.Mmesisouvent,onfinitquandmmepartrouver,avecun peudechanceetauprixd'effortsconsidrables. Notreconvictionestquel'applicationd'unedmarchestructureet rationnelle est la cl pour amliorer les performances de votre site et passer ce cap difficile. Mme (voire surtout) s'il s'agit d'une situationdecrise.

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. denombreusesstatistiquessurlessiteseCommercemontrent que rduire les temps d'affichage des pages rduit le taux d'abandondepanier; 2. lesmoteursderechercheprennentdeplusenplusencompte le confort des utilisateurs. Une des seules mesures leur disposition est le temps de chargementdes pages. Amliorer les performances de son site permet donc d'amliorer son rfrencementnaturel.

2/56

A qui s adresse ce livre blanc et comment l'utiliser ?


Ce livre blanc s'adresse l'ensemble des acteurs faisant face des problmesdeperformancessurdesapplicationswebenproduction. NOTE : les conseils portent sur les architectures LAMP (PHP MySQL) mais la plupart s'appliquent aussi aux applications web de type Java/J2EEouRuby. Nous nous sommes fixs l'objectif de faire un guide qui soit le plus pratique et efficace possible. Nous n'avons donc pas cherch citer l'ensemble des outils de diagnostic ni rpertorier l'ensemble des solutions. Avec cet ouvrage vous devriez facilement comprendre dansqueldomainerechercherunesolutionettrouvercettesolution danslaplupartdescas. 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 les performances de PHP, comment paramtrer MySQL ou bien encore quelles sont les meilleures architectures techniques. Pourtant,raressontceuxquitraitentdeladmarched'ensemblequ'il faut suivre pour amliorer les performances une fois l'application dploye. Les performances de votre site dpendent troitement de votre activitetdel'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. En revanche, peu de socit disposent la fois de l'exprience et des 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 en place un plan d'amlioration des performances exige de la srnit. Ce qui est rarement le cas lorsque des problmes de

3/56

performance se posent. Cet ouvrage vise donc partager l'exprience de The Coding Machine. Il indique les diffrentes tapes permettant de conduire les diffrentes investigations ncessairesetprsentelessolutionsenvisageables.

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 des architectures PHPMySQL et l'intrt que nous leur portons nous incitentrgulirementpublierdesarticlesdebloglorsquelesujetest courtoucriredeslivresblancslorsquelesujetdevientplusvaste. CelivreblancatcritparDavidNgrier,associdirecteurtechnique, JeanGuillaumeDujardin,associgrantetKevinNguyen,managerde projetweb. LesauteursdecetouvrageainsiquetoutelquipedeTCMsetiennent videmment votre disposition si vous prouvez des difficults mettreenplacecepland'actionsd'amliorationdesperformancesou si vous souhaitez nous faire part d'un problme que nous n'avons pas trait (le sujet est vaste !), partager des lments de rflexion avec nousoubientoutsimplementnousfairepartdevosremarques.

4/56

5/56

6/56

7/56

1.1 - Dmarche
1.1.1 - Introduction - Quelques rflexions pour bien dmarrer...
1. Ne recevoir aucune chose pour vraie tant que son esprit ne l'auraclairementetdistinctementassimilpralablement. 2. Trierses difficults afin de mieux les examiner et les rsoudre. 3. tablir un ordre de penses, en commenant par les plus simples jusqu'aux plus complexes et diverses, et ainsi de les retenirtoutesetenordre. 4. Passertoutesleschosesenrevueafindenerienomettre. Descartes,discoursdelamthode. Toutes ces tapes sont rigoureusement les mmes lors de la mise en placed'unpland'amliorationdesperformances: 1.nepasappliquerdesolutionsprconues:vousrisquezdeperdre du 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 manire certaineleproblme. 2. commencer dans l'ordre : gnralement il y a un problme dominant.Ilnesertriendersoudrelespointssecondairesavantle premier.Lesperformancessontsouventamlioresparlesactionsles plussimples.Parexemple,s'ilyaunproblmesurl'accsdesdonnes, onpeutobtenirunfacteur100entravaillantsurlesindexdelabasede donnes tandis que changer les serveurs permettrait d'obtenir un facteur4. 3. mettre en place les solutions jusqu'au bout : dans la plupart des cas, il ne se pose pas un mais plusieurs problmes de performance. Vousdevezlesidentifieretlesrsoudreunparun.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 autre plus "universelle". C'est une erreur. Les performances s'amliorent en accumulantlessolutions. 4. procder de manireitrative : les performancesvont s'amliorer aprs ces premires actions, mais cela ne suffira peut tre pas. Il est importantdemesurerleprogrsetd'itrer.

8/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. basededonnes 3. rseau 4. infrastructurematrielle NOTE : dans les premires itrations de la dmarche, certaines solutions sont videntes. Dans le cas d'un problme sur une 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.MISEENPRODUCTIONETMESUREDELIMPACT Deuxlmentsperturbentlamesureexactedel'optimisationapporte : 1. les diffrences entre les environnements : pour des raisons conomiques, 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

rduire le risque et de rduire le temps ncessaire la mise en place desdispositifsd'optimisation.

10/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. Afin d'tablirdes pistesde solutions tudier,il convient de mesurer l'utilisation des diffrentes ressources cites cidessus afin de dterminer quelles sont celles qui sont exploites de manire trop intense. Ces mesures servent aussi comprendre sous quelles 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 sollicitepermetncessairementd'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. Les ressourcesmatriellesdoiventsystmatiquementtreanalysesavant 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 duphnomnedeSWAPquifaitporterlexcdentdemmoireutilise parledisquedurlorsquelaRAMdisponibleestinsuffisante.

11/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 par excellence.TOPproduitunelistedesprocessusactifsduserveur,et dtaille leur consommation de temps processeur (CPU) et de mmoire(RAM).Ilindiquegalementlachargemoyennedusystme sur trois priodes : 1 minute, 5 minutes et 15 minutes. Si cet outil ne permetpasdeconnatredirectementl'origineduproblme,cechiffre aide confirmer s'il s'agit d'un pic d'activit ou bien si la machineest saturedepuisuncertaintemps. NOTE : Il est noter que 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 des priphriques entre/sortie en observant leur temps dactivit par rapport leur taux de transfert. Cette commande est souvent utile pourharmoniserlachargelecture/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, les processus qui consomment le plus de lecture et dcriture survotresystme. 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

NOTE :Cenestpasloutilleplusprcis,maisilesttrspratiquepour

comparer rapidement diffrentes mesures du systme. De plus, il permetaismentderaliserdeslogsanalysablessuruntableurcomme Excel.

1.2.2 - Etablir les premires pistes d'optimisations - les outils client


1.WEBPAGETEST.ORG Webpagetest.org est un site Internet permettant de faire un audit du chargementdunepageweb.Onretrouvelediagrammechronologique deslmentstlchargs,lachecklistdespointscourantsoptimiser, unrendudelapageavecuneimageauboutdequelquessecondeset desgraphiquesrsumantleslmentsrcuprs. 2.FIREBUG Firebug est une plugin de Firefox apprci des dveloppeurs web. Il permet d'inspecter le code HTML en ciblant directement llment danslapage,d'diterlestyleCSSpourtesterlersultatdirectement, debuggerlejavascriptavecdespointsdarrtsetunmodepaspaset espionner le trafic XMLHttpRequest (Ajax). Tout comme webpagetest.org, Firebug permet de disposer dun diagramme chronologie du chargement de la page. Firebug tant un outil local, vouspouvezmmelutiliserpourtestervotreapplicationenphasede dveloppement. 3.YSLOWETPAGESPEED YslowetPageSpeedsontdesextensionsdeFirebug,respectivement dvelopp par Yahoo et Google, permettant d'analyser les performancesdutraficrseaudelapage.Cesextensionsanalysentle code de votre page web et proposent de nombreux conseils doptimisationdevotrecodeHTMLetdevotreserveurweb(utilisation ducacheHTTP,etc...) BON A SAVOIR :Webpagetest.orgetYslowfournissentpeuprsles mmes lments une nuance prs. Webpagetest.org permet de localiser (physiquement) d'o mane la demande. En fonction de ce lieu,lesdiagrammeschronologiquespeuventvarier.

13/56

1.2.3 - Les outils de monitoring


Si vous ne pouvez pas prvoir loccurrence des problmes de performance,ilseraplussimpledeseservirdoutilsdemonitoringafin depouvoiraccderlhistoriquedesmesuresdevosressources. 1.MUNIN Muninpermetdesurveillerlesdiffrentesressourcesdevosserveurs. 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 OpenSourceetilexistedenombreuxpluginspermettantdemesurer dautresressources,tellesque: 1. Lestempsderponse(httpresponsetimes); 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 manire alatoire 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 votre infrastructure. Par exemple, un outil de web analytics permet de connatre approximativement le nombre de visiteurs sur votre plateforme.

14/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 les processus 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

APACHE : La premire piste examiner sont les logs Apache afin d'observer combien consomme chaque requte et rechercher quels sontlespagesoulesfichiersvolumineux.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 affichage lentpourraittrevotreconnexioninternet,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 application neffectue un trs grand nombre de lecture/criture sur le disque (ouvertureetmodificationdefichiers,crationdedocuments,etc),il est probable que MYSQL soit responsable. En effet, les requtes MySQL SELECT peuvent provoquer des accs disque en 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

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 important que de faire la bonne optimisation (celle qui 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.AB abestunoutildvaluationdesperformancesdevotreserveurweb.Il indique le nombre de requtes par seconde que votre application est capabledeprendreencharge.Lesdeuxparamtresprincipauxsontle nombrederequtessimultanesainsiquelenombretotalderequtes effectuer. BON A SAVOIR : Bien quil soit possibledutiliserdautres paramtres pourpasserdesvaleursPOST,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,ilpermetdetester beaucoup d'autres lments annexes (Serveurs de mails, connexion JDBC,etc.). BON A SAVOIR : Jmeter n'mule pas compltement un navigateur (contrairementunoutilcommeslnium).Ilestdoncplusdifficilede crerunjeudetestsquisoitreprsentatifducomportementexactde l'application. 3.SELENIUMGRID(REPRODUCTIONDESCENARIO) Selenium est une boite outils permettant de raliser des tests en simulant lactivit dun ou de plusieurs utilisateurs sur un site web. Grce un plugin Firefox, vous avez la possibilit denregistrer un

17/56

scnario en naviguant sur le site, puis de le rejouer volont, en vrifiantquelaffichagedespagesestconformeauxattentes. SeleniumGridvouspermetdesimulerunemonteenchargedevotre application en jouant plusieurs fois le mme scnario en parallle. Si vousdisposezdesuffisammentderessources,ilvousserapossiblede reproduirelesproblmesdeperformance. 4.BATCHSDEREQUTESSQL Obtenir la liste des toutes les requtes faites la base de donnes pendant lexcution dun scnario reprsentatif, puis le rejouer vous permettra de simuler limpact de lapplication sur la charge de votre serveurdedonnes. 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 mesurerlegaindeperformancegrcevosoptimisations,maisaussi delancerplusieursbatchsenparalllepoursimulerunpicactivit.

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. Dans ce cas,il existe des outils et des dmarches simples permettant dinvestiguerplusenprofondeurlutilisationdesressources: 1.LOGSAPACHE SYMPTOMES :Votresiterpondcorrectemententempsnormal,mais lestempsderponsesedgradentsouslacharge. Les logs Apache tracent toutes les requtes faites au serveur apache. En les configurant correctement, vous aurez la possibilit dobtenir 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

Les requtes contenues dans ce fichier seront donc celles qui mobilisent le plus le serveur, et donc souvent celles qui devront tre optimises. 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 fonction Profiler de Xdebug est un outil qui permet d'analyser les tempsd'excutiondevotrecodePHP.Ilpermetdesavoircombiende temps est pass dans chacune des fonctions du code, et donc de dterminerquellepartiedecodeestmoinsperformante. 4.MYSQLTUNER MysqlTunerestunscriptcritenPerlquivouspermetd'prouverune installationMySQLrapidementetdefairedesrecommandationspour amliorer les performances et la stabilit de la base de donnes. Il produitunrapportdtaillant: lespossibilitsoffertesparlaconfigurationencours; des mtriques telles que le nombre de jointures effectues sansindex,hitratioducache,... des recommandations la fois sur la manire d'excuter les requtes,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 structure relationnelle des bases de donnes recommandent le respect des normes (on parle de base de donnes norme), la complexit de relationentrelesdiffrentestablespeutnuireauxperformances.Ilfaut toujours partir dune base normalise, celleci tant bien 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

grande quantit de requtes ou des requtes avec des rsultats de taille importante, il est possible que soit la raison de la baisse des performancesencasdeforteaffluence. Demaniregnrale,vousdevezveillezenvoyerlemoinsdedonnes possible du serveur de base de donnes vers lapplication. Ecrivez les requtes les plus slectives possibles et faites le maximum dagrgationsdansvosrequtesSQL.

20/56

21/56

Sivousdisposezdunsiteinternetforttraficoudunserveuravecune faible bande passante, vous pouvez apporter des optimisations consistantrduirelefluxquitransiteentrelesiteetlenavigateurdu 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. A cela, il faut ajouter le temps de latence du serveur qui ne rpondra 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 une page 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, notamment si les serveurs sont distants physiquement.

22/56

2.1 - Systme de cache HTTP


Lessystmesdecachepermettentd'viterderechargerdeslments dj tlchargs. Ceci permet d'avoir des allersretours serveur beaucoupplusrapidesoummedelesviter. Lesnavigateursdesvisiteursgrentleurproprecache.Apartquelques options configurables par lutilisateur, le fonctionnement de ce cache est dfini par les paramtres du serveur. Lintrt est de profiter du cachedunavigateurpourviterdercuprerlesfichiersetdonclimiter labandepassanteutiliseparlesnavigateurs.

2.1.1 Gestion des Etags

SYMPTOMES :

La bande passante de votre site est sature, ou le premierchargementdespagesestlentpourlesvisiteurs.

SOLUTION : Par dfaut, la balise HTTP ETag (entity tag) est active, elle permet de ne pas tlcharger 2 fois les mmes fichiers. Chaque ressourcestatique(image,css,js)possdeunidentifiantuniquepour une date de modification donne. Ainsi lors dun second chargement de la page, le navigateur enverra lETag au serveur qui rpondra soit paruncode302Found(trouv,doncnonmodifi)soitparun200OK (envoi du fichier). Ce systme nvite pas les allersretours client serveur, vite de renvoyer le contenu des fichiers, donc vite la consommation de bande passante ainsi que le traitement que doit effectuerleserveur. ATTENTION : Si vous avez une architecture avec plusieurs serveurs vousdevezutilisercetteoptionavecprcaution.Danscecas,lEtagest diffrentpourchaqueserveur.Ilestpossiblequecettebaliseaugmente labandepassantepluttquedelarduire.Cestpourquoicertainoutil demesurevousconseilledeladsactiver.

2.1.2 Date d expiration d une ressource

SYMPTOMES : Malgr les Etags en place, le chargement dune page reste lent. Vous voyez dans Firebug quun grand nombre de fichiers sont chargs par page et que le temps daffichage de votre page est principalementdutempsdelatence. SOLUTION : Pour viter le temps de latence, il existe, pour le serveur

Apache, le mod_expire. Il ajoute une entte HTTP Expires qui indique la date dexpiration dune ressource au navigateur. Tant que cette date nest pas atteinte, le navigateur utilisera directement les donnesquilaencache.Ilnyadoncplusaucuntempsdattente. La stratgie la plus efficace est donc de mettre une dure de vie illimiteetderenommerlaressourcelorsquelleestmodifie. Exempledutilisation:

23/56

Achaquemodificationdunfichier,onenchangelenom:style.1.0.css devient style.1.1.css. Il est aussi possible de modifier lURL dappelen passantunparamtrefictif:style.css?c=1devientstyle.css?c=2.
BON A SAVOIR :Ceprocdesttrsperformantaprslechargement

de la premire page qui ne peut bnficier du cache. De plus, il faut privilgierlarutilisationdesressourcesdanslesdiffrentespages.Par exemple:UtiliserdanstouteslespagesunmmeetuniquefichierCSS.

24/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

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 :Unoutilenlignepermetdecompresserunpeuplus vos images sans dtriorer la qualit. N'hsitez pas l'utiliser sur vos 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.Letemps ncessaire 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.Laminimisationsupprimelesretours laligne,lestabulationsainsiquelescommentaires.Lalecturedeces 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

2.4 - Dporter des ressources


SYMPTOMES : Vous avez effectu toutes les modifications prcdentes,maisqueletempsdaffichagedevotrepageesttoujours longetquelaugmentationdelabandepassantedevotreserveurest 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 votre navigateur.InternetExplorer6nouvreque2connexionssimultanes, loFirefox3enouvre8. Si votre page contient une vingtaine dimages / fichiers CSS / fichiers Javascript, sous Internet Explorer 6, elles seront rparties sur 2 connexions seulement soit 10 ressources charges en srie et non en parallle. Enrpartissantlesressourcessur2nomsdedomainediffrents,ilest possible que le navigateur ouvre jusqu' 4 connexions (ou 16 pour FireFox).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 du serveur). Que le serveur soit le mme ou non, ce temps sera incompressible. De plus, le faitde multiplierle nom de domaine peut entrainer une complexit de maintenance. Il est donc important de calibrerlerapportnombrederessource/nombrededomaine.

2.4.2 - Externaliser les ressources - CDN (Content Delivery Network)


Silabandepassanteestsature,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

Norme maintenue par le consortium W3C. Elle permet de reconstituer une page web grce des balises dans la page qui offrent la possibilit de charger la partie statique directement du serveurCDNetlapartiedynamiqueduserveurweb. Exemple:Sivotresitepossdeunepageolutilisateurseraidentifi avecsonnom,ilvousestimpossibledelastockerdansleCDNcarelle seradiffrentepourtouslesutilisateurs.LESIpermetdidentifiercette zonegnredynamiquementpourstockerlensembleducontenude la page sauf le nom utilisateur. Ce dernier sera rcupr directement du serveur web par le CDN qui lagrgera dans la page envoye au client.

28/56

2.5 - Dernires techniques


SYMPTOMES : 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 leur importancepourl'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


Il existe encore d'autres mthodes pour optimiser la gestion de votre 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 techniques proposes dans les autres parties avant de les prendre en considration.

29/56

30/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,ilpeuttreintressantde stockerl'image,gnreparlecodePHP,pouruneduredtermine pluttquedereffectuerlescalculspourchaqueutilisateur.

3.1.2 - Memcache
Memcache est un systme de cache pour stocker les lments qui concernentlasessiondesutilisateurs,desrsultatsderequtesetc.Il permet dviter dutiliser des ressources du serveur afin 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 Apache


Les processus Apache / PHP utilisent la totalit des ressourcesprocesseur.
SYMPTOMES :

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. APCestconupourstockerlersultatcompildanssoncache.Ainsi, lorsque PHP excute le script, APC lui servira directement le script compil.PHPn'aurapasbesoinderecompilerlescriptetconomisera doncbeaucoupdetemps.

31/56

La simple installation dAPC peut diviser la charge des processus Apache/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 simultanes quilpeutouvrir(c'estdirelenombrederequtesclientauxquellesil peutrpondresimultanment). Danslaplupartdesinstallations,vousutiliserezlesmodulesWorkerou Prefork. Les installations LAMP classiques utilisent par dfaut le module Prefork mais il faut savoir que dautres solutions existent. 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 conviennent pas forcment des sitesayant une forte frquentation. Cesparamtrespeuventbridervotreapplication. BON A SAVOIR : dans le journal 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

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 FileHandlersetlesResultSetsdoiventimprativementtrefermsde 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 fichier User.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

/* * Ajouter la fonction custom_autoload la liste * des fonctions permettant de trouver une classe. */ spl_autoload_register('custom_autoload'); /* Sans autoload, cette instanciation aurait gnr une 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, mais vousincluezalorsdesfichiersquinesontpasutilissdanstous lesscripts,douneconsommationinutiledeRAMetdetemps processeur. Utiliser lautoload est donc fortement recommand, et cette solution estmmeplusefficacequecellequiconsisteinclurelesfichiersla vole,carunrequire_oncedoitvrifiersicefichieratdjinclus ounon.

34/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 aprsquelenavigateurdelutilisateuraaffichlecontenudelapage Internet. Si vous avez un calcul long que vous devez faire chaque fois et que malgr toutes les recommandations que vous avez suivies, vous ne pouvezpasrduireletemps.Ilestprfrabledafficherlapagesanscet lmentpuisdercuprerlersultatsurleserveurensuite. Toutefois, il faut faire attention car certains moteursde recherche ne pourrontpasindexerlecontenudecebloc. NOTE /ATTENTION AUX FRAMEWORKS : Certains frameworks et certains CMS doivent charger un ensemble de modules et doutils avant 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 : Si une page effectue plusieurs appels AJAX,sachezquePHPnepourratraiterlarequtesuivantequunefois que la session aura t libre (fonction session_write_close). En effet,lasessiontantpardfautlibreenfindexcutionduscript,les requtesAJAXpourrontalorstretraitessimultanment.

35/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 de lincrmentersontplusrapides Laboucleforestplusrapidequelabouclewhile Il faut utiliser des guillemets simples au lieu de guillemets doubles Le dveloppement objet est plus lent que le dveloppement procdural Touscesconseilsrsultentdedbatssansfinentredveloppeursde langagesdeprogrammation. Vous trouverez sur Internet des benchmark foison comparant les performancesentreguillemetssimplesetguillemetsdoubles.Etilest 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

37/56

Les principales solutions d'optimisation consistent rduire les cots delecturedestablesMySQL.Troistypesdesolutionssontpossibles: 1. Optimiserlagestiondesindex; 2. Agrgerdesdonnes; 3. Amliorerlesrequtes.

4.1 - Gestion des Index

4.1.1 - Indexation de la BDD

LES SYMPTOMES :votreapplicationsecomportebienlorsquelabase dedonnesestvide.Maislorsquelabasededonnesseremplitavec des 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,lemoteurdelabasededonnesdevoirparcourirunun tous 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. Delamme manirequelebibliothcairevapasserdunejournede recherchequelquesminutes,labasededonnespasseradequelques secondes 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.Unindex occupe 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 performanceapportparunindexdpasselargementsoncot. ANALYSER LES REQUETES : Lorsqueloncrerunindexsurunebase 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

lamliorationestflagrante(onpassedeplusieurssecondesquelques millisecondes). BON A SAVOIR :Silamliorationnestpasflagrante,ilfautvrifierque lindexestbienutilis.Pourcela,onutiliseralacommandeANALYZE 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 les enregistrementssansutiliserdindex.
INDEXER LES COLONNES DES REQUETES LES PLUS FREQUENTES /

LeslogsdeslowqueriesMySQLdevraient mettreenvidencelesrequteslespluslentes.Analysezcesrequtes et vrifiez notamment la partie WHERE et ORDER BY de la requte. Les colonnes utilises devraient tre indexes. Vrifiez galementsivotrerequteeffectueunejointureentreplusieurstables, lesclefstrangresdevraienttreindexes. Loption log_queries_not_using_indexes permet dajouter au logdesdeslowqueriestouteslesrequtesquieffectuentunfull scan.Ellespourrontainsitrerapidementrepres. BON A SAVOIR : Si vous utilisez des tables INNODB, nous vous recommandons vivement de dclarer toutes les clefs trangres. 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

LES PLUS COMPLEXES :

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 ne peutpasutiliserplusieursindexsurlammetablesimultanment.La basededonnesvaalorschercherutiliserlindexleplusefficace(le plus discriminant). Pour ces cas, il est possible dutiliser des index multicolonne. En reprenant lexemple de la bibliothque, on pourrait crer un 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 le choix entre 2 index utiliser. Elle prendra alors gnralement lindex le plus discriminant, cestdire lindex qui dispose du plus grandnombredevaleursdiffrentespourunemmecolonne.Onparle decardinalitdelindex.

39/56

Parexemple,sinotretabledouvragepossdeunecolonneauteur qui contient le nom de lauteur, et une colonne type qui contient soitlivre,soitmagazine,lacardinalitdelindextypeserade 2, alors que la cardinalit de lindex auteur sera gale au nombre dauteurs. Siunebasededonnesalechoixentreles2index,elleprendralindex auteurchaquefois. La cardinalit est estime par la base de donnes au fur et mesure des oprations. Pour les tables MyISAM, si on effectue un trs grand nombredoprationsdesuppression/insertion,lacardinalitdunindex peut tre fausse. La base MySQL prendra alors le mauvais index ce quipeutnuireauxperformances.LacommandeANALYZE TABLE 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 retrouverunouvragedontilnesesouvientpascompltementdutitre. 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.LesindexFULLTEXTpermettentde rechercher 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)


Vous avez appliqu toutesles optimisations cidessus, vous avez cr 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, maisaussilemotgirafe.Lemcanismedevraittresuffisamment souple pour permettre les fautes dorthographe (par exemple

40/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,ilenexisteuneimplmentationPHPdansleZend Framework: http://framework.zend.com/manual/fr/zend.search.lucene.html Lucenestockedesdocumentsetpermetderechercherenfulltext dans le document ou ses mtadonnes. Il permet deffectuer des fuzzysearchesetdesrequtescomplexes. LimplmentationPHPdeLuceneestrelativementlenteparrapport son 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,ApacheSOLRestlasolutiondontvousavez besoin:http://lucene.apache.org/solr/ NOTE : Nous avons prsent Lucene et Apache SOLR, qui sont les solutionslesplusconnues,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'hsitezpasapprofondirlesujetavecla documentationMySQL: http://dev.mysql.com/doc/refman/5.0/fr/mysqlindexes.html

4.2 - Agrgation
La 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'est notamment le cas des applicationsqui prsententdes 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 trspeudecalculfaireaumomentdel'excutiondelarequteafin d'amliorerletempsderponse.

41/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 des donnes proche du temps rel, et peut tre excut rapidement,conditionquelabasededonnessyprte.Ilest possiblequelarequtelaplussimplemetteplusieursminutes, au quel cas il sera impossible de lancer souvent le script sous peinedesaturerleserveur. Excuter une fois par jour : Mme si le script est long, il ne bloquera 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 donnes


4.3.1 - Rduire le nombre de requtes

SYMPTOMES : Votre application effectue pour chaque page un grand

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

Sivotreapplicationeffectueuntropgrandnombrederequtes,labase dedonnespeuttrelaraisondesmauvaisesperformances.Eneffet, endehorsdutempsdexcutiondelarequte,ilfautcompterletemps de latence la base de donnes. Or ce temps de latence nest pas ngligeable,carilestparfoisplusimportantqueletempsdexcution 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 critiques


SYMPTOMES :VotreserveurMySQLestsatur. Pouroptimiserlesappelslabasededonnes,onestsouventtentde traiterenprioritlesrequteslespluslonguestreexcutes. 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 optimises est didentifier lensemble des requtes excutes sur une priode reprsentative (lamise en place du log des slow queries avec 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 imbriques


SYMPTOMES :VotreserveurMySQLestsatur.

43/56

Lexcution de requtes imbriques implique la cration dune table temporaire.Siellepeuttrevite(cenestpastoujourslecas),ilvaut mieuxeffectuerdesjointures. 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 u JOIN 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

4.4 - Dnormalisation du modle de donnes


Unbonmodlededonnesdoittrefacilemaintenir.Pourcela,une donnenedoittreprsentequunendroitdanslabase.Onditalors quelabaseestsoussaformenormale. Imaginonsunebasededonnescontenantdesproduitsachetsetdes utilisateurs. La table liant les produits aux utilisateurs sera sous sa forme normale si elle contient une clef trangre vers les tables des utilisateursetdesproduits: Utilisateurs Achats Produits Name User_id Product_id Id Name Id 1 John 1 2 1 TV Bob 2 1 2 Radio 2 Si on souhaite obtenir la liste des achats, on effectuera une requte avec probablement deux jointures pour rcuprer le nom des utilisateursetdesproduits. Laformednormaliseserait: Utilisateurs Achats Produits Id Name User Product Id Name 1 John John Radio 1 TV 2 Bob Bob TV 2 Radio Cetteformeseraplusefficacerequter,puisquelabasededonnes naurapasdejointuresfaire. Enrevanche,souscetteforme,labasededonnesestbeaucoupplus duremaintenir.Siunproduitchangedenomparexemple,ilfaudra modifiersonnomdanstousleschampsdnormalissdelabase,cequi estcomplexe,etaussilong! BONNE PRATIQUE : Il vaut mieux toujours partir dun modle normalis et ne dnormaliser que lorsque les problmes de performance sont constats. En effet, la dnormalisation complexifie lamaintenanceducodeetdevraittrevitesipossible. La dnormalisation sera par contre la rgle pour accder des techniques plus avances comme les bases de donnes multidimensionnelles. Dans ce cas, on devra en effet commencer construire une vue entirement dnormalise de la base avant de remplirlabasededonnesmultidimensionnelle. NOTE : Dautres bases de donnes comme les bases de donnes NoSQLreposentsurdesmodlesmoinsstrictsetmoinsnorms(donc plusdnormaliss).Nousnaborderonscependantpaslesujetdansce livreblanc,lesujetmritantluiseulsonproprelivre!

45/56

4.5 - Base de donnes Multidimensionnelles


Lagrgationdedonnesdansdestablesdagrgatspermetdoffrirdes statistiques rapidement. Cependant, cette approche peut tre limite silesstatistiquesproduiresonttrsdiverses. Prenons lexemple classique suivant: vous disposez de plusieurs magasins dans le monde. Chacune des ventes est logue dans une table 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 est encombredetablesdagrgatsdifficilesmaintenir. 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 appelle calculer le cube multidimensionnel). On pourra alors interroger la base instantanmentsoustoutessesdimensions(cestdiresoustousles axes 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: Vousavezdesproblmesdeperformancesurunaffichagede statistiques; Cesproblmesdestatistiquessontduslavolumtriedevos donnes; Vous ne savez pas priori quelles statistiques seront ncessaires 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 open source Microsoft Analysis Services: la base de donnes multidimensionnelledeMicrosoft Essbase:labasededonnesmultidimensionnelledeOracle SAS OLAP Server: le serveur de base de donnes multidimensionnellefournitparlasuiteSASdanalyseBI.

46/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. MySQLestunebaseproposantplusieursmoteursdegestiondestables en son sein, les plus connus tant MyISAM et InnoDB. Chacun de ces moteurs possde des performances et des paramtres doptimisation 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. A contrario, MyISAM est le seul proposer un index fulltext. Si vous avez 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 ces propresrestrictions,notammententermesdebackup.Enutilisantles deuxmoteurs,vouscumulezlesdeuxlimitations. En termes de performance, chaque moteur possde ses caractristiques propres.Si vous avez choisi MyISAMou InnoDB pour 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. Dun point de vue des performances uniquement, il se diffrencie sur deuxgrandspoints:ildisposedunjournal,etilsupportelerowlevel locking. Pourunebasededonnes,unjournalestunespacedanslequellabase vacriretouteslesactionsdcritureeffectues.Danslapratique,cela signifie que les actions sont crites 2 fois. Bien sr, dun point de vue des performances, cela a un cot puisque les donnes sont crit en double. Cependant, cest la seule manire de permettre de grer des transactions (deffectuer des rollbacks), et surtout, cela garanti de toujours 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

contrario, InnoDB ne bloque que les lignes (le fameux rowlevel locking). Ainsi, InnoDB est plus efficace que MyISAM pour les applications hauteconcurrencedaccs(typiquementuneapplicationweb). InnoDB possde cependant des limitations quil est bon 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 plus stable.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.html Mme si cette liste est longue, si vous souhaitez faire du finetuning MySQL, nous vous conseillons de la parcourir en entier, certains paramtresayantdesimpactssurdautres. 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 donnes retournerauneerreur(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 section Autres paramtrages Apache PHP). NOTE : la commande SHOW STATUS MySQL permet de voir le nombre maximal de connections simultanes ouvertes sur le serveur,

48/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 configurationdeInnoDB,celuicicrittouteslestablesdanslemme fichier, ou crit une table par fichier (suivant la valeur du paramtre innodb_file_per_table).

4.6.4 - Nombre de threads


Vous disposez dun serveur trs puissant (plus de 8 curs).MySQLnesaturepasleCPU,maisceluiciplafonne20%ou 40% de la puissance maximum. Les autres ressources (disque / RAM) ne saturent pas non plus. Le serveur semble ne pas donner tout son potentiel. Pardfaut,MySQLn'ouvrepasplusde8threadspourInnoDB. Leparamtrergissantcecomportementest 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.
SYMPTOMES :

4.6.5 - Log file

SYMPTOMES :LedisquedurdevotreserveurMySQLsatureencriture

cause dun grand nombre de commandes INSERT / UPDATE / DELETE. Lorsqu'un utilise InnoDB, MySQL crit un journal. Comme expliqu prcdemment, l'ide du journal 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 en mode MyISAM). Il existe dans MySQL des paramtres permettant d'assouplirl'crituredanslejournal(parexempledefairelcritureune fois par seconde plutt qu' chaque UPDATE ou INSERT). Le

49/56

paramtre innodb_flush_log_at_trx_commit rgit 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 performanceoptimizationbasics/

ce

50/56

51/56

Lorsque la mise en place d'une des solutions 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 consistent augmenterlenombredeserveurs. Cette partie prsente quels sont les moyens d'amliorer les performances de votre application grcel'augmentationdescapacits matrielles.

5.1 - Upgrade
Leprincipedelupgradedesserveursestsimple.Ils'agit d'augmenter de faon constante les performances physiques de sa machine: rajouter de la RAM, augmenter la taille des disques ou ajouter des disques, augmenter la puissance du ou des processeurs, utiliser un systme multicurs Ces 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 capable dabsorberuneplusgrandecharge. 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 de clustering.

52/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,contenantlapplicationPHP,duserveurMYSQLcontenantle 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 une autre raison pour mettre en place cette optimisation : la solution 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.

53/56

NOTE :lamaintenancedelasolutiondevientpluscomplexedufaitque lesmodificationseffectuessurunserveurdoiventtrediffusesvers touslesautres.

5.2.3 - SQL Master / Slave


Dans la plupart des cas dutilisation dun serveur MYSQL, les requtes effectues sont des requtes de lecture, de rcupration de listes de produits, dinformations personnelles, Ces demandes frquentes surchargent les serveurs MYSQL qui doivent grer par ailleurs les requtesdinsertion(INSERT)etdemisejour(UPDATE). Une nouvelle solution doptimisation darchitecture matrielle est de ddier diffrents serveurs MYSQL des actions prcises. Un serveur matre gre alors toutes les requtes dINSERT et dUPDATE, et un serveuresclavegretouteslesrequtesdeslection.Ainsilachargedu SGBD sera partage entre plusieurs serveurs. Pour conserver une cohrence de donnes, le serveur esclave est rpliqu du serveur matreentempsrel. BON A SAVOIR :Unesolutionquin'amliorepaslesperformancesmais qui augmente la robustesse de la solution est le SQL Clustering. Le principe est de mettre disposition un nouveau serveur SQL si le principal nest plus disponible (crash, maintenance, ). Cette architectureestbasesurunerplicationautomatiquedesdonnesdu SystmedeGestiondeBasedeDonnes.Leserveurcourantestalors utilispourgrerlensembledesactionsduserveurweb,pendantque le serveur de backup ne fait que recopier les actions effectues sur le principal. L'avantage est que ce systme peut tre coupl une utilisationdesinstancesmaster/slave.

54/56

5.3 - Cloud Computing

Pour simplifier, le Cloud Computing peut tre dfini comme le moyen dexcuter des tches de calcul en parallle sur diffrents serveur. Ce qui est interessant dans le cadre de l'amlioration des performances, est la faon dutiliser cette puissance de calcul dynamiquement,enfonctiondelachargeserveur. IlesttrsfrquentquunsiteInternetsoitsoumisdespicsdactivit; decefait,ilnestpasforcmentncessairedepossderunestructure matriellemaximalependantlespriodesdactivitfaible,oumoindre, de votre site Internet. Le principe volutif du Cloud Computing comme le propose Amazon (AWS EC2), est de mettre disposition del'applicationuneforcedecalculsupplmentaire(imagedevotresite web) quand vous en avez besoin. Ce besoin trs spcifique peut tre dfinidediffrentesfaons:lutilisationduCPUduserveur,lacharge mmoireduserveuroutoutesautresdonnesrelativelutilisationet lachargeduserveurweb.Toutescesdonnespeuventtresurveilles afin de dclencher l'utilisation de nouvelles ressources matrielles. Ainsi,votreinfrastructuresadapteraautomatiquementvotrebesoin. BON A SAVOIR :Cemouvements'accompagnedesbasesdedonnes NoSQL.Cesbasesdedonnessontmoinssimplesrequtermaiselles sedupliquentfacilement.Enfait,cesbesoinssonttirsparlesgants du Web (Google, Amazon ...) qui ont besoin de rechercher des informationsquinesontpasncessairementstructures.

55/56

56/56

Vous aimerez peut-être aussi