启动 perf 调试内核

启动 perf 调试内核

我正在尝试做一些性能测试,我发现大多数开销都在内核(kernel.kallsyms)中。

因此,我需要带有调试符号和提取的 vmlinuz 的内核才能使用 -k 选项运行性能报告。

我从 ddebs 安装了调试内核包,但我不知道如何启动内核。我运行 update-grub2,但内核没有出现在列表中。

我检查了软件包,发现内核安装在 /usr/lib/debug 里面 - 那里有它的库(libc 等)和内核模块。

现在我无法找到在启动时加载内核的方法。

我想我需要运行带有调试符号的内核以便 perf 能够与 -k 选项一起正常工作 - 否则内存地址将无法正确映射 - 对吗?

我运行 perf -k 到内核而没有运行相同的内核,但我不确定这是否正确。

答案1

好的,实际上,当只加载正常内核时,针对调试内核运行 perf 是正常的。

顺便说一下,内核是使用这个 systemtap 教程安装的: https://wiki.ubuntu.com/Kernel/Systemtap

我注意到一些事情 - 调试内核已经被提取 - 名称是 vmlinux 而不是 vmlinuz 而且它很大......

第二件事是,当我将其加载到 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 仅用于调用跟踪):

- 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 使用的内核不会对齐,那么我肯定会看到它 - 内核样本的函数没有意义(只是一些随机数据而不是真实名称)。

相关内容