SRE: Analyse des performances. Méthode de configuration à l'aide d'un simple serveur Web Go

L'analyse et le réglage des performances est un puissant outil de validation de la conformité des performances pour les clients.



L'analyse des performances peut être utilisée pour tester les goulots d'étranglement dans un programme, en adoptant une approche scientifique pour valider les expériences de réglage. Cet article définit une approche générale de l'analyse et du réglage des performances, en utilisant un serveur Web Go comme exemple.



Go est particulièrement bien adapté ici car il dispose d'outils de profilage pprofdans la bibliothèque standard.





Stratégie



Créons une liste pivot pour notre analyse structurelle. Nous essaierons d'utiliser certaines des données pour prendre des décisions au lieu de faire des changements basés sur l'intuition ou des conjectures. Pour ce faire, faisons ceci:



  • Nous définissons les limites de l'optimisation (exigences);
  • Nous calculons la charge de transaction pour le système;
  • Nous exécutons le test (créons des données);
  • Nous observons;
  • Nous analysons - toutes les exigences sont-elles satisfaites?
  • Se mettre en place de manière scientifique, faire une hypothèse;
  • .




HTTP



HTTP Golang. .



— HTTP-, Postgresql . Prometheus, node_exporter Grafana .





, ( ) :







. ? , ? , , 10 000 .



Google SRE Book . , :



  • : 99% 60;
  • : , . ;
  • : , , , n+1.


, . SRE SLO \ , . - !





. .





Vegeta HTTP, :



$ make load-test LOAD_TEST_RATE=50
echo "POST http://localhost:8080" | vegeta attack -body tests/fixtures/age_no_match.json -rate=50 -duration=0 | tee results.bin | vegeta report




. ( , ) (, CPU, IOPS) , , , .





— , . :





, . Go (pprof) flame graph, . .



, , .



. , , . , . , . : make load-test LOAD_TEST_RATE=X.



50





. , 50 ( ), — . : . HTTP Request Latency SLO 60. , .



:



10000 / 50 = 200 + 1



.



500



, 500 :





, . — , . , , 500 25-40. 99 SLO 60, .



:



10000 / 500 = 20 + 1



.



1000





! , 1000 , SLO. p99 . , p100 , 60. , , .





1000 , pprof , , . HTTP endpoint pprof, curl:



$ curl http://localhost:8080/debug/pprof/profile?seconds=29 > cpu.1000_reqs_sec_no_optimizations.prof


:



$ go tool pprof -http=:12345 cpu.1000_reqs_sec_no_optimizations.prof




, . Brendan Gregg:



X — , ( ), Y , [top]. — . — . — CPU, — . , , , .




. . , , , , , , , .



Brendan Gregg . ( ). — , ( ). :





— , . HTTPServe 65% , runtime, runtime.mcall, mstart gc, . : 5% DNS:





, , Postgresql. FindByAge:





, , , : \ , . , DNS, 13% .



: HTTP, .





, Postgresql . — . sql go:



db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)

if err != nil {
   return nil, err
}


, ,



1000 , p99 SLO 60!



?



10000 / 1000 = 10 + 1



!



2000





, , 2000 , p100 60, p99 SLO.



:



10000 / 2000 = 5 + 1



3000





3000 p99 60. SLO , :



10000 / 3000 = 4 + 1 ( , . )



.





3000 :





6% . , , .



: , , , . , .





MaxIdleConns ( ):



db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
db.SetMaxIdleConns(8)
if err != nil {
   return nil, err
}


, ,



3000





p99 60 p100!





flame graph , ! pg(*conn).query — .







, . , , — . Go , , .




All Articles