Linux网卡多队列RPS/RFS配置与高并发网络吞吐量调优实战

Linux服务器在高并发网络场景下,单核处理网络中断的瓶颈会严重限制整体吞吐量。网卡多队列技术将收发包中断分散到多个CPU核心,配合RPS和RFS实现软中断负载均衡,可显著提升网络收包性能。本文从硬件网卡队列配置到内核软中断调度,给出完整的高并发网络调优方案。

网卡硬件多队列与RSS机制配置

现代网卡通过RSS(Receive Side Scaling)将入站流量按五元组hash分配到不同队列,每个队列绑定独立中断号和CPU核心。查看和配置:

# 查看网卡队列数量
ethtool -l eth0
# 设置队列数为8
ethtool -L eth0 combined 8

# 查看RSS hash key和indirection table
ethtool -x eth0
# 设置RSS hash类型
ethtool -N eth0 rx-flow-hash tcp4 sdfn
# s=src ip, d=dst ip, f=src port, n=dst port

# 查看网卡中断
grep eth0 /proc/interrupts
# 将8个队列中断均匀分配到CPU 0-7
#!/bin/bash
INTF="eth0"
CPUS=8
IRQS=$(grep "$INTF" /proc/interrupts | cut -d: -f1 | tr -d ' ')
i=0
for irq in $IRQS; do
    cpu=$((i % CPUS))
    mask=$(printf "%x" $((1 << cpu)))
    echo $mask > /proc/irq/$irq/smp_affinity
    echo "IRQ $irq -> CPU $cpu (mask=0x$mask)"
    i=$((i + 1))
done

RPS软中断分发与flow table配置

RPS在软件层实现RSS类似功能,适用于不支持硬件多队列或队列数不足的场景。RPS为每个接收队列维护CPU映射表,收到数据包后按hash将backlog分发到指定CPU处理。

# 查看RPS配置
cat /sys/class/net/eth0/queues/rx-0/rps_cpus
# 默认0x00000000表示RPS未启用

# 启用RPS,将rx-0分发到CPU 8-15
echo "ff00" > /sys/class/net/eth0/queues/rx-0/rps_cpus
# 配置flow table大小
echo 32768 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries

# 对所有rx队列自动配置RPS
for i in /sys/class/net/eth0/queues/rx-*; do
    echo "ff00" > $i/rps_cpus
    echo 32768 > $i/rps_flow_cnt
done

RPS的CPU mask选择策略:将RPS目标CPU与硬中断CPU分离,避免同一CPU同时处理硬中断和软中断产生竞争。32核服务器推荐CPU 0-3处理网卡硬中断,CPU 4-31通过RPS处理软中断。

RFS接收流定向与应用层负载均衡

RPS解决了backlog的CPU分发,但不保证同一连接的包总在同一CPU处理。RFS增加socket affinity感知,使数据包被路由到应用程序所属CPU,提升cache命中率。

# 启用RFS
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
# 验证RFS生效
cat /proc/net/sock_flow
# 查看各CPU的packet rate
sar -n DEV 1 | grep eth0
# 查看软中断在CPU间分布
cat /proc/softirqs | grep -E "NET_RX|NET_TX"

三个关键参数:rps_sock_flow_entries(全局flow table大小,须为2的幂且小于32768)、rps_flow_cnt(每队列flow table大小)、合计flow table大小应等于rps_sock_flow_entries。

性能压测与瓶颈验证

测试环境:Intel Xeon 6248R(48核),Mellanox CX-5 100GbE,iperf3多线程并发测试:

配置方案 单核CPU利用率 吞吐量(Gbps) pps(K) 连接数
默认配置 98%(CPU0瓶颈) 24 650 50K
启用RSS 8队列 8核约50% 58 2100 150K
RSS + RPS(CPU 8-47) 40核均匀~35% 82 3800 500K
RSS + RPS + RFS 40核均匀~35% 83 3850 500K

RFS对吞吐量提升边际不大,但对长连接场景下应用层延迟有显著改善。

XPS与aRFS扩展优化

XPS是发送方向优化,指定哪些CPU可以从该队列发包。配合硬件aRFS进一步提升性能:

# 配置XPS,将发送队列绑定到CPU
for i in $(seq 0 7); do
    mask=$(printf "%x" $((1 << i)))
    echo $mask > /sys/class/net/eth0/queues/tx-$i/xps_cpus
done
# 启用aRFS(需网卡驱动支持)
ethtool -K eth0 ntuple on
ethtool -N eth0 flow-type tcp4 src-ip 10.0.0.1 dst-ip 10.0.0.2 action 2

常见问题排查

问题1:RPS配置后性能反而下降

常见原因:RPS目标CPU与硬中断CPU重叠导致锁竞争。排查命令:

grep eth0 /proc/interrupts
cat /proc/softirqs | grep NET_RX
# 若某CPU同时出现在两列且利用率接近100%,说明存在重叠

问题2:高连接数下pps无法继续提升

# 软中断处理瓶颈,调整budget
echo 600 > /proc/sys/net/core/netdev_budget

问题3:NUMA架构下跨Node内存访问

# 查看设备NUMA归属
cat /sys/class/net/eth0/device/numa_node
# 将应用进程绑定到网卡所在Node
numactl --cpunodebind=0 --membind=0 ./app

调优配置固化方案

# /etc/systemd/system/network-steering.service
[Unit]
Description=Network RPS/RFS/XPS Configuration
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/set_network_steering.sh
[Install]
WantedBy=multi-user.target

服务器网络调优是系统工程,硬件RSS提供队列级负载均衡,RPS/RFS在内核软中断层实现细粒度CPU调度,XPS优化发包路径。实际部署需结合NUMA拓扑、CPU核心数、应用并发模型综合配置。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-wang-ka-duo-dui-lie-rpsrfs-pei-zhi-yu-gao-bing-fa/

(0)
小编小编
上一篇 12小时前
下一篇 12小时前

相关推荐