跳轉到內容

除錯 Linux 核心

來自華夏公益教科書,開放的書籍,開放的世界


許多因素會影響 Linux 核心的效能,包括硬體配置、軟體配置和工作負載特徵。

在這種情況下,Linux 核心的效能最佳化涉及識別和解決系統中的效能瓶頸。這可能包括調整核心引數、最佳化系統資源以及識別和修復可能影響效能的錯誤和其他問題。

鑑於 Linux 核心的複雜性以及影響效能的各種因素,效能最佳化可能是一項艱鉅的任務。但是,藉助合適的工具和技術,可以顯著提高基於 Linux 的系統的效能和可靠性。

Perf_events

[編輯 | 編輯原始碼]

Perf_events(簡稱為效能事件)是一個強大的介面,可以提供有關係統上執行的軟體效能特徵的詳細資訊。透過分析 perf_events 收集的資料,開發人員可以識別效能瓶頸並最佳化軟體以提高效能並減少資源利用率。Perf_events 被設計為一種輕量級的、低開銷的監控解決方案,對系統性能的影響最小。


🔧待辦


⚲介面

man 1 perf – 效能分析工具
基本命令
man 1 perf-help – 顯示關於 perf 的幫助資訊
man 1 perf-top – 系統分析工具。
man 1 perf-record – 執行命令並將它的分析記錄到 perf.data
man 1 perf-report – 讀取 perf.data(由 perf record 建立)並顯示分析
其他命令
man 1 perf-annotate – 讀取 perf.data(由 perf record 建立)並顯示註釋過的程式碼
man 1 perf-archive – 使用在...中找到的構建 ID 建立包含目標檔案的存檔
man 1 perf-arm-spe – 支援 perf 工具中的 Arm 統計分析擴充套件
man 1 perf-bench – 針對基準套件的通用框架
man 1 perf-buildid-cache – 管理構建 ID 快取。
man 1 perf-buildid-list – 列出 perf.data 檔案中的構建 ID
man 1 perf-c2c – 共享資料 C2C/HITM 分析器。
man 1 perf-config – 獲取和設定配置檔案中的變數。
man 1 perf-daemon – 在後臺執行記錄會話
man 1 perf-data – 資料檔案相關處理
man 1 perf-diff – 讀取 perf.data 檔案並顯示差異分析
man 1 perf-dlfilter – 使用動態載入的共享...過濾樣本事件
man 1 perf-evlist – 列出 perf.data 檔案中的事件名稱
man 1 perf-ftrace – 核心 ftrace 功能的簡單包裝器
man 1 perf-inject – 過濾器,用於在...中新增額外的事件
man 1 perf-intel-pt – 支援 perf 工具中的 Intel 處理器跟蹤
man 1 perf-iostat – 顯示 I/O 效能指標
man 1 perf-kallsyms – 在執行的核心中搜索符號
man 1 perf-kmem – 用於跟蹤/測量核心記憶體屬性的工具
man 1 perf-kvm – 用於跟蹤/測量 KVM 客機作業系統的工具
man 1 perf-kwork – 用於跟蹤/測量核心工作屬性(延遲)的工具
man 1 perf-list – 列出所有符號事件型別
man 1 perf-lock – 分析鎖事件
man 1 perf-mem – 分析記憶體訪問
man 1 perf-probe – 定義新的動態跟蹤點
man 1 perf-sched – 用於跟蹤/測量排程程式屬性(延遲)的工具
man 1 perf-script – 讀取 perf.data(由 perf record 建立)並顯示...
man 1 perf-script-perl – 使用 Perl 指令碼處理跟蹤資料
man 1 perf-script-python – 使用 Python 指令碼處理跟蹤資料
man 1 perf-stat – 執行命令並收集效能計數器統計資訊
man 1 perf-test – 執行健全性測試。
man 1 perf-timechart – 用於視覺化工作負載期間系統整體行為的工具
man 1 perf-trace – 類似 strace 的工具
man 1 perf-version – 顯示 perf 二進位制檔案的版本


