Performance Analysis and Tuning é uma ferramenta poderosa de validação de conformidade de desempenho para clientes.
A análise de desempenho pode ser usada para verificar se há gargalos em um programa, usando uma abordagem científica para validar experimentos de ajuste. Este artigo define uma abordagem geral para análise e ajuste de desempenho, usando um servidor da Web Go como exemplo.
Go é particularmente adequado aqui porque tem ferramentas de criação de perfil pprofna biblioteca padrão.

Estratégia
Vamos criar uma lista dinâmica para nossa análise estrutural. Tentaremos usar alguns dos dados para tomar decisões em vez de fazer alterações com base na intuição ou suposições. Para fazer isso, vamos fazer o seguinte:
- Definimos os limites da otimização (requisitos);
- Calculamos a carga da transação para o sistema;
- Executamos o teste (criamos dados);
- Nós estamos observando;
- Nós analisamos - todos os requisitos são atendidos?
- Configurando de forma científica, fazendo uma hipótese;
- .

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