Linux网络中断过高主因是网卡中断集中于单核(如CPU0),导致softirq(si)持续超20%~30%,表现为吞吐低、延迟抖动大、丢包多;需通过IRQ affinity将多队列中断分散绑定多核,并配合RPS/RFS及关闭irqbalance实现负载均衡。

Linux 网络中断过高,通常表现为 CPU 某个核心(尤其是 core 0)软中断(softirq)持续占用率高,si(softirq)在 top 或 vmstat 1 中长期高于 20%~30%,同时网络吞吐上不去、延迟抖动大、丢包增多。根本原因往往是网卡中断全部集中在一个 CPU 核上处理,导致该核成为瓶颈。中断亲和(IRQ affinity)优化就是将不同网卡队列的中断分散绑定到多个 CPU 核,实现负载均衡。
确认当前中断分布与瓶颈
先查哪些中断号属于你的网卡:
- 运行
cat /proc/interrupts | grep eth0(替换为实际网卡名,如 ens33、enp0s3),观察每行开头的中断号(如 45、46)及对应 CPU 列计数(如CPU0列数值远高于其他列) - 用
watch -n1 'cat /proc/interrupts | grep eth0'动态观察各 CPU 上中断计数增长是否严重不均 - 结合
top -H查看 ksoftirqd/X 线程的 CPU 占用,确认是否集中在单个核
检查网卡多队列与 RSS 支持
中断亲和有效前提:网卡必须启用多队列(Multi-Queue)且内核支持 RSS(Receive Side Scaling):
- 执行
ethtool -l eth0查看当前支持的最大接收/发送队列数(如Current hardware settings: RX: 16) - 运行
ethtool -L eth0 rx 8 tx 8启用 8 个接收队列(需驱动支持,部分虚拟网卡如 virtio_net 默认只开 1 队列) - 确认
/sys/class/net/eth0/device/sriov_numvfs或ethtool -i eth0输出中 driver 是否为ixgbe、i40e、mlx5_core等主流多队列驱动
设置中断亲和掩码(IRQ Affinity)
对每个网卡中断号,将其绑定到指定 CPU 子集(推荐避开 CPU 0,优先使用 1–N):
- 查看某中断当前亲和:
cat /proc/irq/45/smp_affinity_list - 绑定中断 45 到 CPU 1 和 2:
echo 2,4 > /proc/irq/45/smp_affinity_list(注意:2=CPU1,4=CPU2,二进制位掩码转换为十进制列表更直观) - 批量绑定所有 eth0 相关中断(假设中断号为 45–52):
for i in {45..52}; do echo "2,4,6,8" > /proc/irq/$i/smp_affinity_list 2>/dev/null; done - 持久化:将上述命令写入
/etc/rc.local或 systemd service(需确保网卡已加载后再执行)
配合调优提升效果
仅设 IRQ affinity 不够,还需协同调整:
-
开启 RPS(Receive Packet Steering):在无硬件 RSS 时由软件模拟分发,编辑
/sys/class/net/eth0/queues/rx-0/rps_cpus,写入十六进制掩码(如0x000000ff表示前 8 个 CPU) -
启用 RFS(RPS Flow Stabilization):提升缓存局部性,设置
/proc/sys/net/core/rps_sock_flow_entries(如 32768)和各 rx 队列的rps_flow_cnt -
调整 softirq 处理线程绑定:通过
taskset -cp 1-7 /proc/sys/kernel/ksoftirqd/0类似方式(需 kernel ≥ 5.0+ 支持 per-CPU ksoftirqd 调度) -
关闭 irqbalance 服务:
systemctl stop irqbalance && systemctl disable irqbalance,避免其覆盖手动设置
优化后再次观测 /proc/interrupts 和 top,应看到中断计数与 softirq 负载在多个 CPU 上趋于均衡,网络延迟下降、吞吐提升。注意:物理网卡多队列 + 正确 IRQ 分布是基础,软件层面 RPS/RFS 是补充,三者配合才能发挥最佳效果。