⚙️內部機制

man 2 perf_event_open – 設定效能監控
uapi/linux/perf_event.hinc
tools/perfsrc
linux/perf_event.hinc
kernel/events/core.csrc
kernel/profile.c src – 簡單分析


📖參考

perf – 用於檢測 CPU 效能計數器、跟蹤點、kprobes 和 uprobes
https://perf.wiki.kernel.org/


📚進一步閱讀

perf 示例
Linux Perf Events 非官方網頁


🛠️實用程式

Performance Co-Pilothttps://pcp.io/ – Performance Co-Pilot
Prometheushttps://prometheus.io/
https://github.com/redhat-nfvpe/container-perf-tools
https://github.com/brendangregg/perf-tools – 基於 Linux perf_events(又稱 perf)和 ftrace 的效能分析工具
readprofile – 用於讀取核心分析資訊的工具


📚進一步閱讀

stress-ng – 用於測試各種核心介面
http://trac.gateworks.com/wiki/linux/profiling
分析 RHEL 9 中的應用程式效能
監控和管理 RHEL 9 中的系統狀態和效能
即時 Linux

使用者空間除錯介面

[編輯 | 編輯原始碼]

⚲介面

man 1 dmesg – 列印或控制核心環形緩衝區
man 2 syslog – 系統呼叫,用於控制核心 printk() 緩衝區
man 1 strace – 系統呼叫和訊號跟蹤工具
man 2 ptrace – 程序跟蹤系統呼叫
man 3 klogctl
man 5 core
/sys/kernel/debug/ – debugfs
dmesg --console-level <level>
gdb /usr/src/linux/vmlinux /proc/kcore
/proc/self/stack
動態 doc 除錯
⌨️動手
echo "module atkbd +pfl" | sudo tee /sys/kernel/debug/dynamic_debug/control


⚙️內部機制

handle_sysrqid


📚 參考資料

核心開發工具 doc
DebugFS doc, samples/qmi/qmi_sample_client.c src
基於 Kprobe 的事件跟蹤 doc
動態除錯 doc
Linux Magic System Request Key Hacks doc
Magic SysRq 鍵

跟蹤和日誌記錄

[edit | edit source]

⚲ API

使用者空間介面

man 1 dmesg – 列印或控制核心環形緩衝區
man 2 syslog – 系統呼叫,用於控制核心 printk() 緩衝區
/proc/kmsg
man 1 trace-cmd – 與 Ftrace Linux 核心內部跟蹤器 /sys/kernel/debug/tracing/ 互動

最常用的函式

linux/printk.hinc
pr_devel id- 條件除錯級別訊息
pr_debug id- 條件除錯級別或 動態 doc 訊息
⌨️動手
echo "module atkbd +pfl" | sudo tee /sys/kernel/debug/dynamic_debug/control
使用其他級別的日誌訊息
pr_info id, pr_notice id, pr_warn id, pr_err id, pr_crit id, pr_alert id, pr_emerg id
asm-generic/bug.hinc
WARN_ONid
WARNid


⚙️內部機制

printkid
kernel/printk/printk.csrc
arch/x86/kernel/traps.csrc
lib/dump_stack.csrc
kernel/tracesrc
scripts/tracing/draw_functrace.pysrc
logging ltp, tracing ltp
samples/ftracesrc
samples/trace_eventssrc
samples/trace_printksrc
linux/instrumentation.hinc


📚 參考資料

透過列印進行除錯
使用 printk 進行訊息記錄 doc
SystemTap
man 1 stap – systemtap 指令碼翻譯器/驅動程式
strace
man 1 strace – 跟蹤系統呼叫和訊號
LTTng
ftrace
Linux 跟蹤技術 doc
跟蹤點分析 doc
函式跟蹤器 doc – 函式、延遲和事件跟蹤
事件跟蹤 doc
使用 ftrace 掛鉤函式 doc
Fprobe - 函式入口/出口探測 doc
Kprobes doc
基於 Kprobe 的事件跟蹤 doc
Uprobe-tracer: 基於 Uprobe 的事件跟蹤 doc
使用 Linux 核心跟蹤點 doc
子系統跟蹤點: kmem doc
子系統跟蹤點: power doc
NMI 跟蹤事件 doc
核心內記憶體對映 I/O 跟蹤 doc
事件直方圖 doc
直方圖設計說明 doc
啟動時跟蹤 doc
硬體延遲檢測器 doc
Intel(R) 跟蹤中心 (TH) doc
無鎖環形緩衝區設計 doc
系統跟蹤模組 doc
CoreSight - ARM 硬體跟蹤 doc

