Analisis dan Tuning Kinerja adalah alat validasi kepatuhan kinerja yang kuat untuk pelanggan.
Analisis kinerja dapat digunakan untuk menguji kemacetan dalam suatu program, mengambil pendekatan ilmiah untuk memvalidasi eksperimen tuning. Artikel ini menjelaskan pendekatan umum untuk analisis dan penyetelan performa, menggunakan server web Go sebagai contoh.
Go sangat cocok di sini karena memiliki alat pembuatan profil pprofdi pustaka standar.

Strategi
Mari buat daftar pivot untuk analisis struktural kita. Kami akan mencoba menggunakan beberapa data untuk membuat keputusan alih-alih membuat perubahan berdasarkan intuisi atau dugaan. Untuk melakukan ini, mari lakukan ini:
- Kami mendefinisikan batas-batas pengoptimalan (persyaratan);
- Kami menghitung beban transaksi untuk sistem;
- Kami menjalankan tes (membuat data);
- Kami sedang menonton;
- Kami menganalisis - apakah semua persyaratan terpenuhi?
- Menyiapkan secara ilmiah, membuat hipotesis;
- .

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