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

原文 标签 linux performance networking tcp linux-kernel

众所周知,有:https://www.kernel.org/doc/Documentation/networking/scaling.txt
RSS:接收端缩放
RPS:接收包转向
RFS:接收流量转向
这是否意味着:
rss-允许我们使用多个cpu核来处理来自以太网的软irq(每个以太网队列一个cpu核)
RPS-允许我们在一个和同一个CPU核心上处理来自同一个连接的所有数据包的软IRQ
RFS-允许我们处理来自同一个连接的所有数据包的软IRQ,在同一个CPU内核上,应用程序的线程处理这个连接
对吗?

最佳答案

引号来自https://www.kernel.org/doc/Documentation/networking/scaling.txt
rss:receive-side scaling——是硬件实现的,对数据包的一些字节进行哈希(“网络和/或传输层头上的哈希函数——例如,一个数据包的IP地址和TCP端口上的4元组哈希”)。实现是不同的,有些可能无法过滤最有用的字节,或者可能以其他方式受到限制。这种过滤和队列分布速度很快(HW中只需要几个额外的周期来对数据包进行分类),但在某些网卡之间不可移植,或者不能与隧道数据包或某些罕见的协议一起使用。有时,您的硬件不支持足够多的队列,无法为每个逻辑CPU内核获得一个队列。
当延迟是一个问题或每当接收时,应启用RSS。
中断处理形成了一个瓶颈。在CPU之间分配负载
减少队列长度。
接收包转向(RPS)是一种逻辑上的软件实现
RSS。在软件中,它必须在稍后的数据路径中调用。因此,这是硬件RSS的软件替代方案(仍然解析一些字节,以便将它们散列到队列ID中),当您使用没有RSS的硬件,或者希望基于比HW更复杂的规则进行分类,或者具有在HW RSS分类器中无法解析的协议时。但使用rps时,会使用更多的cpu资源,并且会有额外的cpu间通信量。
RPS比RSS有一些优势:1)它可以与任何NIC一起使用,
2)软件过滤器可以很容易地添加到新协议的散列中,
3)它不会增加硬件设备中断率(尽管它会
引入处理器间中断(ipis)。
RFS:接收流转向类似于RSS(具有更多CPU开销的软件机制),但它不仅散列为伪随机队列ID,而且考虑了“应用程序位置”。(因此,由于位置良好,包处理可能更快)。队列被跟踪到更本地的线程,该线程将处理接收到的数据,数据包被传递到正确的CPU核心。
RFS的目标是通过转向提高数据缓存命中率。
将数据包的内核处理到应用程序线程所在的CPU
正在使用数据包。RFS依赖于相同的RPS机制
将数据包排队到另一个CPU的积压工作中并唤醒它
CPU。…在RFS中,数据包不是通过其散列值直接转发的,
但是散列被用作流查找表的索引。这张桌子是地图
流到正在处理这些流的CPU。
加速的RFS——支持硬件的RFS。(检查网络驱动程序中的ndo_rx_flow_steer)“加速rfs对于rfs就像rss对于rps一样:一种硬件加速的负载平衡机制,它使用软状态根据使用每个流的数据包的应用程序线程运行的位置来引导流。”。
类似的数据包传输方法(但是数据包已经生成并准备发送,只需选择最佳队列发送数据包,以及更容易的后处理,如释放skb)
xps:传输包指导:“从cpu到硬件队列的映射是
记录。此映射的目标通常是分配队列
专用于CPU的一个子集,其中
这些队列在此集中的CPU上处理”

相关文章:

linux - 到达TOR(Raspberry Pi)内的路由器管理页面

c# - 正在将数据发送到127. *:无法访问的主机

c++ - 我如何开始编写自己的IP样协议? [关闭]

linux - 无法在Perl中设置TCP_NODELAY-有关权限的错误-为什么? (但我可以在python和ruby中设置)

python - 如何在Linux中永久制作apscheduler

linux - 内部服务器错误-Apache 2.4和mod_perl

linux - 在Linux下从TFS获取文件

r - 用R或RCpp计算矩阵中多少行都为TRUE的最快方法是什么?

postgresql - 为什么postgresql会写入大量的临时文件并在一个循环中填充磁盘?

android - 使用StaggeredGridLayoutManager预加载Android Recyclerview项目