Linux网卡多队列优化核心在于队列与CPU的合理绑定及中断亲和性与软中断负载协同调度,需验证启用状态、绑定RX中断、均衡软中断(RPS/RFS)、配置XPS,并结合NUMA拓扑与业务特征调优。

Linux 网卡多队列(Multiqueue)优化的核心,是让网络中断、软中断、协议栈处理和应用层接收尽可能分散到不同 CPU 上,避免单核瓶颈,提升吞吐与降低延迟。关键不在于“开更多队列”,而在于“队列与 CPU 的合理绑定”以及“中断亲和性与软中断负载的协同调度”。
确认网卡是否支持并启用了多队列
多数现代千兆及以上网卡(如 ixgbe、i40e、mlx5、virtio-net)默认启用多队列,但需验证:
- 查看队列数量:
ls /sys/class/net/eth0/device/msi_irqs/(PCIe MSI-X 中断数 ≈ RX/TX 队列总数) - 或直接查队列目录:
ls /sys/class/net/eth0/queues/,应有rx-0,rx-1, ...,tx-0,tx-1等子目录 - 检查驱动是否加载了多队列支持:如
ethtool -l eth0显示 current/pre-set RX/TX channel 数 > 1 - 若未启用,可通过
ethtool -L eth0 combined N设置(N ≤ 网卡最大支持值,且通常 ≤ CPU 核心数)
绑定 RX 队列中断到特定 CPU(IRQ Affinity)
RX 队列每个对应一个独立中断号,必须显式绑定到 CPU,否则默认可能全挤在 CPU 0 上:
- 查每个 RX 队列对应的中断号:
grep eth0 /proc/interrupts | grep rx - 将中断绑定到目标 CPU(例如 CPU 1–4):
echo 2 > /proc/irq/XX/smp_affinity_list(XX 是中断号,2 表示 CPU 1,用十六进制更稳妥:echo 2 > /proc/irq/XX/smp_affinity表示 CPU 1) - 推荐脚本化绑定:按队列编号轮询分配,如 rx-0→CPU0、rx-1→CPU1…,避免跨 NUMA 节点(可用
lscpu和numactl --hardware查看拓扑) - 注意:绑定后需触发一次
echo 1 > /proc/sys/net/core/dev_weight或重启 irqbalance(若启用)以生效
均衡软中断(ksoftirqd)负载与 RPS/RFS(可选增强)
即使 IRQ 分散了,软中断仍可能集中在某几个 CPU 上处理。此时需配合:
-
RPS(Receive Packet Steering):软件层面将软中断分发到其他 CPU(适用于无硬件多队列或队列数不足时)。启用方式:
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(十六进制掩码,f=CPU0–3) -
RFS(RPS Flow Stabilization):配合 RPS,把同一连接的包尽量送到同一个 CPU 处理,提升 cache 局部性。需设置
rps_sock_flow_entries和各 rx 队列的rps_flow_cnt - 监控软中断分布:
cat /proc/softirqs | grep -A1 "NET_RX",观察各 CPU 的 NET_RX 计数是否均衡 - 若发现某 CPU 软中断持续过高,可调低其
/proc/sys/net/core/netdev_budget(默认300),避免单次处理过多包阻塞调度
TX 队列与 XPS(Transmit Packet Steering)
TX 方向虽无中断,但多队列发送也需 CPU 协同:
- 启用 XPS:将 TX 队列绑定到特定 CPU 发送,减少跨 CPU 缓存同步开销。
echo f > /sys/class/net/eth0/queues/tx-0/xps_cpus - 建议 TX 绑定与对应 RX 队列使用相同 CPU(如 rx-2 和 tx-2 都绑 CPU2),构成“收发局部性”
- 对 DPDK 或 XDP 场景,TX 可完全绕过内核协议栈,此时 XPS 意义减弱,重点转为用户态线程绑核
实际调优需结合业务特征:高吞吐场景优先保障 RX 中断分散与 NUMA 局部性;低延迟场景需控制每核软中断负载,并考虑关闭 irqbalance、禁用节能状态(cpupower frequency-set -g performance)。不复杂但容易忽略。











