我正在尝试做一些性能测试,我发现大多数开销都在内核(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 使用的内核不会对齐,那么我肯定会看到它 - 内核样本的函数没有意义(只是一些随机数据而不是真实名称)。