Ne pouvez pas obtenir golang pprof de travail
J'ai essayé de profil de certains golang applications, mais je ne pouvais pas avoir ce travail, j'ai suivi ces deux tutoriels:
- http://blog.golang.org/profiling-go-programs
- http://saml.rilspace.org/profiling-and-creating-call-graphs-for-go-programs-with-go-tool-pprof
À la fois dit que, après l'ajout de quelques lignes de code à la demande, vous devez exécuter votre application, je l'ai fait et je receiveed le message suivant à l'écran:
2015/06/16 12:04:00 profil: cpu profilage activé,
/var/folders/kg/4fxym1sn0bx02zl_2sdbmrhr9wjvqt/T/profile680799962/cpu.pprof
Donc, je comprends que le profilage est en cours d'exécution, l'envoi d'info dans le fichier.
Mais, quand je vois la taille du fichier, dans n'importe quel programme que j'ai tester, il est toujours 64bytes.
Lorsque j'essaie d'ouvrir le cpu.pprof fichier avec pprof, et j'exécute le "top 10" de commande, je vois que rien n'est dans le fichier:
("./fait" est l'une de mes applications)
aller outil pprof ./fait
/var/folders/kg/4fxym1sn0bx02zl_2sdbmrhr9wjvqt/T/profile680799962/cpu.pproftop10 -->
(pprof) top10 0 0 total ( 0%)
flat flat% somme% cum cum%
Donc, c'est comme rien ne se passe quand je suis profilage.
Je l'ai testé sous mac (cet exemple) et dans ubuntu, avec trois programmes différents.
Savez-vous que je fais de mal?
Puis comme par exemple le programme est très simple, c'est le code (c'est très simple factorielle programme que je prends à partir d'internet):
import "fmt"
import "github.com/davecheney/profile"
func fact(n int) int {
if n == 0 {
return 1
}
return n * fact(n-1)
}
func main() {
defer profile.Start(profile.CPUProfile).Stop()
fmt.Println(fact(30))
}
Grâce,
Fer
pprof
est un "profileur d'échantillonnage", et que vous ne faites pas quelque chose qui peut être échantillonnés. Votre application doit être en permanence l'exécution des instructions pour certaines quantité appréciable de temps pour accumuler assez d'échantillons (lors de l'utilisation de net/http/pprof, la valeur par défaut de temps d'échantillonnage est de 30s)Je suis en train de travailler avec OS x 10.10.2 (Yosemite). J'essaie maintenant de prendre le profil de travailler pendant de longues périodes de temps, et maintenant je vois que le fichier avoir plus d'informations 🙂 merci!
vous devez également lire alors: godoc.org/rsc.io/pprof_mac_fix
OriginalL'auteur Fersca | 2015-06-16
Vous devez vous connecter pour publier un commentaire.
Comme inf déjà mentionné, votre code s'exécute trop vite. La raison en est que pprof œuvres à plusieurs reprises l'arrêt de votre programme lors de son exécution, à la recherche à la fonction en cours d'exécution à ce moment dans le temps et écrit que vers le bas (en collaboration avec l'ensemble de la pile d'appel de fonction). Pprof échantillons avec un taux de 100 échantillons par seconde. C'est codé en dur dans le fichier runtime/pprof/pprof.rendez-vous que vous pouvez facilement vérifier (voir https://golang.org/src/runtime/pprof/pprof.go ligne 575 et le commentaire ci-dessus):
}
Plus votre programme s'exécute plus le nombre d'échantillons peut être effectué et le plus probable, il deviendra aussi court fonctions d'exécution seront échantillonnés. Si votre programme se termine avant même le premier échantillon est faite, que l'généré cpu.pprof sera vide.
Comme vous pouvez le voir dans le code ci-dessus, la fréquence d'échantillonnage est définie avec
Si vous appelez de l'exécution.SetCPUProfileRate() avec une autre valeur avant vous appelez StartCPUProfile(), vous pouvez remplacer la fréquence d'échantillonnage. Vous recevrez un message d'avertissement lors de l'exécution de votre programme de vous dire "runtime: impossible de définir le cpu profil de taux jusqu'à ce profil précédent est terminé.", que vous pouvez ignorer. Il en résulte depuis pprof.passez des appels SetCPUProfileRate() de nouveau. Puisque vous avez déjà mis en valeur, l'un de pprof sera ignoré.
Aussi, Dave Cheney a publié une nouvelle version de son outil de profilage, vous pouvez le trouver ici: https://github.com/pkg/profile . De là, vous pouvez, entre autres, spécifiez le chemin d'accès où le processeur.pprof est écrit:
Vous pouvez lire à ce sujet ici: http://dave.cheney.net/2014/10/22/simple-profiling-package-moved-updated
Par ailleurs, votre fait() va rapidement débordement, même si vous prenez int64 comme paramètre et la valeur de retour. 30! est d'environ 2*10^32 et un int64 stocke uniquement les valeurs de jusqu'à 2^63-1, qui est d'environ 9*10^18.
OriginalL'auteur alex
Le problème, c'est que votre fonction est en cours d'exécution trop rapide et pprof ne peut pas y goûter. Essayez d'ajouter une boucle autour de la
fact
d'appel et de résumer le résultat de prolonger le programme.Je vois maintenant, après l'ajout d'un pour{;;} et le sommeil, que le fichier avoir plus d'informations. Merci 🙂
OriginalL'auteur inf