perf のデバッグカーネルを起動する

perf のデバッグカーネルを起動する

パフォーマンス テストをいくつか実行しようとしたところ、ほとんどのオーバーヘッドがカーネル (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 によって使用されるカーネルが整列しない場合は、間違いなくそれが表示されると誰かが言っていました。カーネル サンプルへの関数は意味をなさない (実名ではなくランダムなデータだけ) でしょう。

関連情報