核心思路是通过网卡多队列与中断亲和性绑定实现网络中断负载均衡:先启用多队列,再将各rx队列中断分别绑定到不同cpu核,结合软中断优化和numa拓扑提升性能。

核心思路是:先让网卡真正“分身”出多个独立接收队列,再把每个队列对应的中断明确分配到不同 CPU 核心上,避免所有网络中断挤在同一个核上“排队”。这不是简单地压低中断数量,而是把硬件能力摊开用。
确认是否真有单核中断瓶颈
别急着改配置。先看系统是不是真的卡在这里:
- 运行 mpstat -P ALL 1,观察各 CPU 的 %irq 列:如果某个核长期高于 20%,其他核接近 0,就是典型信号
- 执行 cat /proc/interrupts | grep eth0(替换为你的网卡名,如 ens1f0),检查所有 rx- 行的计数是否都集中在同一列(比如全是 CPU0 那一列)
- 查 irqbalance 是否在运行:systemctl status irqbalance;它会自动分发,但对高吞吐场景常不够精准,必要时可停用
启用网卡多队列(必须前置步骤)
没有多队列,就只有一个中断源,绑定再多核也没意义:
- 用 ethtool -l eth0 查看网卡支持的最大队列数(注意实际网卡名)
- 设为物理 CPU 核心数(不是超线程数),例如 8 核服务器:sudo ethtool -L eth0 combined 8
- 执行后再次 cat /proc/interrupts | grep eth0,应看到 rx-0、rx-1…rx-7 多行,每行对应一个独立 IRQ 号
手动绑定每个 RX 队列中断到指定 CPU
每个 rx-N 都要单独处理,确保不重叠、不遗漏:
- 从 /proc/interrupts 中记下各 rx- 对应的 IRQ 编号(如 45、46、47…)
- CPU 掩码是十六进制:CPU0 → 1,CPU1 → 2,CPU2 → 4,CPU3 → 8,依此类推
- 逐个写入亲和性文件,例如:
echo 1 | sudo tee /proc/irq/45/smp_affinity
echo 2 | sudo tee /proc/irq/46/smp_affinity
echo 4 | sudo tee /proc/irq/47/smp_affinity - 绑定后可用 cat /proc/irq/45/smp_affinity 验证输出是否为预期值(如 00000001)
配合软中断与 NUMA 拓扑进一步优化
IRQ 分散了,软中断(NET_RX)可能还扎堆,需协同调优:
- 用 cat /proc/softirqs | grep -A1 "NET_RX" 查看各 CPU 软中断分布是否均衡
- 若某核软中断持续偏高,可启用 RPS(软件包分发):
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(f 表示 CPU0–3) - 用 lscpu 和 numactl --hardware 查清 CPU 与网卡所在 NUMA 节点,优先将队列绑定到同节点 CPU,降低延迟
- 避免把网卡中断和关键业务进程绑在同一核上,必要时可通过 isolcpus= 启动参数隔离专用核











