SRE: Análisis de desempeño. Método de configuración utilizando un servidor web Go simple

Performance Analysis and Tuning es una poderosa herramienta de validación de cumplimiento de desempeño para los clientes.



El análisis de rendimiento se puede utilizar para probar cuellos de botella en un programa, adoptando un enfoque científico para validar experimentos de ajuste. Este artículo define un enfoque general para el análisis y el ajuste del rendimiento utilizando un servidor web Go como ejemplo.



Go es especialmente adecuado aquí porque tiene herramientas de creación de perfiles pprofen la biblioteca estándar.





Estrategia



Creemos una lista dinámica para nuestro análisis estructural. Intentaremos utilizar algunos de los datos para tomar decisiones en lugar de realizar cambios basados ​​en intuiciones o conjeturas. Para hacer esto, hagamos esto:



  • Definimos los límites de optimización (requisitos);
  • Calculamos la carga de transacciones para el sistema;
  • Ejecutamos la prueba (creamos datos);
  • Estamos viendo;
  • Analizamos: ¿se cumplen todos los requisitos?
  • Establecer de manera científica, hacer una hipótesis;
  • .




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