众所周知,有:https://www.kernel.org/doc/Documentation/networking/scaling.txt
这是否意味着:
这是对的吗?
答案 0 :(得分:5)
报价来自https://www.kernel.org/doc/Documentation/networking/scaling.txt。
当延迟是一个问题或接收时,应启用RSS 中断处理形成了瓶颈。在CPU之间传播负载 减少队列长度。
RPS比RSS有一些优势:1)它可以与任何NIC一起使用, 2)软件过滤器可以很容易地添加到新协议的哈希, 3)它不会增加硬件设备中断率(尽管它确实如此) 引入处理器间中断(IPI))。
RFS的目标是通过转向增加数据压缩率 内核处理数据包到应用程序线程所在的CPU 消耗数据包正在运行。 RFS依赖于相同的RPS机制 将数据包排入另一个CPU的积压并唤醒它 中央处理器。 ...在RFS中,数据包不会直接通过其散列值转发, 但是散列用作流查找表的索引。此表映射 流向正在处理这些流的CPU。
ndo_rx_flow_steer
)“加速RFS是RFS到RPS的RSS:硬件加速的负载平衡机制,它使用软状态来控制流程,根据应用程序线程消耗每个流的数据包的位置正在运行。“。用于数据包传输的类似方法(但数据包已经生成并准备好发送,只需选择最佳队列发送它 - 以及更容易的后处理,如释放skb)
答案 1 :(得分:3)
osgx的回答涵盖了主要的不同之处,但重要的是要指出也可以同时使用RSS和RPS。
RSS控制所选的HW队列以接收数据包流。一旦满足某些条件,就会向SW发出中断。由NIC的驱动程序定义的中断处理程序将是处理接收的数据包的SW起始点。那里的代码将轮询来自相关接收队列的数据包,可能会执行初始处理,然后移动数据包以进行更高级别的协议处理。
此时可能会使用RPS机制(如果已配置)。驱动程序调用netif_receive_skb(),它最终将检查RPS配置。如果存在,它会将SKB排队以继续处理所选的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;
}
...
}
在某些情况下,将RSS和RPS结合使用可以很聪明,以避免接收端的CPU利用率瓶颈。一个很好的例子是IPoIB(IP over Infiniband)。在没有深入细节的情况下,IPoIB有一种只能打开单个频道的模式。这意味着所有传入流量都将由单个核心处理。通过正确配置RPS,可以由多个内核共享一些处理负载,从而显着提高此方案的性能。
由于提到了传输,值得注意的是,接收过程(ACK,转发)产生的数据包传输将由netif_receive_skb()选择的同一核处理。
希望这有帮助。