Améliorez les performances de vos projets web

download Améliorez les performances de vos projets web

of 56

Transcript of Améliorez les performances de vos projets web

  • 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.html
  • 8/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.html
  • 8/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.html
  • 8/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_concurrency
  • 8/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_commit
  • 8/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