SRE: Analisis Kinerja. Metode penyiapan menggunakan server web Go sederhana

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