硬中断与软中断详解
核心概念 硬中断由硬件触发,优先级极高;软中断是内核延迟处理任务,对应 top/mpstat 中的 si 指标。
1. 基础区分:硬中断 vs 软中断
1.1. 硬中断(IRQ)
硬件设备(网卡、磁盘、显卡)触发的硬件信号,优先级极高,打断CPU当前所有任务,立刻处理硬件事件。
缺点:硬中断处理不能耗时太长,否则会阻塞其他硬件响应,所以内核把耗时逻辑丢给软中断执行。
1.2. 软中断 softirq(si)
硬中断快速收完硬件数据后,内核发起软件层面延迟处理任务,在软中断上下文完成繁重逻辑,由内核后台调度执行,对应 top/mpstat 里的 si 指标。
si = softirq,代表CPU花费在软中断上的时间占比。
2. 软中断的核心作用(以网卡收包举例)
- 网卡收到数据包 → 触发硬中断;
- 硬中断极简操作:标记有数据包到达,快速退出(避免长时间占用硬中断);
- 内核触发NET_RX 软中断,在软中断上下文:
- 把网卡缓冲区数据拷贝到内核内存;
- 校验数据包、拆解报文、匹配路由/iptables/eBPF;
- 把数据包分发到对应应用Socket队列;
这部分耗时操作全部计入si。
3. 系统内置固定软中断类型(/proc/softirqs)
查看命令:cat /proc/softirqs
常见高频类型:
NET_RX:网卡接收数据包(线上si高最常见元凶)NET_TX:网卡发送数据包TIMER:系统定时器、定时调度SCHED:进程调度相关BLOCK:块设备磁盘IO软中断
线上服务器90%的si高,都是 NET_RX 接收小包风暴导致。
4. si(软中断CPU高)典型现象
mpstat 1中%si持续20%~100%,us用户业务CPU很低;- 网卡流量巨大,每秒包量PPS极高(小包最伤);
- 网络延迟上涨、业务接口超时、TCP重传增多;
- 单颗CPU核心si打满,其他核心空闲(中断不均衡)。
5. 导致软中断si飙升的常见原因
- 海量小包流量(日志、MQ、监控上报、DDOS扫描)
每个小包都触发一次软中断,PPS几十万直接打满CPU;大包反而si更低。 - CNI隧道封装开销(Calico IPIP/VXLAN、Flannel VXLAN)
跨节点数据包需要隧道封装解封装,全部在NET_RX软中断处理,加重si。 - 网卡中断绑定不均衡
所有网卡中断队列只绑定到同一个CPU核心,单核心si跑满。 - 大量防火墙规则 iptables
成千上万NetworkPolicy规则,数据包匹配消耗软中断CPU;eBPF会明显降低si。 - 网络攻击/端口扫描
外部大量无效连接、扫描包,触发海量接收软中断。 - 磁盘高IO:BLOCK类型软中断上涨,较少见。
6. 排查软中断高的标准流程
- 确认软中断占用:
mpstat -P ALL 1
- 查看各类软中断计数,定位是网络还是定时器/磁盘:
watch -n1 cat /proc/softirqs
# 重点观察 NET_RX 数值增速是否极快
- 查看网卡流量、包速率:
sar -n DEV 1
- 查看网卡中断绑定(是否集中单核):
cat /proc/interrupts
7. 降低软中断si占用优化方案
- 网卡多队列RSS分流
把网卡多队列中断均衡绑定到所有CPU核心,分散si压力,避免单核打满。 - 更换BGP裸三层CNI,关闭IPIP/VXLAN隧道
消除隧道封装解封装带来的软中断开销。 - iptables 切换 Calico/Cilium eBPF
eBPF在内核直接匹配流量,大幅减少软中断耗时。 - 小包合并(网卡GRO/TSO)
开启网卡大包聚合,多个小包合并成一个大包,减少软中断触发次数。 - 限流异常流量,拦截DDOS扫描源IP。
- 业务合并小包,减少高频短连接发送。
8. 关键总结
si是软中断CPU耗时占比,绝大多数场景由网卡收包NET_RX导致;- 硬中断只做标记,数据包解析、路由、防火墙匹配全部丢给软中断;
- 小包、隧道、中断不均衡、大量iptables规则是si飙高四大根源;
- si过高会导致网络延迟、业务超时,优化核心:中断均衡、启用大包聚合、eBPF、减少隧道封装。
关联文档
- Linux 内核学习
- 用户态与内核态