Kernel 性能:无法';t记录内核引用重新定位符号
我已经为我的内核(3.11.10)编译了Kernel 性能:无法';t记录内核引用重新定位符号,kernel,perf,Kernel,Perf,我已经为我的内核(3.11.10)编译了perf。在编译过程中,一些库丢失了,所以我安装了它们 但现在,当我运行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 add
perf
。在编译过程中,一些库丢失了,所以我安装了它们
但现在,当我运行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\u restrict
包含0
:
$ cat /proc/sys/kernel/kptr_restrict
0
我自己编译了内核,它可能缺少一些选项。这是什么?如何在我的内核中启用它?您的内核是什么?它是来自您使用的linux分发版还是由您编译的(您是如何安装的) 警告的第一部分是关于/proc/kallsyms的-您能显示命令的输出吗(从您用来运行perf的同一个用户开始)
perf
消息的第二部分说明了kptr\u restrict sysctl设置。你能做什么
cat /proc/sys/kernel/kptr_restrict
检查设置。基本上,要分析内核符号,您应该通过将其设置为零来禁用kptr_restrict(如或中所述):
或()
或
或者您可以始终从root用户运行perf
在将kptr_restrict设置为零或从根目录运行perf时,您应该不会得到关于kallsyms的警告,并且能够评测内核函数
更新:似乎
perf record
总是希望访问kallsyms/restricted kptrs,即使只有用户空间事件(-e cycles:u
)本教程对我来说非常有效
从教程中复制:
$ cat /proc/sys/kernel/kptr_restrict
1
$ echo 0 > /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
0
# Run as root user - e.g. after doing "sudo bash"
echo 0 > /proc/sys/kernel/kptr_restrict
sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"
echo 0 | sudo tee /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
1
$ echo 0 > /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
0