Linux网卡软中断负载均衡核心是通过中断亲和性设置与内核调度协同,将NET_RX_SOFTIRQ任务分散至多核;需绑定网卡IRQ到指定CPU、调优netdev_budget参数,并可选启用Busy Polling。

Linux 网卡软中断负载均衡,核心是让网络接收(NET_RX_SOFTIRQ)任务在多个 CPU 核心上合理分摊,避免单核过载、提升吞吐。这不是靠“配置网卡”本身完成的,而是通过中断亲和性设置 + 内核调度策略协同优化实现的。
软中断负载均衡的关键点
- 网卡硬件中断(IRQ)触发后,内核会把后续包处理工作交给软中断(NET_RX_SOFTIRQ),这部分由 ksoftirqd 线程执行;
- 默认情况下,软中断可能集中在某个 CPU 上(尤其老内核或未调优系统),成为性能瓶颈;
- 从 Linux 5.15 开始,内核增强了 NET_RX_SOFTIRQ 的动态调度能力,但仍需配合 IRQ 亲和性设置才能真正发挥多核优势。
设置网卡中断亲和性(最直接有效)
目标:把某网卡的硬件中断绑定到一组 CPU,让对应软中断也倾向在这些核上运行。
步骤如下:
-
找到该网卡对应的中断号:
grep eth0 /proc/interrupts | awk '{print $1}' | sed 's/://'输出类似
45(表示 IRQ 45) -
查看当前亲和性掩码:
cat /proc/irq/45/smp_affinity_list
-
将中断绑定到 CPU 0 和 CPU 1(以十六进制掩码
3表示):echo 3 > /proc/irq/45/smp_affinity
注意:
3=0b11→ 对应 CPU0 和 CPU1;f=0b1111→ 对应 CPU0~3。掩码位数需与系统 CPU 数匹配。 -
持久化(重启不失效):可写入
/etc/rc.local或使用irqbalance服务(推荐用于多网卡/动态环境):systemctl enable irqbalance systemctl start irqbalance
调整软中断处理参数(辅助优化)
-
net.core.netdev_budget:单次软中断最多处理的数据包数,默认 300
值太小 → 频繁调度软中断,开销大;太大 → 单次占用 CPU 时间过长,影响响应
可根据流量特征微调(如高吞吐场景设为 600):sysctl -w net.core.netdev_budget=600 echo 'net.core.netdev_budget = 600' >> /etc/sysctl.conf
-
启用 Busy Polling(适合低延迟、高吞吐场景):
echo 1 > /proc/sys/net/core/busy_poll echo 50 > /proc/sys/net/core/busy_read # 微秒级轮询窗口
这会让 socket 在无数据时短暂轮询网卡队列,减少中断次数,但增加 CPU 占用,慎用于通用服务器。
验证是否生效
-
观察各 CPU 软中断负载:
watch -n1 'grep "si" /proc/stat'
看
si(softirq)列是否在多个核上均匀增长。 -
查看指定网卡中断分布:
cat /proc/irq/*/cpulist | grep -A1 eth0
使用
perf top -e irq:softirq_entry抓取软中断触发热点(需 root 权限)
不复杂但容易忽略——关键是 IRQ 绑定要和业务 CPU 隔离(比如把网卡 IRQ 绑到专用核,应用绑到其他核),再配合 budget 调优,才能真正释放多核网络性能。











