SRE: Leistungsanalyse. Setup-Methode mit einem einfachen Go-Webserver

Die Leistungsanalyse und -optimierung ist ein leistungsstarkes Tool zur Validierung der Leistungskonformität für Kunden.



Die Leistungsanalyse kann verwendet werden, um auf Engpässe in einem Programm zu testen, wobei ein wissenschaftlicher Ansatz zur Validierung von Tuning-Experimenten verfolgt wird. Dieser Artikel definiert einen allgemeinen Ansatz für die Leistungsanalyse und -optimierung am Beispiel eines Go-Webservers.



Go eignet sich hier besonders gut, da es pprofin der Standardbibliothek Profiling-Tools enthält .





Strategie



Erstellen wir eine Pivot-Liste für unsere Strukturanalyse. Wir werden versuchen, einige der Daten zu verwenden, um Entscheidungen zu treffen, anstatt Änderungen aufgrund von Intuition oder Vermutungen vorzunehmen. Dazu tun wir Folgendes:



  • Wir definieren die Grenzen der Optimierung (Anforderungen);
  • Wir berechnen die Transaktionslast fĂĽr das System;
  • Wir fĂĽhren den Test durch (Daten erstellen);
  • Wir beobachten;
  • Wir analysieren - sind alle Anforderungen erfĂĽllt?
  • Auf wissenschaftliche Weise aufbauen, eine Hypothese aufstellen;
  • .




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