首先确认网卡多队列支持,使用ethtool -l查看队列数,再用ethtool -L设置combined队列数量,若硬件不支持则配置RPS通过rps_cpus分配CPU处理,接着通过/proc/interrupts查找网卡中断号并设置smp_affinity绑定中断到不同CPU,最后启用RFS提升缓存命中率,配置rps_sock_flow_entries和rps_flow_cnt参数,结合监控工具确保负载均衡。
linux多队列网卡配置能有效提升网络吞吐和CPU处理效率,尤其在高并发或高带宽场景下。关键在于启用网卡多队列(RSS,Receive Side Scaling)并合理绑定中断到不同CPU核心,避免单一CPU成为瓶颈。
确认网卡是否支持多队列
使用以下命令查看网卡是否具备多队列能力:
ethtool -l <网卡名>
例如:
ethtool -l eth0
输出中会显示当前网卡支持的最大发送和接收队列数(Combined queues)。若支持多队列,通常会显示多个队列(如8、16等)。
设置接收/发送队列数量
通过 ethtool 调整队列数:
ethtool -L <网卡名> combined <队列数>
例如,设置 eth0 为 8 个队列:
ethtool -L eth0 combined 8
注意:设置值不能超过 ethtool -l 显示的最大值,且需网卡和驱动支持。
配置RPS(软件层面多队列)
若网卡硬件不支持多队列,可通过RPS(Receive Packet Steering)在软件层面实现负载分担。
RPS通过设置 /sys/class/net/<网卡>/queues/rx-0/rps_cpus 来启用。
例如,允许CPU 0-7处理该队列的软中断:
echo f0 > /sys/class/net/eth0/queues/rx-0/rps_cpus
其中 f0 是十六进制,表示第4到第7位CPU(即CPU 4-7)。可根据实际CPU核心数调整掩码。
优化中断亲和性(IRQ Affinity)
将网卡中断绑定到多个CPU,避免所有中断集中在单个核心。
查看网卡中断号:
grep eth0 /proc/interrupts
输出类似:
34: 123456 PCI-MSI-edge eth0-rx-0
每个接收队列对应一个中断号。将这些中断绑定到不同CPU:
echo <CPU掩码> > /proc/irq/<中断号>/smp_affinity
例如,将中断34绑定到CPU 1:
echo 2 > /proc/irq/34/smp_affinity
掩码计算方式:CPU n 对应值为 1 << n,如CPU 0=1, CPU 1=2, CPU 2=4, CPU 3=8,多核可用或运算合并。
启用RFS(Receive Flow Steering)提升缓存命中率
RFS在RPS基础上进一步优化,根据应用所在CPU反向引导数据包处理,提高缓存效率。
启用方式:
echo <最大全局 flows> > /proc/sys/net/core/rps_sock_flow_entries
echo <每队列 flow 数> > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
例如:
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
基本上就这些。合理配置多队列、RPS和中断亲和性,能显著提升网络性能。建议结合 top、mpstat 和 irqbalance 监控CPU负载,确保负载均衡。不复杂但容易忽略细节。