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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow