瀚海书香 发表于 2012-02-29 11:32

多队列网卡RSS与RPS的配置

4核心CPU,网卡(82580)队列设置为4个队列。
在开启RPS的情况下,是否有必要将4个队列的中断指定到不同的CPU上?

瀚海书香 发表于 2012-02-29 11:44

回复 1# 瀚海书香
先说一下个人的观点:
可以将不同的队列中断指定到不同的CPU,充分利用RRS的特点。
但是由于数据包大部分的处理在软中断和应用层,所以即使不使用的RRS,由于RPS/RFS仍然会将数据包分发到各个CPU处理,所以跟开启RSS的情况相比,性能应该不会差距太大。

   

crspo 发表于 2012-02-29 16:41

瀚海书香 发表于 2012-02-29 11:32 static/image/common/back.gif
4核心CPU,网卡(82580)队列设置为4个队列。
在开启RPS的情况下,是否有必要将4个队列的中断指定到不同的 ...

如果是 TCP/UDP 应用,建议开启RFS,可以将stream导入到期望的CPU上。而RSS仅仅是根据hash值确定处理器。
由于RFS/RSS都不能提供irq affinity hint,所以使用irqbalance足够。

rocky1972 发表于 2012-03-01 21:15

回复 1# 瀚海书香


    驱动自己来设置affinity, 不用用户自己制定的

瀚海书香 发表于 2012-03-02 08:22

回复 4# rocky1972
很遗憾,并不是所有的操作系统都会这么做的。而且开启中断均衡能否提高效率还是一个问题?因为简单的硬中断均衡可能会导致数据包乱序

   

独孤九贱 发表于 2012-03-02 09:24

瀚海书香 发表于 2012-03-02 08:22 static/image/common/back.gif
回复 4# rocky1972
很遗憾,并不是所有的操作系统都会这么做的。而且开启中断均衡能否提高效率还是一个问 ...

你硬件既然都支持多队列了,最好就不用软件了,再调度一次,多一次性能消耗。除非有非要再调度一次的必要理由。

瀚海书香 发表于 2012-03-02 10:07

回复 6# 独孤九贱
你硬件既然都支持多队列了,最好就不用软件了,再调度一次,多一次性能消耗。除非有非要再调度一次的必要理由。
但是硬件调度只是单纯的hash调度,而RFS可以根据sock来调度。
比如进程A运行在CPU1上,但是网卡队列却将数据包的软中断调度到CPU2上,那么缓存的效率就会降低。
而RFS却可以将属于A的数据包的软中断调度到CPU1上。

不知道RFS在缓存这块的优势与其因为调度而耗费CPU的劣势相比,那个会更好一些?

   

crspo 发表于 2012-03-02 13:26

瀚海书香 发表于 2012-03-02 10:07 static/image/common/back.gif
回复 6# 独孤九贱

但是硬件调度只是单纯的hash调度,而RFS可以根据sock来调度。


硬件可以做perfect filters, 参考sfc卡,sfc有1024个perfect filters可以针对五元做精确的匹配。
另一个可以参考的是ixgbe, ixgbe有基于hash的filters也有perfect filters

sfc和ixgbe都可以和驱动协作:

sfc采用的是accelerate RFS方法,这种方法基于RFS,它讲软件维护的flow to cpu表,通过irq affinity逆向映射既cpu to vector表,得到一个flow to vector表,每个队列(确切的说是channel)都有自己的MSI-X映射,所以由此得到了flow to queue映射,这时候RFS通过驱动程序注册的回调函数,讲flow to queue映射翻译成网科可以理解的filter表项。通过这种方式,sfc可以讲packet直接发送给期望的cpu,避免的IPI带来的开销,而且管理员可以根据配置irq affinity。

ixgbe采用的是另外一种方法,他使用的的hash filter,并且尽可能的为每一个CPU分配独占的队列,这是通过:
1)在发送是基于smp_processor_id()取得tx queue的队列
2)接受端绑定irq affinity,尽可能的使映射为1:1映射
通过两种方式,每个CPU(在CPU总数不是太多时)有自己独占的队列。
另外ixgbe采用的是ATR(Application Target Receiving),既如果一个flow的packet最后是从CPU M(队列M)发送的,那在接受这个队列的包时也被放到队列M中由CPU M处理。可以参考ixgbe_atr()实现,ixgbe在包发送前,都会对82599的hash filter编程,确保该flow的包被送到发送的处理器。

两种方式各有千秋,很难说那种好。理论上说ixgbe可以被修改并使用accelerate RFS,反之亦然。

瀚海书香 发表于 2012-03-02 14:41

回复 8# crspo
按你所描述的ixgbe的情况,我认为就完全不需要RFS了,因为他已经可以做到基于sock或者说进程的分发了。
但是像e1000e这样的网卡驱动,貌似只是简单的hash吧,应该没有考虑到处理数据包进程所在的CPU的情况吧?

   

独孤九贱 发表于 2012-03-02 17:11

瀚海书香 发表于 2012-03-02 14:41 static/image/common/back.gif
回复 8# crspo
按你所描述的ixgbe的情况,我认为就完全不需要RFS了,因为他已经可以做到基于sock或者说进 ...

实际测试,软件重新调度,至少在高速网络上的性能损耗太大了……所以我一般不用,除非万不得已。
页: [1] 2 3
查看完整版本: 多队列网卡RSS与RPS的配置