Comment profiler des benchmarks à l'aide de l'outil pprof ?
-
21-12-2019 - |
Question
Je veux profil mes benchmarks générés par go test -c
, mais le go tool pprof
a besoin d'un fichier de profil généralement généré dans la fonction principale comme ce:
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
Comment puis-je créer un fichier de profil au sein de mes benchmarks ?
La solution
Comme décrit dans http://golang.org/cmd/go/#hdr-Description_of_testing_flags vous pouvez spécifier le fichier de profil en utilisant le drapeau -cpuprofile
.
Par exemple
go test -cpuprofile cpu.out
Autres conseils
Utilisez le -cpuprofile
drapeau à go test
comme documenté à http://golang.org/cmd/go/#hdr-Description_of_testing_flags
Cet article explique comment profiler les benchmarks avec un exemple : Profilage de référence avec pprof.
Le benchmark suivant simule certains travaux du processeur.
package main
import (
"math/rand"
"testing"
)
func BenchmarkRand(b *testing.B) {
for n := 0; n < b.N; n++ {
rand.Int63()
}
}
Pour générer un profil de processeur pour le test d'évaluation, exécutez :
go test -bench=BenchmarkRand -benchmem -cpuprofile profile.out
Le -memprofile
et -blockprofile
les indicateurs peuvent être utilisés pour générer une allocation de mémoire et bloquer des profils d’appel.
Pour analyser le profil, utilisez l'outil Go :
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
Le goulot d'étranglement dans ce cas est le mutex, causé par la synchronisation de la source par défaut dans math/rand.
D'autres présentations de profil et formats de sortie sont également possibles, par ex. tree
.Taper help
pour plus d'options.
Notez que tout code d'initialisation avant la boucle de référence sera également profilé.