Go
Profilage avec go tool pprof
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