啟動調試核心以獲取效能

啟動調試核心以獲取效能

我正在嘗試做一些效能測試,我發現大部分開銷是在核心中(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 使用的核心無法對齊時,我肯定會看到它 - 核心樣本的函數沒有意義(只是一些隨機資料而不是真實姓名)。

相關內容