Performance Analysis and Tuningは、お客様にとって強力なパフォーマンスコンプライアンスチェックツールです。
パフォーマンス分析は、チューニング実験を検証するための科学的アプローチを採用して、プログラムのボトルネックをチェックするために使用できます。この記事では、Go Webサーバーを例として使用して、パフォーマンス分析とチューニングの一般的なアプローチを定義します。
Goはpprof、標準ライブラリにプロファイリングツールがあるため、ここで特に適しています。

戦略
構造解析用のピボットリストを作成しましょう。直感や当て推量に基づいて変更を加えるのではなく、一部のデータを使用して決定を下そうとします。これを行うには、これを実行しましょう:
- 最適化の境界(要件)を定義します。
- システムのトランザクション負荷を計算します。
- テストを実行します(データを作成します)。
- 私達が見ている;
- 分析します-すべての要件が満たされていますか?
- 科学的な方法で設定し、仮説を立てます。
- .

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