Skip to content

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 -20

function_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 trace

irqsoff 追踪器(中断延迟分析)

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 kmalloc

trace-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.dat

eBPF / BCC 工具

bash
# 追踪内核函数调用延迟
funclatency 'my_driver_*'

# 追踪块设备 I/O 延迟
biolatency

# 追踪文件系统操作
vfsstat

# 追踪网络包
tcplife

褚成志的笔记