Softshake 2015 comment tester et optimiser la performance d'un si

Preview:

Citation preview

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é

recrutement@octo.com

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