Recherche…


Remarques

Pour en savoir plus sur les profils, rendez-vous sur le blog go .

Cpu de base et profilage de mémoire

Ajoutez le code suivant dans votre programme 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()
    }
}

Après cela, construisez le programme go s'il est ajouté dans main go build main.go . Exécutez le programme principal avec les indicateurs définis dans le code main.exe -cpuprofile cpu.prof -memprof mem.prof . Si le profilage est effectué pour les cas de test, exécutez les tests avec les mêmes indicateurs. go test -cpuprofile cpu.prof -memprofile mem.prof

Mémoire de base

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

Définir le taux de profil CPU / bloc

// 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)

Utilisation de repères pour créer un profil

Pour un colis non-principaux, ainsi que principale, au lieu d'ajouter des drapeaux à l' intérieur du code, écrire des repères dans le paquet de test, par exemple:

func BenchmarkHello(b *testing.B) {
    for i := 0; i < b.N; i++ {
        fmt.Sprintf("hello")
    }
}

Ensuite, lancez le test avec l'indicateur de profil

go test -cpuprofile cpu.prof -bench =.

Et les tests seront exécutés et créer un fichier prof avec le nom de fichier cpu.prof (dans l'exemple ci-dessus).

Accéder au fichier de profil

une fois qu'un fichier prof a été généré, on peut accéder au fichier prof à l'aide des outils go :

aller outil pprof cpu.prof

Cela entrera dans une interface de ligne de commande pour explorer le profile

Les commandes courantes incluent:

(pprof) top

répertorie les principaux processus en mémoire

(pprof) peek

Répertorie tous les processus, utilisez regex pour affiner la recherche.

(pprof) web

Ouvre un graphique (au format svg) du processus.

Un exemple de la commande 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow