Académique Documents
Professionnel Documents
Culture Documents
Ameliorez Les Performances de Vos Projets Web
Ameliorez Les Performances de Vos Projets Web
Introduction
De
l'importance
de
mettre
en
place
un
plan
2/56
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.
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.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
10/56
11/56
12/56
NOTE :Cenestpasloutilleplusprcis,maisilesttrspratiquepour
13/56
14/56
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
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.
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
SYMPTOMES :
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.
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
SYMPTOMES :
Vous voyez dans Firebug quun grand nombre de fichiers sont chargs par page et que le temps daffichage de votre pageestprincipalementdutempsdelatence.
25/56
SYMPTOMES :
26/56
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.
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
29/56
30/56
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
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.
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
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.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
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.
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
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!
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.
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
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)){ // ... }
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') ) )
44/56
45/56
46/56
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.
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).
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
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
53/56
54/56
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