¿Cómo perfilar puntos de referencia utilizando la herramienta pprof?
-
21-12-2019 - |
Pregunta
Yo quiero perfil mis puntos de referencia generados por go test -c
, pero el go tool pprof
necesita un archivo de perfil generalmente generado dentro de la función principal como este:
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
¿Cómo puedo crear un archivo de perfil dentro de mis puntos de referencia?
Solución
Como se describe en http://golang.org/cmd/go/#hdr-Description_of_testing_flags puede especificar el archivo de perfil usando la bandera -cpuprofile
.
Por ejemplo
go test -cpuprofile cpu.out
Otros consejos
Utilizar el -cpuprofile
bandera a go test
como se documenta en http://golang.org/cmd/go/#hdr-Description_of_testing_flags
Esta publicación explica cómo perfilar los puntos de referencia con un ejemplo: Perfilado de referencia con pprof.
El siguiente punto de referencia simula parte del trabajo de la CPU.
package main
import (
"math/rand"
"testing"
)
func BenchmarkRand(b *testing.B) {
for n := 0; n < b.N; n++ {
rand.Int63()
}
}
Para generar un perfil de CPU para la prueba comparativa, ejecute:
go test -bench=BenchmarkRand -benchmem -cpuprofile profile.out
El -memprofile
y -blockprofile
Las banderas se pueden utilizar para generar asignación de memoria y bloquear perfiles de llamadas.
Para analizar el perfil utilice la herramienta Ir:
go tool pprof profile.out
(pprof) top
Showing nodes accounting for 1.16s, 100% of 1.16s total
Showing top 10 nodes out of 22
flat flat% sum% cum cum%
0.41s 35.34% 35.34% 0.41s 35.34% sync.(*Mutex).Unlock
0.37s 31.90% 67.24% 0.37s 31.90% sync.(*Mutex).Lock
0.12s 10.34% 77.59% 1.03s 88.79% math/rand.(*lockedSource).Int63
0.08s 6.90% 84.48% 0.08s 6.90% math/rand.(*rngSource).Uint64 (inline)
0.06s 5.17% 89.66% 1.11s 95.69% math/rand.Int63
0.05s 4.31% 93.97% 0.13s 11.21% math/rand.(*rngSource).Int63
0.04s 3.45% 97.41% 1.15s 99.14% benchtest.BenchmarkRand
0.02s 1.72% 99.14% 1.05s 90.52% math/rand.(*Rand).Int63
0.01s 0.86% 100% 0.01s 0.86% runtime.futex
0 0% 100% 0.01s 0.86% runtime.allocm
El cuello de botella en este caso es el mutex, causado por la sincronización de la fuente predeterminada en math/rand.
También son posibles otras presentaciones de perfiles y formatos de salida, p. tree
.Tipo help
para más opciones.
Tenga en cuenta que también se perfilará cualquier código de inicialización anterior al ciclo de referencia.