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/