Linux 网络优化:RPS 和 RFS 技术概述
当网卡启用多队列功能后,接收到的数据包会均衡分配到不同的队列,由多个 CPU 核心并行处理。然而,如果单个 CPU 核心同时负责中断处理和数据包处理,可能会导致该核心负载过高。在系统拥有较多 CPU 核心的情况下,可以通过分离网络中断处理和数据包处理,将它们分配给不同的 CPU 核心。为实现这一目标,可以引入 RPS(Receive Packet Steering) 和 RFS(Receive Flow Steering) 技术,分别用于负载均衡和流感知优化,从而进一步提升系统的网络性能。
RPS和RFS是Linux内核中的两种技术,它们优化网络数据包处理性能,特别是在多核处理器和高吞吐量场景中。这些技术通过将数据包分配到不同的CPU核心上,改善负载均衡并减少缓存未命中。
更具体的描述,可以参考 Redhat:https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/7/epub/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-networking-configuration_tools#sect-Red_Hat_Enterprise_Linux-Performance_Tuning_Guide-Configuration_tools-Configuring_Receive_Packet_Steering_RPS
相关文章:
RPS(Receive Packet Steering)
功能
RPS将接收到的网络数据包分配给特定的CPU核心处理,以实现更好的多核负载均衡。
工作原理
1. 数据包到达网卡后进入接收队列(
RX队列)。2. 根据
RPS配置,Linux内核会将这些数据包重新分配给指定的CPU核心进行处理,而不是默认地由处理网卡中断的CPU处理。3. 分配依据:
• 数据包的
5元组(源地址、目标地址、源端口、目标端口、协议)进行哈希计算。• 哈希结果决定目标
CPU。
优点
• 实现负载均衡:避免所有网络数据包都被同一个
CPU处理。• 更高的吞吐量:在多核系统中提高并行处理能力。
配置示例
# 查看RX队列的RPS设置:
cat /sys/class/net/<interface>/queues/rx-<n>/rps_cpus# 设置某RX队列的RPS,使数据包分配到CPU 0-7:
echo ff > /sys/class/net/<interface>/queues/rx-<n>/rps_cpus
RFS(Receive Flow Steering)
功能
RFS 在 RPS 的基础上增加了流感知能力,优先将网络流(flow)的数据包分配给当前正在处理该流的CPU,以提升缓存命中率。
工作原理
1. 追踪每个网络流的
CPU绑定关系。2. 当新的数据包到达时,内核会查询流表(
flow table)。3. 如果发现某流已由特定
CPU处理过,则将新的数据包分配给同一个CPU,以利用缓存中的上下文。
优点
• 提高
CPU缓存命中率:减少缓存切换带来的开销。• 流感知优化:适合需要长时间处理某一网络流的应用(如
HTTP/HTTPS、数据库流量)。
配置示例
# 启用RFS:
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries# 为每个RX队列配置流表大小:
echo 4096 > /sys/class/net/<interface>/queues/rx-<n>/rps_flow_cnt
RPS与RFS的对比
| 特性 | RPS | RFS |
| 分配依据 | 基于哈希计算分配到特定CPU | 基于网络流的CPU绑定 |
| 优化目标 | 多核负载均衡 | 缓存命中率和性能 |
| 适用场景 | 高并发、短连接数据包处理场景 | 需要长时间处理网络流(如HTTP、数据库流量) |
| 依赖的硬件支持 | 无硬件依赖 | 需要支持socket追踪 |
注意事项
1. 中断亲和性:配置RPS/RFS时,最好同时优化网卡中断的CPU亲和性,避免数据包在过多CPU核间迁移。
echo <CPU_MASK> > /proc/irq/<IRQ_ID>/smp_affinity2. 硬件队列的结合:在使用多队列(如网卡的
RX队列)时,RPS/RFS应与队列配置结合,避免干扰硬件队列的平衡。3. 系统开销:启用
RPS/RFS会增加CPU负载和内核开销,需根据实际流量和系统性能平衡设置。
总结
•
RPS:实现多核负载均衡,适合高并发场景。•
RFS:进一步优化缓存命中率,适合长时间处理的网络流。
通过合理配置RPS和RFS,可以显著提升网络数据处理性能,尤其是在多核、高负载环境中。