softshake 2015 comment tester et optimiser la performance d'un si
TRANSCRIPT
Commenttesteretoptimiserlaperformanced'unSI?
22octobre2015
MarcBOJOLY
CyrilPICAT
OCTOTechnologyLausanne,consultant
OCTOTechnologyParis,manageretconsultantCo-fondateurduPerformanceUserGroupParis
Leprojet:migrationd'unebanqueversunenouvelleplateformetitres
Quelqueschiffres
Clients:x10
Portefeuillestitres:x5
Positions:x3
Titres:+50%
OrdresdeBourse:x2
Leprojet:migrationd'unebanqueversunenouvelleplateformetitres
Autantattendrelamiseenproduction...
Méconnaissances
Nierl'existenceduproblème Onabientravaillé,çavapasser
Nierl'existencedesolutions C'estimpossibleàtestersaufenprod
Nierlafiabilitédessolutions Lachargeneserapasreprésentative
Mettreendoutesescapacités
Onn'yarriverajamais
Idéesreçuessurlespré-requis
Unepré-productionidentiqueàlaproductionSimulerl'ensembledesactivitésdelabanque
Idéesreçuessurlestestsdecharge
Testerenautomatique?Impossiblemêmeavec<unnomde
produitici>
Idéesreçuessurlediagnostic
Lesproblèmessontsurlemainframe
Cesontdesidéesreçues
Notreobjectif,vousmontrer
commentadaptervospré-requisàvosenjeuxcommentaborderlestestsdechargedansunSIcommentnepasêtrepiégéparlesdiagnosticspréconçus
Dansunmondeparfait...
“Faisdetavieunrêve,etd'unrêveune
réalité.”AntoinedeSaint-Exupéry-Cahiers
deSaint-Exupéry(1900-1944)
Rêve:unevueintégréedelaperformance
Dynatrace
Réalité:Quilefaitauniveaud'unSI?
GoogleDapper
Réalité:Commencerpardesoutilssimples
Analysedelogs(python,pandas...)
Collected'outilssystèmes(nmon,vmstat...)
Rêve:Toutcequ'ilfautpourfairelestests
DesdéveloppementsterminésDesdonnéesmigréesDespersonnesdisponibles....etcolocalisées
Réalité:Lesintangibles
UnenvironnementopérationnelUnjeudedonnéesminimalUnezonedemesureisolée
Pourlereste...
Savoirfixersespriorités
Lesproblèmespeuventsembler
vertigineux
Ilfaut"cadrer"lechantier
FactualiserlesvolumesexistantsetciblesListerlesproblèmesexistantsBrainstormersurlesproblèmespotentiels
Lesproblèmes"usuels"
1. Capacitéentermedenombredetransactions/jour
2. Augmentationdevolumétrie(x2)
3. SLAtempsderéponseend-to-end
4. Lenteursactuelles5. Augmentationdu
nombred'utilisateurs
6. Impactsurladuréedesbatchs
7. Latenceettempsderéponsepourlesutilisateursdistants
Etensuite?
Lacartevousaideàvisualiseretàprioriser,ellene"résout"paslesproblèmes
ChaqueproblèmerestecomplexeetliéauresteduSI
Diviserpourmieuxrégner
2patterns
Diviser/découpler:passerd'untestdeNsystèmesàuntestdek<Nsystèmes(idéalement1)
Simplifier:réduireladimensionnalité(casdetests,donnéesetc.)
Diviser/découpler:unexemple
Diviser/découpler:unexemple
Etmaintenant?
Neprévoyezpasuntestdechargepourtouslesproblèmes!
Penseràd'autresoutils
Analysedel'existant
Modélisationetextrapolation
Testdechargedel'existant(données,systèmes)
Testdechargedelacible(données,systèmes)
Oùpouvez-vousvous"planter"?
Mauvaiseconnaissancedelaperformanceexistante
Mauvaiseconnaissancedesusagesexistants
Bonnespratiquesdetestsdecharges(applicationparapplication)
Délimiterlepérimètretesté
CaruntestdechargeresteuntestautomatiséCaruntestenerreurnesertàrien
Comment?
ChoisissezsoigneusementvotrejeudedonnéesOudéveloppezdesbouchons
Bouchonner
LescomposantsutiliséssystématiquementLeplussimplementpossible
Modéliserscientifiquement
Modéliserlecomportementdemesutilisateurs?
Combiend'utilisateurssimultanés?Qu'est-cequ'unutilisateursimultané?
Modélisationscientifique
LavéritéestenproductionUnmodèle:moyenneETpercentile99th
ExempledeloisdePoisson
Modélisaton:soyezprédictifs
Sivousn'avezpasdestatistiquesproduction,
proposezunmodèledeprévisiondunombred'utilisateurs
Modélisation:soyezprédictifs
Sivousn'avezpasdestatistiquesproduction,
proposezunmodèledeprévisiondeleurutilisation
Modélisation:commentl'utiliser?
Définissezdansvostestsd'injectionlocauxlenombred'utilisateurs"simultanés"etletempsderéflexion
val clientSearchChain = group("client_search_page") { exec(http("client_search_html") .get("""/ebankingAdmin/xxxxx/root/contract/contractlist/""")}).pause(7,8) //Pause between 7 and 8 seconds
val scn = scenario("AdminSimulation").repeat(1) { exitBlockOnFail { exec(loginChain).exec(clientSearchChain)//No logout, 90% of users don't }}
setUp(scn.inject(rampUsers(120).over(60))).protocols(httpProtocol) //This will go from 0 to 120 users in 60 seconds
Testsdechargeparapplication
UnebriquedebasedelaperformanceduSI
Commentfait-onpourmangerunéléphant?
Bouchéeparbouchée.
Maisilfaut(quandmême)testerenend-to-end
DEMOQuizz:quelestletempsderéponsed'uneapplication?
70ms.detraitement
7appelsenbasededonnées,14ms.chacun
curl -X POST \-H "Accept: applicaiton/json" \-H "Content-Type: application/json" \-d '{"cpuIntensiveComputationsDuration":70, "databaseCallsNumber":7, "databaseCallDuration":14 }' \http://$HOST:8080/compute
Tempsderéponse~190ms.
$ ./sh/poc1.sh% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 253 100 161 100 92 789 450 --:--:-- --:--:-- --:--:-- 789Call HTTP Ressources : For an HTTP ressources total of 0.0 ms.Call the database 7 times during 14 ms. each for a total of 118 ms.CPU intensive compute 186 ms.
Détaildel'exécution
10-18 16:32:22 jdbc:/**/CallableStatement call98 = conn7.prepareCall("call sleep(?)");10-18 16:32:22 jdbc: SESSION_PREPARE_READ_PARAMS 3010-18 16:32:22 jdbc:/**/call98.setLong(1, 14L);10-18 16:32:22 jdbc:/**/call98.execute();10-18 16:32:22 jdbc: COMMAND_EXECUTE_QUERY 3010-18 16:32:22 jdbc: RESULT_CLOSE 3110-18 16:32:22 jdbc:/**/call98.close();10-18 16:32:22 jdbc: COMMAND_CLOSE 3010-18 16:32:22 jdbc:/**/conn7.getAutoCommit();10-18 16:32:22 jdbc:/**/conn7.getWarnings();10-18 16:32:22 jdbc:
DEMO&Quizz:quelestletempsderéponsed'unechaîneapplicativedansunSI
?
7applicationsidentiquesàlaprécédente(70ms.detraitement,7x14ms.deBD)
Appelssynchronesséquentiels
curl -X POST \-H "Accept: applicaiton/json" \-H "Content-Type: application/json" \-d '{"cpuIntensiveComputationsDuration":70, "databaseCallsNumber":7, "databaseCallDuration":14, "serviceCalls":[{"computationDescription":{"cpuIntensiveComputationsDuration":70, "databaseCallsNumber":7, "databaseCallDuration":14}, "callsNumber":6 }]}' \http://$HOST:8080/compute
Tempsderéponse:1s.
$ ./sh/poc2.sh % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 1417 100 1171 100 246 881 185 0:00:01 0:00:01 --:--:-- 881Call HTTP Ressources : { Call HTTP Ressources : For an HTTP ressources total of 0.0 ms. Call the database 7 times during 14 ms. each for a total of 113 ms. CPU intensive compute 68ms.{,{ Call HTTP Ressources : For an HTTP ressources total of 0.0 ms.
DEMO&Quizz:quelestletempsderéponsedelamêmechaînedansune
modélisationplusprochedelaréalité?
ImplémentationdeceQuizz
Diokles:AnInformationSystemscaleperformancesimulator
https://github.com/mbojoly/diokles
$ sudo docker-machine ssh default $$ sudo tc qdisc add dev docker0 root netem delay 10ms $$ sudo tc qdisc show dev docker0 $$ #After demo $$ sudo tc qdisc del root dev docker0
Tempsderéponse:3s.
$ ./sh/poc2.sh % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1417 100 1171 100 246 328 69 0:00:03 0:00:03 --:--:-- 328 Call HTTP Ressources : { Call HTTP Ressources : For an HTTP ressources total of 0.0 ms. Call the database 7 times during 14 ms. each for a total of 394 ms. CPU intensive compute 69ms. {, { Call HTTP Ressources : For an HTTP ressources total of 0.0 ms. Call the database 7 times during 14 ms. e
L'outilutilisé
Desproblèmes"mineurs"peuventdevenircritiquesàl'échelled'unSI
LatenceN+1SQLrequêtesN+1appelsàdesapplicationsexternes
Lestests"end-to-end"sontobligatoirescarcertainsrésultatspeuventdéfierl'intuition
Boîteàoutilspourlestests"end-to-end"
Disclaimer
Lestestsend-to-endsontcomplexes.Cecineseveutpasuneméthodesystémiquemaisuninventaired'outilsàdisposition,ainsiqu'unREXsurleurefficacité
Outil#1:Analysedelaproductionexistante
Analysedeslatencesentresystèmes
Identificationdugouletd'étranglement
Découvertedesproblèmesdedesign
Évaluationdelacapacitédusystème
Outil#1:Analysedelaproductionexistante
Exempledel'évaluationdelacapacitédusystème
Outil#1:Analysedelaproductionexistante
Exempledel'évaluationdelacapacitédusystème
Outil#1:Analysedelaproductionexistante
Exempledel'évaluationdelacapacitédusystème
Outil#1:Analysedelaproductionexistante
Exempledel'évaluationdelacapacitédusystème
Outil#1:Analysedelaproductionexistante
Exempledel'évaluationdelacapacitémaximaledusystème
Outil#1:attentionauxchiffres!
Volume Tempsderéponsemoyen
1000transactions 15s
2000transactions 40s
Outil#1:attentionauxchiffres!
Outil#2:Benchmarkunitaire
Définition:mesuredelaréponseàunetransactionunitaire
Outil#2:Benchmarkunitaire
Exempled'analyse
Outil#3:lepicdetransactions
Outil#3:lepicdetransactions
Exempled'analyse
Outil#4:"rejeu"d'unejournéedeproduction
simplifiéebiensûr!
Outil#5:mettreenproduction
Toutcequipeutêtremisenproductionparavancedoitl'être
Pensezvotrestratégiedemigrationpourmonterenchargeprogressivement
Inspirez-vousdes"GéantsduWeb"
Take-away
Faitesdestests,mêmeimparfaitsMesurezscientifiquementRevenez-enàdesproblèmessimplesExtrapolez,enayantconsciencedeslimites
"Touslesmodèlessontfaux,certainssontutiles"
Sicelavousaintéressé
Sources
Touslesslides:icônes(c)OCTOTechnology(2015)
:
: et
:
:
:
:
:
:
:
:
:
Autantattendrelamiseenproduction Morguefile
Vivresesrêvess ginacn.blogspot.fr Wikipedia
APM OutilDynatrace
GoogleDapper Dapper,aLarge-ScaleDistributedSystemsTracingInfrastructure
Bonnespratiques GéantsduWeb,l'obsessiondelamesure
Exemplesdeloisdepoisson Wikipedia
Cycledediffusiondel'innovation Wikipedia
TrafficsurInternet Libstat
Testsend-to-end Youtube:SpectacularDominoRallyStuntScreenLink4:51
Touslesmodèlessontfauxcertainssontutiles Morguefile
TheOCTOWay (c)OCTOTechnology2015