我为我的内核编译了perf
(3.11.10)。在编译期间,一些库丢失了,所以我安装了这些库。
但现在当我运行perf
时,我收到以下消息:
Couldn't record kernel reference relocation symbol
Symbol resolution may be skewed if relocation was used (e.g. kexec).
Check /proc/kallsyms permission or run as root.
Kernel address maps (/proc/{kallsyms,modules}) were restricted.
Check /proc/sys/kernel/kptr_restrict before running 'perf record'
If some relocation was applied (e.g. kexec) symbols may be misresolved.
Samples in kernel modules can't be resolved as well.
由于我使用的是自定义构建内核,对我来说最明显的解释是,我的内核缺少某些选项。如果是这样,我怎样才能找出遗漏的内容?
我不确定perf
到底在抱怨什么。我该如何解决这个问题?
修改
/proc/kallsyms
不存在且/proc/sys/kernel/kptr_restrict
包含0
:
$ cat /proc/sys/kernel/kptr_restrict
0
我自己编译了内核,但有可能缺少某些选项。这是/proc/kallsyms
的内容是什么?如何在内核中启用它?
答案 0 :(得分:24)
你的内核是什么?它是来自您使用的Linux分发版还是由您编译的(您是如何安装它的)?
关于/ proc / kallsyms的警告的第一部分 - 你能显示命令的输出(从你用来运行perf的同一个用户开始)
ls -l /proc/kallsyms
cat /proc/kallsyms | head
perf
消息的第二部分说明了kptr_restrict sysctl设置。你能做到吗
cat /proc/sys/kernel/kptr_restrict
检查设置。基本上,要分析内核符号,您应该通过将其设置为零来禁用kptr_restrict(如https://lwn.net/Articles/420403/或https://code.google.com/p/dart/wiki/Profiling中所述):
# Run as root user - e.g. after doing "sudo bash"
echo 0 > /proc/sys/kernel/kptr_restrict
或(https://stackoverflow.com/a/20391360/196561)
sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"
或
echo 0 | sudo tee /proc/sys/kernel/kptr_restrict
或者您始终可以从root用户运行perf
。
将kptr_restrict设置为零或从root运行perf后,您不应该获得有关kallsyms的警告,并且能够分析内核函数。
更新:似乎perf record
总是希望访问kallsyms /受限制的kptrs,即使只有用户空间事件(-e cycles:u
)
答案 1 :(得分:4)
本教程非常适合我!
http://lost-and-found-narihiro.blogspot.com/2012/06/how-to-install-perf-kernel-performance.html
从教程中复制:
$ cat /proc/sys/kernel/kptr_restrict
1
$ echo 0 > /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
0