判断中断频率需看单位时间增量而非累计值,用watch -n 1动态监控/proc/interrupts某设备行变化,结合smp_affinity_list调优亲和性,并交叉验证/proc/softirqs中NET_RX等软中断增长模式。

直接看 /proc/interrupts 得不到频率,只看累计值会误判
很多人一上来就 cat /proc/interrupts,扫一眼某行数字很大,就喊“中断太高了”,结果查半天是设备跑了半年没重启。这个文件只存自启动以来的总次数,没有时间戳,也没单位——1234567 和 7654321 都只是两个整数,无法说明每秒打多少次。
真正要判断“响应频率”,得盯住**单位时间内的增量**。比如同一行某一列从 1000000 变成 1001234,1 秒涨了 1234 次,这才是有效频率;如果 10 秒才涨 5 次,基本可忽略。
- 别信第一眼总数:万兆网卡跑满时
/proc/interrupts某列可能每秒涨上万,但千兆网卡涨50次/秒也属正常 - 注意设备类型差异:NVMe 控制器(
nvme0)会高频打中断,而块设备(nvme0n1)通常不触发 - 虚拟化环境里看到
IR-PCI-MSI前缀,IRQ 编号已和物理引脚解耦,不能按传统编号推测硬件负载
用 watch -n 1 动态盯某设备中断增长
这是最轻量、最可靠的方法,不用装额外工具,也不依赖内核模块支持。
执行:watch -n 1 'grep eth0 /proc/interrupts'(把 eth0 换成你实际网卡名,如 enp0s3 或 ens33),然后盯住输出里某列数字的跳变速度。
- 重点看单个 CPU 列(比如 CPU0)是否持续线性上涨:从
1234567→1235678→1236789,每秒稳定 +1111,才算高频 - 如果只有 CPU0 在猛涨,CPU1~CPU7 几乎不动,问题不在频率高,而在中断亲和性没调好——90% 的“高中断”其实是绑死单核
- 周期性尖峰(比如每 5 秒突增一次)容易被漏掉,
watch至少盯够 10 秒才能识别模式 - 对 NVMe 设备,改用
grep nvme /proc/interrupts,并区分nvme0(控制器)和nvme0n1(块设备)
/proc/softirqs 里 NET_RX 飙高 ≠ 硬件中断多
/proc/softirqs 记录的是软中断(softirq)执行次数,和硬件中断不是 1:1 关系。尤其 NET_RX,它反映的是内核收包后触发的延迟处理任务,不是网卡实际发了多少 IRQ。
执行:watch -n 1 'cat /proc/softirqs | grep -E "^(NET_RX|TIMER|SCHED):"',观察单核上数值是否线性飙升。
-
NET_RX每秒增长超100000次,基本可断定网络路径异常:可能是接收队列溢出、RPS 未启用,或驱动没走 NAPI 路径 -
NET_RX高但NET_TX很低 → 接收侧瓶颈;NET_RX和NET_TX同步高 → 更可能是流量本身大 -
TIMER和SCHED同步飙升 → 更可能是短时任务太多拖住调度器,未必是中断问题 - 别误读
HI:(hardirq)列——它只是硬中断上下文切换计数,不能代替/proc/interrupts看具体设备
查中断绑定 CPU 用 smp_affinity_list,别碰 smp_affinity
中断默认不会自动均衡到多核,尤其老网卡或没启用 MSI-X 的 PCIe 设备,常全打到 CPU0,造成该核 %si 和 %hi 拉满,其他核空闲。
查当前绑定: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
-
smp_affinity_list输出是十进制 CPU 编号(如0,2),人眼可读,兼容所有架构;smp_affinity是十六进制掩码,x86 和 ARM 位宽不同,写错直接导致中断不触发 - 修改前先看
/proc/irq/*/effective_affinity:如果它和smp_affinity_list不一致,说明irqbalance正在动态干预,或内核启用了自动管理 - 启用 RPS 或调整
smp_affinity_list后,必须验证效果——再跑一遍watch -n 1 'grep eth0 /proc/interrupts',确认各 CPU 列增长是否趋于均衡
中断频率分析真正的难点不在“怎么查”,而在“怎么归因”:数值跳得快,到底是硬件异常、驱动 bug、NAPI 关闭,还是单纯亲和性没调?每个环节都得交叉验证,单看一个文件或一个命令,很容易带偏方向。


















