パフォーマンス テストをいくつか実行しようとしたところ、ほとんどのオーバーヘッドがカーネル (kernel.kallsyms) 内にあることがわかりました。
したがって、-k オプションを使用してパフォーマンス レポートを実行するには、デバッグ シンボルを含むカーネルと抽出された vmlinuz が必要です。
ddebs からデバッグ カーネル パッケージをインストールしましたが、カーネルの起動方法がわかりません。update-grub2 を実行しましたが、カーネルがリストに表示されませんでした。
パッケージを調べたところ、カーネルは /usr/lib/debug 内にインストールされており、ライブラリ (libc など) とカーネル モジュールがあることがわかりました。
現在、起動時にカーネルをロードする方法を見つけることができません。
perf が -k オプションで適切に動作するためには、デバッグ シンボルを使用してカーネルを実行する必要があると思います。そうしないと、メモリ アドレスが適切にマップされません。
同じものを実行せずにカーネルに対して perf -k を実行しましたが、これが正しいかどうかはわかりません。
答え1
実際のところ、通常のカーネルのみがロードされているときに、デバッグ カーネルに対して perf を実行しても問題ありません。
ちなみに、カーネルは systemtap のこのチュートリアルでインストールされました: https://wiki.ubuntu.com/カーネル/Systemtap
いくつか気づいたこと - デバッグ カーネルはすでに抽出されています - 名前は vmlinuz ではなく vmlinux であり、大きいです。
2 番目に、これを gdb にロードすると、ロードされた非デバッグ カーネルとまったく同じ番号とビルド時間が表示されます。
uname -a
Linux delo 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
そしてgdb(これ:
(gdb) print init_uts_ns.name
$1 = {sysname = "Linux", '\000' <repeats 59 times>, nodename = "(none)", '\000' <repeats 58 times>,
release = "3.13.0-55-generic", '\000' <repeats 47 times>, version =
"#94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015", '\000' <repeats 21 times>,
machine = "x86_64", '\000' <repeats 58 times>, domainname = "(none)", '\000' <repeats 58 times>}
つまり、部品番号 94 は同じです。
記録したパフォーマンスを次のように実行すると:
perf report -g -k /usr/lib/debug/boot/vmlinux-3.13.0-55-generic
実際には正常に動作します - カーネル シンボルが実際の関数に変換されているのがわかります (-g は calltrace 専用です)。
- 3,18% app [kernel.kallsyms] [k] copy_user_enhanced_fast_string
- copy_user_enhanced_fast_string
- 98,98% system_call
-syscall
68,60% 0xbeef0100
31,40% 0xbeee0100
+ 0,54% generic_file_aio_read
カーネルが起動し、perf によって使用されるカーネルが整列しない場合は、間違いなくそれが表示されると誰かが言っていました。カーネル サンプルへの関数は意味をなさない (実名ではなくランダムなデータだけ) でしょう。