web-dev-qa-db-ja.com

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が正確に何について不満を言っているのかわかりません。どうすれば修正できますか?

編集:

/proc/kallsymsは存在せず、/proc/sys/kernel/kptr_restrictには0が含まれています:

$ cat /proc/sys/kernel/kptr_restrict
0

カーネルを自分でコンパイルしましたが、オプションがない可能性があります。これは/proc/kallsymsとは何ですか?カーネルでどうすれば有効にできますか?

21
Martin Vegter

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

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

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

perfメッセージの2番目の部分は、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/restricted kptrsへのアクセスが必要です(-e cycles:u

27
osgx

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

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
4
Kelly