硬中断来自硬件设备并记录在/proc/interrupts,软中断由内核触发并统计在/proc/softirqs;二者非一一对应,而是父子关系:硬中断仅作快速响应,后续繁重处理交由软中断完成。

直接看 /proc/interrupts 和 /proc/softirqs 就能分清硬中断和软中断分布,但光 cat 一下容易误读——比如把网卡名出现在 /proc/interrupts 里就当成“硬中断在干活”,其实后续大量处理是在软中断里完成的。
怎么看硬中断:重点不是总数,是分布和设备归属
硬中断来自物理设备(如网卡、磁盘、键盘),记录在 /proc/interrupts。它的核心价值不在“有没有”,而在“谁在打、打到哪颗 CPU 上”。
- 执行
cat /proc/interrupts,注意三类关键列:IRQ 编号、各 CPU 列的计数(如CPU0、CPU1)、最后一列设备名(如eth0、nvme0n1) - 若某行(如 IRQ 42)在
CPU0计数飙升而其他核为 0,说明该设备中断全挤在单核上,可能拖慢整体响应 - 网卡中断常标为
PCI-MSI或GICv3+ 设备名(如enp3s0f0),但注意:这只是“收包触发点”,不等于网络负载全由它承担 - 时钟中断(IRQ 0,
timer)和 IPI(如IPI0)是内核自用,计数高属正常;但若某非系统 IRQ(如 16–127 范围)持续暴涨,要怀疑硬件异常或驱动 bug
怎么看软中断:别漏掉 /proc/softirqs 里的 NET_RX 和 TIMER
软中断是内核把硬中断里来不及干完的活(比如把网卡 DMA 数据搬进 socket 缓冲区、协议栈处理)推后执行的机制,统计在 /proc/softirqs。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 运行
cat /proc/softirqs,重点关注NET_RX(网络接收)、NET_TX(发送)、TIMER(定时器)、RCU(内存回收)这几列 -
NET_RX高 ≠ 网卡硬中断高:可能硬中断只触发几次,但每次带进来几百个包,全压在软中断里串行处理 - 如果
mpstat -P ALL 1显示某 CPU 的%soft持续 >30%,再查对应 CPU 在/proc/softirqs中哪一列增长最快,就能定位瓶颈类型 -
NET_RX和NET_TX计数差异大(比如 RX 是 TX 的 10 倍),可能是应用没及时读 socket,导致接收队列堆积
为什么硬中断和软中断要分开看:它们跑在不同上下文,调度逻辑完全不同
硬中断运行在中断上下文(atomic context),不能 sleep、不能被抢占(同类型除外)、不能调用大部分内核函数;软中断运行在 softirq context,可被硬中断打断,但不可被另一个同类型软中断嵌套,且每个 CPU 有独立的 ksoftirqd/CPUx 内核线程兜底。
- 硬中断计数暴涨但 CPU
%irq很低 → 可能 ISR 极短(只是通知),重活全甩给软中断了 - 软中断计数高但
%soft不高 → 说明处理得快,没积压;反之若%soft高而计数涨得慢,可能是单次处理耗时长(比如大包分片重组) - 用
perf record -e irq:irq_handler_entry -a sleep 5可采样硬中断入口,而perf record -e softirq:softirq_entry -a sleep 5才能抓到软中断触发点——混用会漏掉关键路径
容易踩的坑:别把网卡中断当网络瓶颈的唯一指标
很多人一看到 /proc/interrupts 里 eth0 行数字猛增,就去调网卡 RSS 或换驱动,结果没改善。因为真实瓶颈常藏在软中断或应用层。
- 确认是否真由网卡引起:先用
sar -I ALL 1 3看总中断率(SUM),再比对/proc/interrupts里具体 IRQ 是否占大头 - 检查软中断是否跟得上:对比同一时间段
/proc/interrupts中该网卡 IRQ 增量 和/proc/softirqs中NET_RX增量,比例严重失衡(如 1:100)说明软中断处理不过来 - 别忽略 RCU 和 TIMER:在高并发场景下,
RCU软中断可能因 grace period 延迟而堆积,表现为%soft高但NET_RX平稳 - 修改
smp_affinity前务必确认该 IRQ 支持 MSI-X:老式单向量中断(如 IO-APIC-edge)强行绑多核反而引发锁争用
真正难的是把硬中断触发、软中断处理、应用读写行为这三层时间线对齐——/proc/interrupts 和 /proc/softirqs 只是两个静态快照,中间缺的那条链,得靠 perf 或 eBPF 工具补全。

















