SRE:パフォーマンス分析。シンプルなGoウェブサーバーを使用したセットアップ方法

Performance Analysis and Tuningは、お客様にとって強力なパフォーマンスコンプライアンスチェックツールです。



パフォーマンス分析は、チューニング実験を検証するための科学的アプローチを採用して、プログラムのボトルネックをチェックするために使用できます。この記事では、Go Webサーバーを例として使用して、パフォーマンス分析とチューニングの一般的なアプローチを定義します。



Goはpprof、標準ライブラリにプロファイリングツールがあるため、ここで特に適しています。





戦略



構造解析用のピボットリストを作成しましょう。直感や当て推量に基づいて変更を加えるのではなく、一部のデータを使用して決定を下そうとします。これを行うには、これを実行しましょう:



  • 最適化の境界(要件)を定義します。
  • システムのトランザクション負荷を計算します。
  • テストを実行します(データを作成します)。
  • 私達が見ている;
  • 分析します-すべての要件が満たされていますか?
  • 科学的な方法で設定し、仮説を立てます。
  • .




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