- 论坛徽章:
- 0
|
瀚海书香 发表于 2012-03-02 10:07
回复 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,反之亦然。 |
|