Linux网卡多队列优化网络性能
为什么要关注网卡多队列
很多人把网络慢归咎于带宽或配置,却忽略了网卡多队列这个关键优化点。
简单说,传统网卡只有一个队列,所有收发包都挤在同一个CPU核心上处理;
开启多队列后,内核可以将不同网络流分散到多个队列,再由多个CPU核心并行处理。
这样一来,高并发场景下的丢包率和延迟都能明显改善,服务器能扛住更大的流量。
先确认你的网卡和驱动是否支持
不是所有网卡都支持多队列。
用下面几步快速检查:
- 查看网卡型号和驱动
lspci -v | grep -i ethernet | head -5
ethtool -i eth0
(将 eth0 换成你的实际网卡名,下同)
- 检查当前队列数量
ethtool -l eth0
看输出中 Combined 那一行的值,如果是 1 说明多队列未开启;
如果是大于1的数(比如 8),说明驱动已经支持但可能未充分利用。
- 确认驱动是否支持多队列
多队列能力主要依赖驱动,主流驱动(如 ixgbe、igb、e1000e、bnx2x、mlx5_core)通常都支持。
如果不确定,可以搜索你的驱动型号加“RSS”或“multi-queue”关键词。
开启并调整多队列数量
第一步:调整队列数
如果你的网卡硬件支持但队列数被设为1,可以手动增加:
ethtool -L eth0 combined 4
这里 combined 4 表示启用4个队列。
一般建议队列数不超过物理CPU核心数,且最好是2的幂。
可以先设为4或8测试。
第二步:确认调整生效
ethtool -l eth0
再次查看 Combined 行,应该变成你设置的数字。
第三步:让多队列真正利用多核
单纯增加队列还不够,需要把每个队列的中断绑定到不同CPU核心上。
用 irqbalance 自动分配最简单:
systemctl start irqbalance
systemctl enable irqbalance
如果希望手动绑定,可以查看中断号:
cat /proc/interrupts | grep eth0
然后通过 echo mask > /proc/irq/IRQ_NUMBER/smp_affinity 手动绑定每个中断到不同核心。
对新手推荐直接用 irqbalance 即可。
避坑指南:最容易出错的三个地方
- 队列数超过硬件限制:执行
ethtool -L时如果报错Operation not supported,说明当前的驱动或固件版本不支持你设置的数量。可以尝试更新驱动或减少队列数。 - 驱动加载参数:有些网卡需要在内核模块加载时传递参数才能开启多队列(例如 igb 驱动需要
RSS=4)。可以查看现有驱动参数:
modinfo igb | grep RSS
如果驱动有 RSS 参数且默认是0或1,需要在 /etc/modprobe.d/ 下添加配置文件并重启。
- NUMA 架构上的性能损失:在多 CPU 插槽的服务器上,队列中断应尽量绑定在物理网卡所在的 NUMA 节点上的核心。irqbalance 默认会考虑这一点,但如果手动绑定,一定要先确认
lscpu中的 NUMA 拓扑。
验证优化效果
查看队列和中断分布
ethtool -S eth0 | grep queue
cat /proc/interrupts | grep eth0
观察中断计数:如果每个队列的中断次数大致均匀增长,说明多队列正在分担流量。
压测吞吐量
使用 iperf3 做简单测试(先确保已安装):
- 服务端:
iperf3 -s - 客户端:
iperf3 -c 服务端IP -P 4 -t 30
比较优化前后的带宽和重传率。
多队列优化后,多线程测试的吞吐量通常能提升30%~100%以上。
监控丢包
netstat -s | grep -i drop
如果优化前有大量 RX dropped,开启多队列后通常明显下降。
结语
网卡多队列优化是低成本、高收益的调优手段。
按照本文的步骤依次检查硬件支持、调整队列数量、绑定CPU中断,最后用 ethtool 和 iperf3 验证,基本都能取得显著效果。
如果你在操作中遇到驱动不支持或参数报错,不妨先更新固件或换用主流网卡型号,这条路值得走一趟。