Go
Perfilado usando la herramienta go pprof
Buscar..
Observaciones
Para más información sobre los programas go, visite el blog go .
Perfil básico de cpu y memoria.
Agregue el siguiente código en su programa principal.
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile `file`")
var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal("could not create CPU profile: ", err)
}
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()
}
...
if *memprofile != "" {
f, err := os.Create(*memprofile)
if err != nil {
log.Fatal("could not create memory profile: ", err)
}
runtime.GC() // get up-to-date statistics
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal("could not write memory profile: ", err)
}
f.Close()
}
}
después de eso, construya el programa go si se agrega en main go build main.go
Ejecute el programa principal con los indicadores definidos en el código main.exe -cpuprofile cpu.prof -memprof mem.prof
. Si se realiza el perfilado para los casos de prueba, ejecute las pruebas con los mismos indicadores go test -cpuprofile cpu.prof -memprofile mem.prof
Memoria básica de perfiles
var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
func main() {
flag.Parse()
if *memprofile != "" {
f, err := os.Create(*memprofile)
if err != nil {
log.Fatal("could not create memory profile: ", err)
}
runtime.GC() // get up-to-date statistics
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal("could not write memory profile: ", err)
}
f.Close()
}
}
go build main.go
main.exe -memprofile mem.prof
go tool pprof main.exe mem.prof
Establecer la tasa de perfil de CPU / bloque
// Sets the CPU profiling rate to hz samples per second
// If hz <= 0, SetCPUProfileRate turns off profiling
runtime.SetCPUProfileRate(hz)
// Controls the fraction of goroutine blocking events that are reported in the blocking profile
// Rate = 1 includes every blocking event in the profile
// Rate <= 0 turns off profiling
runtime.SetBlockProfileRate(rate)
Uso de puntos de referencia para crear perfil
Para un paquete no principal y principal, en lugar de agregar indicadores dentro del código , escriba puntos de referencia en el paquete de prueba, por ejemplo:
func BenchmarkHello(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Sprintf("hello")
}
}
A continuación, ejecute la prueba con la bandera de perfil
ir prueba -cpuprofile cpu.prof -bench =.
Y los puntos de referencia se ejecutarán y crearán un archivo prof con el nombre de archivo cpu.prof (en el ejemplo anterior).
Accediendo al archivo de perfil
Una vez que se ha generado un archivo prof, se puede acceder al archivo prof con las herramientas go :
ir herramienta pprof cpu.prof
Esto entrará en una interfaz de línea de comandos para explorar el profile
Los comandos comunes incluyen:
(pprof) top
Enumera los procesos principales en la memoria.
(pprof) peek
Enumera todos los procesos, usa expresiones regulares para restringir la búsqueda.
(pprof) web
Abre un gráfico (en formato svg) del proceso.
Un ejemplo del comando top
:
69.29s of 100.84s total (68.71%)
Dropped 176 nodes (cum <= 0.50s)
Showing top 10 nodes out of 73 (cum >= 12.03s)
flat flat% sum% cum cum%
12.44s 12.34% 12.34% 27.87s 27.64% runtime.mapaccess1
10.94s 10.85% 23.19% 10.94s 10.85% runtime.duffcopy
9.45s 9.37% 32.56% 54.61s 54.16% github.com/tester/test.(*Circle).Draw
8.88s 8.81% 41.36% 8.88s 8.81% runtime.aeshashbody
7.90s 7.83% 49.20% 11.04s 10.95% runtime.mapaccess1_fast64
5.86s 5.81% 55.01% 9.59s 9.51% github.com/tester/test.(*Circle).isCircle
5.03s 4.99% 60.00% 8.89s 8.82% github.com/tester/test.(*Circle).openCircle
3.14s 3.11% 63.11% 3.14s 3.11% runtime.aeshash64
3.08s 3.05% 66.16% 7.85s 7.78% runtime.mallocgc
2.57s 2.55% 68.71% 12.03s 11.93% runtime.memhash