本页目录
追踪与调试
覆盖: ftrace (function/function_graph) → tracepoints → kprobes → perf events → eBPF 追踪 (bpftrace/bcc) → kdump/crash → KGDB → printk 与动态调试 内核版本: 2.6 ~ 6.x
ftrace: 内核内建追踪器
Function Tracer
# 列出可用 tracer
# function: 追踪所有函数调用 (极高开销, 仅调试用)
Function Graph: 带耗时
# 输出:
# 0) | tcp_v4_rcv() {
# 0) 0.234 us | tcp_checksum_complete();
# 0) 0.567 us | tcp_v4_do_rcv() {
# 0) 1.234 us | tcp_rcv_established();
# 0) 2.345 us | }
# 0) 3.456 us | }
动态 ftrace: 运行时开启/关闭
# 动态函数探测 (通过 debugfs):
Tracepoints: 稳定探测点
# 所有可用 tracepoint
# sched/ syscalls/ net/ block/ irq/ timer/ ...
# 追踪所有 exec 调用:
# 追踪调度器:
# 追踪块 IO:
Perf Events: 硬件性能计数器
# perf stat: 统计程序执行期间的硬件计数
# perf record: 采样 (生成火焰图的基础)
# perf top: 实时热点
# 硬件事件:
# cycles, instructions, cache-references, cache-misses,
# branch-instructions, branch-misses, bus-cycles,
# stalled-cycles-frontend, stalled-cycles-backend
eBPF 追踪: bpftrace
# bpftrace: DTrace 风格的高级追踪语言
# 单行追踪:
# 直方图:
# 聚合:
bcc 工具集
# bcc: Python + BPF 的预编译工具集 (/usr/share/bcc/tools/)
printk 与动态调试
printk 日志等级
// include/linux/kern_levels.h
// 运行时控制控制台日志等级:
echo 4 > /proc/sys/kernel/printk // 只显示 ERROR 及以上
Dynamic Debug (dyndbg)
# 运行时开启特定模块的调试输出 (不需要重编)
# 查看当前启用的动态调试条目
|
kdump: 崩溃转储
# 1. 加载捕获内核 (启动时或运行时)
# 2. 触发 panic → 捕获内核启动 → vmcore 生成
# 3. 分析:
# crash 命令:
KGDB: 内核调试器
通过串口远程调试内核 (类似 gdb server):
→ 设断点, 单步执行, 读寄存器, 读内存
→ 但只能用于开发/调试环境 (需要特殊配置)
启用: kgdboc=ttyS0,115200 kgdbwait (boot param)
连接: gdb vmlinux → target remote /dev/ttyS0
实践: 性能问题诊断步骤
1. 用 perf top 看 CPU 热点
2. 用 bpftrace/bcc 看延迟分布 (biolatency, runqlat, tcpretrans)
3. 用 ftrace function_graph 追踪关键路径的调用耗时
4. 用 tracepoint 验证假设 (如 sched_switch 频率过高?)
5. 用 eBPF 写自定义工具 (如果有必要)
参考
- 源码:
kernel/trace/,kernel/kexec_core.c,kernel/printk/ - 书籍: "BPF Performance Tools" (Brendan Gregg), "Systems Performance" (同作者)
- 工具: perf, bpftrace, bcc, crash, trace-cmd (ftrace 前端)
关键词: ftrace, function_graph, tracepoint, kprobe, perf, bpftrace, bcc, kdump, crash, dynamic debug, KGDB