linux - RSS、RPS 和 RFS 之间的主要区别是什么?

标签 linux performance networking tcp linux-kernel

众所周知,有:https://www.kernel.org/doc/Documentation/networking/scaling.txt

  • RSS:接收方缩放
  • RPS:接收数据包控制
  • RFS:接收流量控制

这是否意味着:

  • RSS - 允许我们使用许多 CPU 内核来处理来自以太网的软中断(每个以太网队列一个 CPU 内核)
  • RPS - 允许我们在同一个 CPU 核心上处理来自同一个连接的所有数据包的软中断
  • RFS - 允许我们处理来自同一个连接上的所有数据包的软中断,同一个 CPU 核心,我们应用程序的线程在该核心上处理此连接

对吗?

最佳答案

引文来自https://www.kernel.org/doc/Documentation/networking/scaling.txt .

  • RSS:接收方缩放 - 由硬件实现并散列一些字节的数据包(“网络和/或传输层 header 上的散列函数——例如,IP 地址和数据包的 TCP 端口上的 4 元组散列”)。实现方式不同,有些可能不会过滤最有用的字节,或者可能以其他方式受到限制。这种过滤和队列分配速度很快(硬件只需要几个额外的周期来对数据包进行分类),但在某些网卡之间不可移植,或者不能用于隧道数据包或一些罕见的协议(protocol)。有时您的硬件不支持足够数量的队列,无法为每个逻辑 CPU 核心获得一个队列。

RSS should be enabled when latency is a concern or whenever receive interrupt processing forms a bottleneck. Spreading load between CPUs decreases queue length.

  • 接收数据包控制(RPS)“在逻辑上是一个软件实现 RSS。在软件中,它必须稍后在数据路径中调用。”因此,当您使用没有 RSS 的硬件或想要基于更多分类时,这是硬件 RSS 的软件替代品(仍然解析一些字节以将它们散列到队列 ID 中)复杂的规则比硬件可以或具有无法在硬件 RSS 分类器中解析的协议(protocol)。但是使用 RPS 会使用更多的 CPU 资源,并且存在额外的 CPU 间流量。

RPS has some advantages over RSS: 1) it can be used with any NIC, 2) software filters can easily be added to hash over new protocols, 3) it does not increase hardware device interrupt rate (although it does introduce inter-processor interrupts (IPIs)).

  • RFS:Receive Flow Steering 类似于 RSS(具有更多 CPU 开销的软件机制),但它不仅散列为伪随机队列 ID,而且还“考虑了应用程序的局部性”。 (因此,由于良好的位置,数据包处理可能会更快)。队列被跟踪为更本地化的线程,该线程将处理接收到的数据,并将数据包传送到正确的 CPU 内核。

The goal of RFS is to increase datacache hitrate by steering kernel processing of packets to the CPU where the application thread consuming the packet is running. RFS relies on the same RPS mechanisms to enqueue packets onto the backlog of another CPU and to wake up that CPU. ... In RFS, packets are not forwarded directly by the value of their hash, but the hash is used as index into a flow lookup table. This table maps flows to the CPUs where those flows are being processed.

  • 加速 RFS - 具有硬件支持的 RFS。 (检查您的网络驱动程序以获取 ndo_rx_flow_steer)“加速 RFS 之于 RFS 就像 RSS 之于 RPS:一种硬件加速负载平衡机制,它使用软状态根据应用程序线程使用数据包的位置来控制流量每个流都在运行。”。

数据包传输的类似方法(但数据包已经生成并准备好发送,只需选择最佳队列发送它 - 并且更容易进行后处理,如释放 skb)

  • XPS:传输数据包控制:“从 CPU 到硬件队列的映射是 记录。此映射的目标通常是分配队列 专用于 CPU 的一个子集,其中传输完成 这些队列在这个集合中的 CPU 上处理”

关于linux - RSS、RPS 和 RFS 之间的主要区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44958511/

相关文章:

linux - 有效地使命令超时并将输出捕获到 bash 脚本中的变量

linux - 没有信号量的交替

linux - 如何从命令行删除 unix(Mac OSX) 中名为 "-d"的文件?

c++ - 在 C++ 中执行 shell 命令时强制环境 bash

ruby-on-rails - Rails 3 Cli 执行命令真的很慢吗?

c++ - 通过 boost::asio::tcp::ip 发送的大正文

mysql 高效连接 2 个表到相同的 2 个表

PHP数组性能

java - Java中如何读取网络流数据(协议(protocol)包)

java - 为什么服务器在 POST 方法请求后会返回 GET 响应?