29

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ですか?カーネルで有効にするにはどうすればよいですか?

4

2 に答える 2

38

あなたのカーネルは何ですか?あなたが使用しているLinuxディストリビューションからのものですか、それともあなたがコンパイルしたものですか(どのようにインストールしましたか)?

警告の最初の部分は /proc/kallsyms について述べています - コマンドの出力を表示できますか (perf の実行に使用したのと同じユーザーから開始)

ls -l  /proc/kallsyms
cat /proc/kallsyms | head

メッセージの 2 番目の部分は、perfkptr_restrict sysctl 設定について述べています。できますか

cat /proc/sys/kernel/kptr_restrict

設定を確認します。基本的に、カーネル シンボルをプロファイリングするには、kptr_restrict をゼロに設定して無効にする必要があります ( https://lwn.net/Articles/420403/またはhttps://code.google.com/p/dart/wiki/で説明されているように)。プロファイリング):

# 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

perfまたは、いつでもroot ユーザーから実行できます。

kptr_restrict を 0 に設定した後、またはルートから perf を実行すると、kallsyms に関する警告が表示されなくなり、カーネル関数をプロファイリングできるようになります。

更新:perf recordユーザー空間のみのイベントであっても、常に kallsyms/restricted kptrs へのアクセスが必要なようです ( -e cycles:u)

于 2014-02-05T21:14:00.883 に答える
6

このチュートリアルは私にとって完璧に機能しました!

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
于 2016-11-16T19:42:31.927 に答える