/proc/interrupts 和 /proc/softirqs 是硬中断与软中断统计的唯一可信源头,前者记录硬中断触发次数,后者记录软中断执行次数,需结合分布、趋势及上下文差异综合分析。

直接看 /proc/interrupts 和 /proc/softirqs 就行
硬中断和软中断的统计分别存放在两个独立文件里,/proc/interrupts 记硬中断触发次数,/proc/softirqs 记软中断执行次数。这两个文件内核实时维护,零依赖、无开销,是唯一可信的源头数据。
常见错误现象:只 cat /proc/interrupts 就断定“网卡在猛打中断”,结果发现 NET_RX 在 /proc/softirqs 里暴涨十倍——说明硬中断只是“敲门”,真正干活的是软中断。
-
/proc/interrupts每行首列是 IRQ 编号(如 42),后面是各 CPU 的计数,最后一列是设备名(如enp3s0f0、nvme0n1) -
/proc/softirqs每行是软中断类型(如NET_RX、TIMER、RCU),同样按 CPU 列出计数 - 数值为 0 不代表设备没工作:启用 NAPI 或轮询后(如
ethtool -C eth0 rx off),硬中断计数归零但流量照常
为什么不能只看总数?得盯分布和趋势
单看某行总数容易误判。比如 NET_RX 在 /proc/softirqs 里 CPU0 是 200 万、CPU1 是 5 千,说明网络包全压在 CPU0 上,ksoftirqd/0 忙死,其他核闲着——这不是负载高,是绑定失衡。
使用场景:排查延迟抖动或响应不均时,必须对比各 CPU 列的相对值,而非绝对值。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 硬中断分布不均:查
grep enp3s0f0 /proc/interrupts,看各 CPU 列是否严重倾斜 - 软中断持续偏高:用
watch -n 1 'cat /proc/softirqs | grep NET_RX'观察增长速率,结合mpstat -P ALL 1看 %soft 是否长期 >30% - 虚拟化环境注意前缀:
IR-PCI-MSI或IR-IO-APIC表示用了中断重映射,IRQ 编号已与物理引脚解耦,别按传统编号猜硬件
中断耗时得用 trace-cmd,不是 perf
/proc/interrupts 和 /proc/softirqs 只给总量,卡顿或抖动必须看单次 handler 耗时。超过 100μs 就该怀疑驱动在中断上下文里干了不该干的事(比如 memcpy 大块数据)。
容易踩的坑:用 perf record -e irq:* ——它不保证入口/出口事件配对,采样精度也不够,算不出真实 delta。
- 先确认内核支持:
grep CONFIG_IRQSOFF_TRACER /boot/config-$(uname -r)返回y或m - 抓 5 秒:
trace-cmd record -e irq:irq_handler_entry -e irq:irq_handler_exit -T 5 - 分析时重点看
delta字段(单位纳秒),不是lat或overrun
绑定 CPU 别碰 smp_affinity,用 smp_affinity_list
想把某网卡中断固定到 CPU2,别直接往 /proc/irq/*/smp_affinity 写十六进制掩码——x86 和 ARM 位宽不同,写错直接导致中断不触发。
smp_affinity_list 输出十进制 CPU 编号(如 2),人眼可读,跨架构兼容。
- 查当前绑定:
grep eth0 /proc/interrupts | awk '{print $1}' | xargs -I{} sh -c 'echo {}:/proc/irq/{}/smp_affinity_list' | while read l; do echo "$l: $(cat ${l##*:} 2>/dev/null)"; done - 改之前先看
/proc/irq/*/effective_affinity:如果它和smp_affinity_list不一致,说明 irqbalance 正在自动干预,得先停掉服务 - 修改命令:
echo 2 > /proc/irq/42/smp_affinity_list(假设 IRQ 42 对应你的网卡)
ksoftirqd/CPUx 是独立线程。这两者调度逻辑完全不同,混在一起看数据只会误导判断。

















