Perf: Не удалось записать символ перемещения ссылки ядра
Я скомпилировал 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
. Как я могу это исправить?
EDIT:
/proc/kallsyms
не существует и /proc/sys/kernel/kptr_restrict
содержит 0
:
$ cat /proc/sys/kernel/kptr_restrict
0
Я сам скомпилировал ядро, и возможно, что у него отсутствует какой-то вариант. Что это за /proc/kallsyms
? Как включить его в ядре?
Ответы
Ответ 1
Каково ваше ядро? Это из дистрибутива 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
или (fooobar.com/questions/310359/...)
sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"
или
echo 0 | sudo tee /proc/sys/kernel/kptr_restrict
или вы всегда можете запустить perf
от пользователя root.
После установки kptr_restrict в ноль или при запуске perf из root вы не должны получать предупреждения о kallsyms и сможете профилировать функции ядра.
Обновление: кажется, что perf record
всегда хочет получить доступ к kallsyms/ограниченным kptrs, даже с событием только для пользователей (-e cycles:u
)
Ответ 2
Этот учебник отлично работал у меня!
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