我正在嘗試做一些效能測試,我發現大部分開銷是在核心中(kernel.kallsyms)。
所以我需要一個帶有調試符號的內核並提取 vmlinuz 以便使用 -k 選項運行性能報告。
我從 ddebs 安裝了調試內核包,但我不知道如何啟動內核。我運行 update-grub2 但內核沒有出現在列表中。
我檢查了軟體包,發現核心安裝在 /usr/lib/debug 內 - 有它的函式庫(libc 等)和核心模組。
現在我無法找到在啟動時載入核心的方法。
我想我需要使用調試符號運行內核,以便 perf 能夠與 -k 選項正常工作 - 否則內存地址將無法正確映射 - 對嗎?
我將 perf -k 運行到內核,但沒有運行相同的內核,但我不確定這是否正確。
答案1
好吧,實際上,當僅加載普通核心時,可以針對調試內核運行效能。
順便說一句,內核是透過本教學為 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 使用的核心無法對齊時,我肯定會看到它 - 核心樣本的函數沒有意義(只是一些隨機資料而不是真實姓名)。