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 pprof
dans 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-, 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, .
—
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 , , .