nmcli 不负责网卡多队列配置,仅管理网络层参数;多队列需用 ethtool 启用队列数,并通过 irq affinity、rps/rfs 和 xps 绑定中断与软中断到特定 cpu 核以优化万兆网络性能。

nmcli 本身不负责网卡多队列(Multiqueue)配置,它只管理网络层参数(如 IP、路由、DNS),而多队列属于驱动层与中断调度范畴。要在万兆网络下分散中断压力,需分两步走:先用 ethtool 启用并设置队列数,再用 IRQ affinity + RPS/RFS 等内核机制绑定中断和软中断。nmcli 只在前期确认网卡状态或配合 NetworkManager 避免干扰时起辅助作用。
1. 确认网卡支持多队列并启用合适队列数
万兆网卡(如 ixgbe、i40e、mlx5)通常默认支持多队列,但需验证并显式启用:
- 查看当前与最大队列能力:
ethtool -l eth0(替换为实际接口名,如 enp1s0f0) - 启用 8 个 Combined 队列(推荐值:≤物理 CPU 核心数,避开超线程逻辑核):
ethtool -L eth0 combined 8 - 验证生效:
ls /sys/class/net/eth0/queues/应看到rx-0到rx-7、tx-0到tx-7 - 注意:若使用 NetworkManager,确保它不重置该设置——可临时停用
systemctl stop NetworkManager执行 ethtool,再启动;或在/etc/NetworkManager/conf.d/99-disable-ethtool-reset.conf中添加[device]+managed=true防止接管干扰
2. 绑定 RX 中断到不同 CPU(核心步骤)
每个 RX 队列对应一个独立 MSI-X 中断号,必须手动绑定,否则默认全落在 CPU 0:
- 查中断号:
grep eth0 /proc/interrupts | grep rx(输出类似45: 123456 0 0 0 ... PCI-MSI 123456-edge eth0-rx-0) - 查 CPU 拓扑:
lscpu | grep "NUMA\|CPU\(s\),优先将队列均匀分配到同一 NUMA 节点内的物理核(如 CPU 1–8) - 绑定 rx-0 → CPU 1,rx-1 → CPU 2……:
echo 2 > /proc/irq/45/smp_affinity_list(2 表示 CPU 1;4=CPU2;8=CPU3;十六进制掩码更稳妥,如 CPU1+CPU2 写echo 3 > /proc/irq/45/smp_affinity) - 批量脚本示例(绑定前 8 个 rx 中断到 CPU 1–8):
for i in $(seq 0 7); do irq=$(grep -m1 "eth0-rx-$i" /proc/interrupts | awk '{print $1}' | tr -d ':'); echo $((1 /proc/irq/$irq/smp_affinity; done
3. 均衡软中断与流感知分发(RPS/RFS)
仅分散硬件中断不够,ksoftirqd 处理仍可能集中。需启用 RPS(软件包分发)与 RFS(连接局部性):
- 开启 RPS:为每个 rx 队列指定可处理的 CPU 掩码(如前 8 核):
echo ff > /sys/class/net/eth0/queues/rx-0/rps_cpus(ff = 0b11111111,即 CPU 0–7) - 设置 RFS 流表大小(提升缓存命中):
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries - 为每个 rx 队列设 flow count(建议 ≥ 连接数预期):
echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt - 监控是否均衡:
watch -n1 'cat /proc/softirqs | grep NET_RX',各列数值应接近
4. (可选)配置 XPS 优化发送路径
避免 TX 队列跨核访问锁和 cache line bouncing:
- 将 tx-0 绑定到 CPU 1,tx-1 绑定到 CPU 2……:
echo 2 > /sys/class/net/eth0/queues/tx-0/xps_cpus - 同理设置其余 tx 队列,保持与 RX 队列 CPU 分配一致
- 验证:
cat /sys/class/net/eth0/queues/tx-0/xps_cpus应输出对应掩码











