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-, 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 , , .