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