Linux RSS、RPS和RFS之间的主要区别是什么?
众所周知,有:Linux RSS、RPS和RFS之间的主要区别是什么?,linux,performance,networking,tcp,linux-kernel,Linux,Performance,Networking,Tcp,Linux Kernel,众所周知,有: 接收端缩放 接收数据包控制 RFS:接收流控制 这是否意味着: RSS-允许我们使用多个CPU核来处理来自以太网的软irq(每个以太网队列一个CPU核) RPS-允许我们在同一个CPU核心上处理来自同一连接的所有数据包的软irq RFS-允许我们在同一个CPU核上处理来自同一连接的所有数据包的软irq,我们的应用程序线程在该CPU核上处理该连接 对吗?引用自 RSS:接收端扩展-是硬件实现的,并对数据包的某些字节进行散列(“网络和/或传输层头上的散列函数——例如,数据包
- 接收端缩放
- 接收数据包控制
- RFS:接收流控制
- RSS-允许我们使用多个CPU核来处理来自以太网的软irq(每个以太网队列一个CPU核)
- RPS-允许我们在同一个CPU核心上处理来自同一连接的所有数据包的软irq
- RFS-允许我们在同一个CPU核上处理来自同一连接的所有数据包的软irq,我们的应用程序线程在该CPU核上处理该连接
- RSS:接收端扩展-是硬件实现的,并对数据包的某些字节进行散列(“网络和/或传输层头上的散列函数——例如,数据包IP地址和TCP端口上的4元组散列”)。实现是不同的,有些可能无法过滤最有用的字节,或者可能以其他方式受到限制。这种过滤和队列分布速度很快(在硬件中只需要几个额外的周期来分类数据包),但在某些网卡之间不可移植,或者不能用于隧道数据包或一些罕见的协议。有时,您的硬件不支持足够多的队列,无法为每个逻辑CPU核心获得一个队列
- 接收数据包引导(RPS)”在逻辑上是 在软件中,它必须稍后在数据路径中调用。”。所以,当您使用没有RSS的硬件,或者希望基于比硬件更复杂的规则进行分类,或者使用无法在硬件RSS分类器中解析的协议时,这是硬件RSS的软件替代方案(仍然解析一些字节以将它们散列到队列id中)。但是使用RPS时,会使用更多的CPU资源,并且会产生额外的CPU间通信量
- RFS:Receive Flow Steering类似于RSS(具有更多CPU开销的软件机制),但它不只是散列到伪随机队列id中,而是考虑“应用程序位置”。(因此,由于良好的位置性,数据包处理可能会更快)。对队列进行跟踪,使其更接近将处理接收到的数据的线程,并将数据包传递到正确的CPU核心
- 加速RFS-支持硬件的RFS。(检查您的网络驱动程序以了解
)“加速RFS对于RFS就像RSS对于RPS:一种硬件加速负载平衡机制,它使用软状态根据消耗每个流的数据包的应用程序线程运行的位置来控制流。”ndo\u rx\u flow\u steer
数据包传输的类似方法(但数据包已经生成并准备好发送,只需选择最佳队列即可发送数据包,并简化后处理,如释放skb)
- XPS:Transmit Packet Steering:“从CPU到硬件队列的映射是 此映射的目标通常是分配队列 专用于CPU的一个子集,其中 这些队列在此集合中的CPU上处理“
int netif_receive_skb(struct sk_buff *skb)
{
...
return netif_receive_skb_internal(skb);
}
static int netif_receive_skb_internal(struct sk_buff *skb)
{
...
int cpu = get_rps_cpu(skb->dev, skb, &rflow);
if (cpu >= 0) {
ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
rcu_read_unlock();
return ret;
}
...
}
在某些场景中,为了避免接收端的CPU利用率瓶颈,将RSS和RPS一起使用是明智的。IPoIB(Infiniband上的IP)就是一个很好的例子。IPoIB没有太多细节,它的模式只能打开一个通道。这意味着所有传入的流量将由单个核心处理。通过正确配置RPS,一些处理负载可以由多个内核共享,这大大提高了此场景的性能
由于提到了传输,值得注意的是,接收过程(ACK、转发)产生的数据包传输将从netif_receive_skb()选择的同一核心进行处理
希望这有帮助。谢谢!也就是说,如果RPS开启,则软IRQ将排队等待积压,并可在远程CPU核心上处理,但如果RPS关闭,则数据包将使用\u netif\u receive\u skb(){…\u netif\u receive\u skb\u Core()}立即在同一CPU核心上处理,这是否意味着“IPoIB只能打开一个通道”,IPoIB只有一个rx队列还是其他什么?那么你呢