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

Linux 为什么perf记录和注释不起作用?,linux,performance,x86,perf,Linux,Performance,X86,Perf,我被难住了,我阅读了perf教程,并试图在“perf stat”之外做一个简单的测试。然而,perf-record要么不起作用,要么perf-annotate显示未记录样本。运行性能 例如(我使用sudo运行,因为如果没有它,我会得到一堆错误,我将在最后发布): sudo perf record-e循环、指令、缓存未命中-a-c1./FooExe [ perf record: Woken up 4 times to write data ] [ perf record: Captured and

我被难住了,我阅读了perf教程,并试图在“perf stat”之外做一个简单的测试。然而,perf-record要么不起作用,要么perf-annotate显示未记录样本。运行性能

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

sudo perf record-e循环、指令、缓存未命中-a-c1./FooExe

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

sudo perf annotate-d./FooExe

[ perf record: Woken up 4 times to write data ]
[ perf record: Captured and wrote 1.794 MB perf.data (~78393 samples) ]
perf.data文件没有样本!按任意键

这就是我能做到的。我试图从源代码处重建我的系统的性能,但这似乎也没有帮助

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

--如果我在没有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

我刚试过你的命令。问题是您使用了
-a
来评测系统范围内的所有进程,因此它从未运行过
/FooExe
。您可以使用
strace-f perf….确认这一点/FooExe
,注意没有任何
execve
系统调用。还有一个事实,它会立即返回,即使FooExe本应花费几秒钟的时间

下面是一个为繁忙循环awk命令记录样本的示例:

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

稍后我可能会发布一个更大的答案,但您不需要
sudo
perf
尝试在系统调用中包括在内核模式下花费的CPU时间。如果您只是试图分析代码在用户空间中的作用,那么警告消息是无害的。分析仍然有效。
perf report
是否因为样本数据归root所有而无法读取而失败?尝试删除所有根用户拥有的文件,然后在不使用sudo的情况下重新启动。好的,谢谢。我尝试删除sudo拥有的数据并重复测试。当我这样做时,如果我尝试perf annotate-d./FooExe,那么perf启动会显示一个进度条并立即退出。如果我尝试不使用-d选项,它只会显示“perf.data file has no samples”,谢谢,不知道为什么,但我可以发誓我以前也尝试过(没有系统范围的标志),但不管怎样,它现在确实像你说的那样工作了。Chearesok现在我有另一个问题-我得到的输出没有显示实际符号:例如ocperf.py记录-调用图dwarf-e disalign_mem_ref.stores-c 1./a.out,然后ocperf.py报告-g图-无子项,显示40%a.out[unknown][k]0xffffffffffff813b4578。我确保编译时使用-fno省略frame-pointer@skimon:您是否也使用
-g
编译完整的调试符号?是否确实需要
-fno省略帧指针
?堆栈展开可以在没有它的情况下工作(多亏了IIRC的
.eh\u frame\u hdr
部分)。如果您让它在每个样本上记录回溯,以查看来自某些家长的电话是否比其他家长的电话更贵,那么它只需要这样做。IDK,如果它这样做了;我在隔离一个我正在调优的循环,并查看
perf stat
输出时,基本上都搞砸了。我实际上没有做过很多记录/注释。我想它通常只是对指令指针进行采样。我确实使用了-g进行编译,其他人也使用了-g进行编译,因此有一个问答建议perf无法理解dwarf格式的调试符号,因此我尝试使用适当的录制选项(我现在忘记了,但类似于-g dwarf)。无论如何,这是不可能的。SO的另一个建议是帧指针选项。std库fpr示例中的符号似乎出现了,而我的代码本身却什么都没有。谢谢你的帮助,最坏的情况下我可能会开始一个新问题。
$ 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