2016-02-19 3 views
1

Je suis perplexe, j'ai lu le tutoriel perf et j'essaie de faire un test simple au-delà de "perf stat" qui fonctionne. Cependant l'enregistrement de perf ne fonctionne pas, ou l'annotation de perf montre aucun échantillon enregistré. Courir perfPourquoi l'enregistrement et l'annotation de perf ne fonctionnent-ils pas?

Par exemple (im en cours d'exécution avec sudo parce que sans elle, je reçois un tas d'erreurs que je poste à la fin):

sudo perf record -e cycles,instructions,cache-misses -a -c 1 ./FooExe

[ perf record: Woken up 4 times to write data ] 
[ perf record: Captured and wrote 1.794 MB perf.data (~78393 samples) ] 

.

sudo perf report -D -i perf.data |grep RECORD_SAMPLE |wc -l 
Failed to open /tmp/perf-23796.map, continuing without symbols 
20486 

.

sudo perf annotate -d ./FooExe

the perf.data file has no samples! Press any key

, donc: pour autant que je reçois. J'ai essayé de reconstruire perf pour mon ssystem de source mais cela n'a pas semblé aider non plus. Im utilisant Ubuntu 14.04 noyau 3.19.0-49-générique. Ceci est sur Intel i7 I4510U cpu. Je me suis assuré de compiler mon programme avec des symboles, mais j'obtiens les mêmes résultats quelle que soit l'application que j'essaie de profiler.

- si je cours sans sudo:

WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted, 
check /proc/sys/kernel/kptr_restrict. 

Samples in kernel functions may not be resolved if a suitable vmlinux 
file is not found in the buildid cache or in the vmlinux path. 

Samples in kernel modules won't be resolved at all. 

If some relocation was applied (e.g. kexec) symbols may be misresolved 
even with a suitable vmlinux or kallsyms file. 

Cannot read kernel map 
Error: 
You may not have permission to collect system-wide stats. 
Consider tweaking /proc/sys/kernel/perf_event_paranoid: 
-1 - Not paranoid at all 
    0 - Disallow raw tracepoint access for unpriv 
    1 - Disallow cpu events for unpriv 
    2 - Disallow kernel profiling for unpriv 
+1

Je pourrais poster une réponse plus grande plus tard, mais vous n'avez pas besoin de 'sudo'. 'perf' essaie d'inclure le temps processeur passé en mode noyau dans les appels système. Si vous essayez seulement de profiler ce que fait votre code dans l'espace utilisateur, le message d'avertissement est inoffensif. Le profilage fonctionne toujours. Est-ce que 'perf report' échoue parce que les données de l'échantillon appartiennent à root et sont illisibles? Essayez de supprimer tous les fichiers appartenant à la racine et recommencez sans utiliser sudo du tout. –

+0

ok merci. J'ai essayé de supprimer les données appartenant à sudo et de répéter le test. Quand je le fais, si j'essaye perf annoter -d ./FooExe alors perf démarre démarre montre une barre de progression et se ferme immédiatement. Si je tente sans l'option -d, il montre simplement "fichier perf.data n'a pas d'échantillons" – skimon

Répondre

1

Je viens d'essayer votre commande. Le problème était que vous utilisiez -a pour profiler tous les processus à l'échelle du système, donc il n'a jamais fonctionné ./FooExe. Vous pouvez le confirmer avec strace -f perf ... ./FooExe, et noter l'absence de tout appel système execve. Et aussi le fait qu'il retourne instantanément, même si FooExe aurait dû prendre plusieurs secondes.

Voici un exemple d'échantillons pour l'enregistrement d'une commande awk boucle occupée:

perf record -e cycles,instructions,cache-misses awk 'BEGIN{for(i=0;i<40000000;i++){}}' 

maintenant perf report œuvres. Vous n'avez pas besoin de spécifier l'exécutable pour la commande report, car perf.data contient uniquement des données pour un exécutable.


Cela fonctionne de la même manière avec the ocperf.py wrapper, mais vous pouvez enregistrer des événements pour des événements plus spécifiques uarch en utilisant des noms symboliques (au lieu de rechercher des codes et des arguments numériques dans -e):

$ ocperf.py record -e cycles,cache-misses,uops_dispatched_port.port_0 awk 'BEGIN{for(i=0;i<40000000;i++){}}' 
perf record -e cycles,cache-misses,cpu/event=0xa1,umask=0x1,name=uops_dispatched_port_port_0,period=2000003/ awk 'BEGIN{for(i=0;i<40000000;i++){}}' 
    (warning lines about kernel symbols) 
[ perf record: Woken up 2 times to write data ] 
[ perf record: Captured and wrote 0.352 MB perf.data (7819 samples) 
$ ocperf.py report 
+0

merci, aucune idée pourquoi mais je pourrais avoir juré je l'ai essayé avant (sans le drapeau à l'échelle du système) mais de toute façon il semble fonctionner maintenant comme tu dis.Salutations – skimon

+0

ok maintenant j'ai un autre problème - je reçois une sortie qui ne me montre pas les symboles réels: par exemple ocperf.py record --call-graph nain -e misalign_mem_ref.stores -c 1 ./a.out, puis rapport ocperf.py -g graph --no-children, me montre 40% a.out [inconnu] [k] 0xffffffff813b4578. Je me suis assuré de compiler avec -fno-omit-frame-pointer – skimon

+0

@skimon: Avez-vous compilé avec '-g' pour les symboles de débogage complets, aussi? Êtes-vous sûr d'avoir besoin de '-fno-omit-frame-pointer'? le déroulement de pile fonctionne sans lui (grâce à la section '.eh_frame_hdr', IIRC). Il suffirait de le faire si vous avez enregistré un backtrace à chaque échantillon pour voir si les appels de certains parents sont plus chers que d'autres. IDK s'il le fait même; Je me suis surtout amusé à isoler une boucle que je suis en train d'accorder et à regarder la sortie 'perf stat'. Je n'ai pas vraiment fait beaucoup d'enregistrement/d'annotation. Je pense normalement qu'il suffit d'échantillonner le pointeur d'instruction. –