🔧 TODO. 🚀 高階功能

linux/kmemleak.h inc – 記憶體洩漏檢測器
pr_cont id- 在同一行繼續之前的日誌訊息
print_hex_dump_bytesid
print_hex_dump_debugid
dump_stackid
CONFIG_PRINTK_CALLERid
CONFIG_DEBUG_KERNELid
CONFIG_DEBUG_INFOid
https://git.kernel.org/pub/scm/libs/libtrace/

kgdb 和 kdb

[edit | edit source]

⚲介面

linux/kgdb.hinc
linux/kdb.hinc


⚙️內部機制

kernel/debugsrc


📚 參考資料

使用 kgdb、kdb 和核心偵錯程式內部 doc
kdump
kdump doc
man 8 crash – 分析 Linux 崩潰轉儲資料或活動系統


⚲ API

man 2 bpfkernel/bpf/syscall.c src


📖參考

eBPF 和 BPF doc


📚進一步閱讀

man 7 bpf-helpers
Linux 擴充套件 BPF (eBPF) 跟蹤工具
bpftrace – 用於 Linux eBPF 的高階跟蹤語言
BCC – 用於基於 BPF 的 Linux IO 分析、網路、監控等的工具
示例 of trace.py
man 8 stapbpf
用於 Linux 核心跟蹤的 eBPF 程式設計
lockdep - 執行時鎖定正確性驗證器 doc


看門狗

[edit | edit source]

Linux 核心/Softdog 驅動程式

dev_watchdog id – 網路裝置看門狗

NMI 看門狗死鎖檢測器

⚲ API

/proc/sys/kernel/nmi_watchdog
/proc/sys/kernel/soft_watchdog
/proc/sys/kernel/watchdog
/proc/sys/kernel/watchdog_cpumask
/proc/sys/kernel/watchdog_thresh
/proc/sys/kernel/hardlockup_all_cpu_backtrace
/proc/sys/kernel/hardlockup_panic
/proc/sys/kernel/softlockup_all_cpu_backtrace
/proc/sys/kernel/softlockup_panic
linux/nmi.hinc


👁️ 示例

./lib/test_lockup.c src – 用於生成死鎖的測試模組

在不出現 panic 的情況下引發 NMI 看門狗

echo 0 > /proc/sys/kernel/hardlockup_panic
insmod test_lockup.ko disable_irq=1 time_secs=13

⚙️內部機制

kernel/watchdog.c src – 檢測系統上的硬死鎖和軟死鎖
kernel/watchdog_perf.c src – 使用 perf 檢測系統上的硬死鎖
kernel/watchdog_buddy.csrc

📚 參考資料

/proc/sys/kernel/ 的文件 doc
軟鎖死檢測器和硬鎖死檢測器(也稱為 nmi_watchdog) doc
核心引數
nmi_watchdog param
nowatchdog param
nosoftlockup param
softlockup_panic param

⚙️內部機制

arch/x86/kernel/traps.csrc


📖 除錯參考資料

Ramoops oops/panic 日誌記錄器 doc
pstore 塊 oops/panic 日誌記錄器 doc
故障注入 doc
二分查詢 bug doc
核心開發工具 doc
linux/tracepoint.hinc


📚進一步閱讀

https://drgn.readthedocs.io/ – 可程式設計偵錯程式
https://crash-utility.github.io/
https://wiki.ubuntu.com/Kernel/Debugging
Linux 應用除錯技術
華夏公益教科書