4. 中断延迟测量方法

在网关驱动性能调优中,中断延迟是衡量系统实时响应能力的关键指标。中断延迟定义为从硬件中断信号产生到 CPU 开始执行中断服务程序 (ISR) 的时间差。精确测量中断延迟,是定位性能瓶颈、优化驱动行为的前提。本章介绍三种主流测量方法:ftrace、perf stat 和 硬件计数器 (ARM PMU),分别适用于不同精度和场景。

测量原则: 中断延迟测量应尽量减小测量本身对系统的影响。优先使用硬件辅助测量,其次考虑轻量级内核跟踪工具,避免在高频中断场景下使用高开销的日志记录。

4.1 使用 ftrace 测量中断延迟

ftrace 是 Linux 内核内置的跟踪工具,可记录中断的使能/禁用状态、中断处理函数的执行时间。通过 irqsoff 和 preemptoff 跟踪器,可以测量中断被关闭的最大时间,间接反映中断延迟的上限。

4.1.1 配置与启用

# 挂载 tracefs
mount -t tracefs tracefs /sys/kernel/tracing

# 选择 irqsoff 跟踪器(测量中断关闭时间)
echo irqsoff > /sys/kernel/tracing/current_tracer

# 设置跟踪阈值(微秒),只记录超过该值的事件
echo 100 > /sys/kernel/tracing/tracing_thresh

# 启动跟踪
echo 1 > /sys/kernel/tracing/tracing_on

# 运行负载(如网络压力测试)
# ...

# 停止跟踪并查看结果
echo 0 > /sys/kernel/tracing/tracing_on
cat /sys/kernel/tracing/trace

4.1.2 输出解读

ftrace 输出包含中断关闭的起始点、结束点、关闭时长以及调用栈。重点关注 latency 列,它表示中断被屏蔽的持续时间。对于网关设备,应确保最大中断关闭时间远小于中断触发周期,避免丢包。

关键指标: 在网关场景下,建议 irqsoff 最大延迟 < 50 µs,否则可能影响高速网络接口(如 1G/10G)的吞吐量。
ftrace 中断延迟测量流程 硬件中断触发 CPU 中断关闭 ftrace 记录起点 中断重新使能 ftrace 记录终点 计算延迟 = 终点 - 起点 中断关闭期间 CPU 无法响应新中断

4.2 使用 perf stat 测量中断处理时间

perf stat 可以统计中断处理函数 (ISR) 的 CPU 周期数和执行时间。通过指定事件周期,可以精确测量单个中断处理的开销,适用于对比不同驱动版本或不同中断合并策略的性能。

4.2.1 测量命令

# 测量指定中断号的处理时间(以网卡中断为例)
perf stat -e irq:irq_handler_entry,irq:irq_handler_exit \
          -p <irq_number> \
          -- sleep 10

# 查看所有中断的统计摘要
perf stat -e irq:irq_handler_entry,irq:irq_handler_exit \
          -a \
          -- sleep 5

4.2.2 输出示例与解读

事件 计数 平均时间 (ns) 说明
irq:irq_handler_entry 125,000 — 中断处理进入次数
irq:irq_handler_exit 125,000 — 中断处理退出次数
cycles 3,750,000,000 30,000 总 CPU 周期 / 中断次数
instructions 2,500,000,000 20,000 总指令数 / 中断次数
注意: perf 统计的是 ISR 从入口到出口的完整执行时间,包括中断上下文切换开销。如果 ISR 中包含了大量耗时操作(如寄存器读写、数据拷贝),应优先考虑使用 tasklet 或 workqueue 将非紧急处理推迟到软中断或进程上下文。

4.3 使用硬件计数器 (ARM PMU) 测量中断响应时间

ARM Performance Monitoring Unit (PMU) 提供了精确的硬件计数器,可以测量从中断信号到达 CPU 到指令开始执行的实际周期数。这种方法不受内核软件跟踪开销的影响,精度可达纳秒级,适用于对实时性要求极高的网关应用。

4.3.1 配置 PMU 计数器

# 启用 PMU 中断延迟测量(需内核支持 CONFIG_ARM_PMU)
# 通过 perf 访问 PMU 硬件计数器
perf stat -e armv8_pmuv3_0/inst_retired/ \
          -e armv8_pmuv3_0/cycle_count/ \
          -e armv8_pmuv3_0/exception_taken/ \
          -a \
          -- sleep 1

4.3.2 专用测量工具:irqbench

社区工具 irqbench 利用 PMU 直接测量中断响应时间,输出最小、最大和平均延迟。适用于验证中断控制器配置、CPU 频率缩放策略对延迟的影响。

# 安装 irqbench(示例)
git clone https://github.com/example/irqbench
cd irqbench && make

# 测量中断响应时间
./irqbench -i <irq_number> -c 1000

# 输出示例:
# Min: 1.2 us, Max: 8.7 us, Avg: 2.3 us
中断延迟测量方法对比 中断延迟测量方法对比 ftrace perf stat ARM PMU irqsoff 跟踪器 记录中断关闭时间 软件开销 ~1-5 µs 适合宏观延迟分析 irq_handler_entry/exit 统计 ISR 周期/指令 软件开销 ~0.5-2 µs 适合对比优化效果 硬件计数器直接读取 测量中断响应周期 几乎无软件开销 精度 < 10 ns

4.4 方法对比与选型建议

方法 测量对象 精度 开销 适用场景
ftrace (irqsoff) 中断关闭时间 ~1 µs 中 排查中断被意外长时间屏蔽的问题
perf stat ISR 执行时间 ~0.5 µs 低 对比不同驱动版本的中断处理效率
ARM PMU 中断响应时间 < 10 ns 极低 实时性验证、硬件延迟基准测试
最佳实践: 在网关驱动调优初期,使用 ftrace 快速定位是否存在异常长的中断关闭窗口;中期使用 perf stat 量化 ISR 开销,验证优化效果;最终使用 ARM PMU 进行精确的延迟验收测试,确保满足实时性 SLA。