Linux

硬中断与软中断详解

·5 分钟阅读·1873 字
📋 目录

硬中断与软中断详解

核心概念 硬中断由硬件触发,优先级极高;软中断是内核延迟处理任务,对应 top/mpstat 中的 si 指标。

1. 基础区分:硬中断 vs 软中断

1.1. 硬中断(IRQ)

硬件设备(网卡、磁盘、显卡)触发的硬件信号,优先级极高,打断CPU当前所有任务,立刻处理硬件事件。
缺点:硬中断处理不能耗时太长,否则会阻塞其他硬件响应,所以内核把耗时逻辑丢给软中断执行。

1.2. 软中断 softirq(si)

硬中断快速收完硬件数据后,内核发起软件层面延迟处理任务,在软中断上下文完成繁重逻辑,由内核后台调度执行,对应 top/mpstat 里的 si 指标。

si = softirq,代表CPU花费在软中断上的时间占比。

2. 软中断的核心作用(以网卡收包举例)

  1. 网卡收到数据包 → 触发硬中断
  2. 硬中断极简操作:标记有数据包到达,快速退出(避免长时间占用硬中断);
  3. 内核触发NET_RX 软中断,在软中断上下文:
  • 把网卡缓冲区数据拷贝到内核内存;
  • 校验数据包、拆解报文、匹配路由/iptables/eBPF;
  • 把数据包分发到对应应用Socket队列;
    这部分耗时操作全部计入 si

3. 系统内置固定软中断类型(/proc/softirqs)

查看命令:cat /proc/softirqs
常见高频类型:

  1. NET_RX:网卡接收数据包(线上si高最常见元凶)
  2. NET_TX:网卡发送数据包
  3. TIMER:系统定时器、定时调度
  4. SCHED:进程调度相关
  5. BLOCK:块设备磁盘IO软中断

线上服务器90%的si高,都是 NET_RX 接收小包风暴导致。

4. si(软中断CPU高)典型现象

  1. mpstat 1%si 持续20%~100%,us 用户业务CPU很低;
  2. 网卡流量巨大,每秒包量PPS极高(小包最伤);
  3. 网络延迟上涨、业务接口超时、TCP重传增多;
  4. 单颗CPU核心si打满,其他核心空闲(中断不均衡)。

5. 导致软中断si飙升的常见原因

  1. 海量小包流量(日志、MQ、监控上报、DDOS扫描)
    每个小包都触发一次软中断,PPS几十万直接打满CPU;大包反而si更低。
  2. CNI隧道封装开销(Calico IPIP/VXLAN、Flannel VXLAN)
    跨节点数据包需要隧道封装解封装,全部在NET_RX软中断处理,加重si。
  3. 网卡中断绑定不均衡
    所有网卡中断队列只绑定到同一个CPU核心,单核心si跑满。
  4. 大量防火墙规则 iptables
    成千上万NetworkPolicy规则,数据包匹配消耗软中断CPU;eBPF会明显降低si。
  5. 网络攻击/端口扫描
    外部大量无效连接、扫描包,触发海量接收软中断。
  6. 磁盘高IO:BLOCK类型软中断上涨,较少见。

6. 排查软中断高的标准流程

  1. 确认软中断占用:
mpstat -P ALL 1
  1. 查看各类软中断计数,定位是网络还是定时器/磁盘:
watch -n1 cat /proc/softirqs
# 重点观察 NET_RX 数值增速是否极快
  1. 查看网卡流量、包速率:
sar -n DEV 1
  1. 查看网卡中断绑定(是否集中单核):
cat /proc/interrupts

7. 降低软中断si占用优化方案

  1. 网卡多队列RSS分流
    把网卡多队列中断均衡绑定到所有CPU核心,分散si压力,避免单核打满。
  2. 更换BGP裸三层CNI,关闭IPIP/VXLAN隧道
    消除隧道封装解封装带来的软中断开销。
  3. iptables 切换 Calico/Cilium eBPF
    eBPF在内核直接匹配流量,大幅减少软中断耗时。
  4. 小包合并(网卡GRO/TSO)
    开启网卡大包聚合,多个小包合并成一个大包,减少软中断触发次数。
  5. 限流异常流量,拦截DDOS扫描源IP。
  6. 业务合并小包,减少高频短连接发送。

8. 关键总结

  1. si 是软中断CPU耗时占比,绝大多数场景由网卡收包NET_RX导致;
  2. 硬中断只做标记,数据包解析、路由、防火墙匹配全部丢给软中断;
  3. 小包、隧道、中断不均衡、大量iptables规则是si飙高四大根源;
  4. si过高会导致网络延迟、业务超时,优化核心:中断均衡、启用大包聚合、eBPF、减少隧道封装。

关联文档