ftrace 与 perf
ftrace 基础
ftrace 是 Linux 内核内置的追踪框架,挂载在 /sys/kernel/debug/tracing/:
bash
# 挂载 debugfs(通常已自动挂载)
mount -t debugfs none /sys/kernel/debug
cd /sys/kernel/debug/tracing
# 查看可用追踪器
cat available_tracers
# blk function_graph function nop ...
# 查看可追踪的事件
cat available_events | head -20function_graph 追踪器
追踪函数调用关系,直观展示执行流程:
bash
# 设置追踪器
echo function_graph > current_tracer
# 只追踪特定函数(及其调用的所有函数)
echo my_driver_probe > set_graph_function
# 开始追踪
echo 1 > tracing_on
# 触发目标操作(如加载驱动)
modprobe my_driver
# 停止追踪
echo 0 > tracing_on
# 查看结果
cat trace | head -50输出示例:
1) | my_driver_probe() {
1) | devm_kzalloc() {
1) 0.234 us | __kmalloc();
1) 1.456 us | }
1) | devm_ioremap_resource() {
1) 2.123 us | __request_region();
1) 3.456 us | }
1) + 15.234 us | }追踪特定事件
bash
# 查看 I2C 相关事件
cat available_events | grep i2c
# 启用事件追踪
echo 1 > events/i2c/enable
# 或启用特定事件
echo 1 > events/i2c/i2c_write/enable
echo 1 > events/i2c/i2c_read/enable
# 设置过滤条件(只追踪 adapter_nr=1 的 I2C 操作)
echo 'adapter_nr==1' > events/i2c/i2c_write/filter
echo 1 > tracing_on
# 执行操作
echo 0 > tracing_on
cat traceirqsoff 追踪器(中断延迟分析)
bash
# 追踪中断被禁用的最长时间段
echo irqsoff > current_tracer
echo 1 > tracing_on
# 运行一段时间后
echo 0 > tracing_on
cat trace
# 输出显示最长的中断禁用时间及调用栈
# irqsoff latency trace v1.1.5 on 5.15.0
# latency: 42 us, #4/4, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0)perf 性能分析
CPU 热点分析
bash
# 采样 30 秒,记录 CPU 热点
perf record -g -a sleep 30
# 查看报告
perf report
# 火焰图(需要 FlameGraph 工具)
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg追踪特定进程
bash
# 追踪特定进程(PID 1234)
perf record -g -p 1234 sleep 10
perf report
# 追踪特定命令
perf record -g -- modprobe my_driver
perf report硬件性能计数器
bash
# 查看可用事件
perf list
# 统计缓存命中率
perf stat -e cache-references,cache-misses,instructions,cycles \
dd if=/dev/zero of=/dev/null bs=1M count=100
# 输出示例:
# 1,234,567 cache-references
# 123,456 cache-misses # 10.0% of all cache refs
# 9,876,543 instructions
# 3,456,789 cycles # 2.86 insn per cycle追踪内核函数调用次数
bash
# 统计 kmalloc 调用次数和参数分布
perf probe --add 'kmalloc size'
perf record -e probe:kmalloc -a sleep 5
perf report
# 清理 probe
perf probe --del kmalloctrace-cmd(ftrace 的友好前端)
bash
# 安装
apt install trace-cmd
# 追踪函数
trace-cmd record -p function_graph -g my_driver_probe modprobe my_driver
trace-cmd report | head -100
# 追踪事件
trace-cmd record -e i2c modprobe my_i2c_driver
trace-cmd report
# 图形化查看(kernelshark)
kernelshark trace.dateBPF / BCC 工具
bash
# 追踪内核函数调用延迟
funclatency 'my_driver_*'
# 追踪块设备 I/O 延迟
biolatency
# 追踪文件系统操作
vfsstat
# 追踪网络包
tcplife