性能分析和调整是针对客户的功能强大的性能合规性检查工具。
性能分析可用于检查程序中的瓶颈,采用科学的方法来验证调整实验。本文以Go网络服务器为例,定义了一种用于性能分析和调整的通用方法。
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 , , .