为什么perf记录和注释不起作用?

时间:2016-02-19 04:15:12

标签: linux performance x86 perf

我很难过,我读了perf教程,并试图做一个超出“perf stat”的简单测试。然而,perf记录要么不起作用,要么perf注释显示没有记录样本。运行perf

例如(即使用sudo运行,因为没有它我得到一堆错误,我将在最后发布):

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

所以那就是我得到的。我试图从源代码为我的ssystem重建perf,但这似乎没有帮助。

我正在使用Ubuntu 14.04内核3.19.0-49-generic。这是在intel i7 I4510U cpu上。我确保使用符号编译我的程序,但无论我尝试分析哪个应用程序,我都会得到相同的结果。

- 如果我没有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 个答案:

答案 0 :(得分:2)

我刚试过你的命令。问题是您使用-a来分析系统范围内的所有进程,因此它从未运行./FooExe。您可以使用strace -f perf ... ./FooExe进行确认,并注意缺少任何execve系统调用。而且它即时返回的事实,即使FooExe应该花费几秒钟。

这是一个记录忙循环awk命令样本的示例:

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

现在perf report有效。您不需要为report命令指定可执行文件,因为perf.data仅包含一个可执行文件的数据。

这与the ocperf.py wrapper的工作方式相同,但您可以使用符号名称记录更多特定于uarch的事件的事件(而不是在-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