SRE: Análise de desempenho. Método de configuração usando um servidor da web Go simples

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