原力注入

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

相关文章:

性能分析实战篇 - Linux 网络性能优化指南

图解 TCP 收发包需要注意的内核参数

图解 TCP 连接生命周期

Linux 网络收发包路径简介

RPS(Receive Packet Steering)

功能

RPS将接收到的网络数据包分配给特定的CPU核心处理,以实现更好的多核负载均衡。

Image

工作原理

  1. 1. 数据包到达网卡后进入接收队列(RX队列)。

  2. 2. 根据RPS配置,Linux内核会将这些数据包重新分配给指定的CPU核心进行处理,而不是默认地由处理网卡中断的CPU处理。

  3. 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,以提升缓存命中率。

Image

工作原理

  1. 1. 追踪每个网络流的CPU绑定关系。

  2. 2. 当新的数据包到达时,内核会查询流表(flow table)。

  3. 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的对比

特性RPSRFS
分配依据基于哈希计算分配到特定CPU基于网络流的CPU绑定
优化目标多核负载均衡缓存命中率和性能
适用场景高并发、短连接数据包处理场景需要长时间处理网络流(如HTTP、数据库流量)
依赖的硬件支持无硬件依赖需要支持socket追踪

注意事项

  1. 1. 中断亲和性:配置RPS/RFS时,最好同时优化网卡中断的CPU亲和性,避免数据包在过多CPU核间迁移。

    echo <CPU_MASK> > /proc/irq/<IRQ_ID>/smp_affinity
  2. 2. 硬件队列的结合:在使用多队列(如网卡的RX队列)时,RPS/RFS应与队列配置结合,避免干扰硬件队列的平衡。

  3. 3. 系统开销:启用RPS/RFS会增加CPU负载和内核开销,需根据实际流量和系统性能平衡设置。

总结

  • • RPS:实现多核负载均衡,适合高并发场景。

  • • RFS:进一步优化缓存命中率,适合长时间处理的网络流。

通过合理配置RPS和RFS,可以显著提升网络数据处理性能,尤其是在多核、高负载环境中。