除錯 Linux 核心
外觀
< Linux 核心
許多因素會影響 Linux 核心的效能,包括硬體配置、軟體配置和工作負載特徵。
在這種情況下,Linux 核心的效能最佳化涉及識別和解決系統中的效能瓶頸。這可能包括調整核心引數、最佳化系統資源以及識別和修復可能影響效能的錯誤和其他問題。
鑑於 Linux 核心的複雜性以及影響效能的各種因素,效能最佳化可能是一項艱鉅的任務。但是,藉助合適的工具和技術,可以顯著提高基於 Linux 的系統的效能和可靠性。
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/
📚進一步閱讀
🛠️實用程式
- Performance Co-Pilot,https://pcp.io/ – Performance Co-Pilot
- Prometheus,https://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
⚙️內部機制
📚 參考資料
- 核心開發工具 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
- 使用其他級別的日誌訊息
- asm-generic/bug.hinc
⚙️內部機制
- 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 – 函式、延遲和事件跟蹤
- 使用 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]⚲介面
⚙️內部機制
📚 參考資料
- 使用 kgdb、kdb 和核心偵錯程式內部 doc
- kdump
- kdump doc
- man 8 crash – 分析 Linux 崩潰轉儲資料或活動系統
eBPF
[edit | edit source]⚲ API
📖參考
📚進一步閱讀
- man 7 bpf-helpers
- Linux 擴充套件 BPF (eBPF) 跟蹤工具
- bpftrace – 用於 Linux eBPF 的高階跟蹤語言
- BCC – 用於基於 BPF 的 Linux IO 分析、網路、監控等的工具
- man 8 stapbpf
- 用於 Linux 核心跟蹤的 eBPF 程式設計
- lockdep - 執行時鎖定正確性驗證器 doc
看門狗
[edit | edit source]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
👁️ 示例
- ./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
📚 參考資料
⚙️內部機制
📖 除錯參考資料
- Ramoops oops/panic 日誌記錄器 doc
- pstore 塊 oops/panic 日誌記錄器 doc
- 故障注入 doc
- 二分查詢 bug doc
- 核心開發工具 doc
- linux/tracepoint.hinc
📚進一步閱讀