dpdk-多队列机制

参考: https://blog.csdn.net/wyaibyn/article/details/14109325

随着网络IO的带宽的不断提升,单核CPU不能完全处满足网卡的需求,通过多队列网卡的支持,将各个队列通过中断绑定到不同的cpu核上,以满足带宽处理需求。

常见Intel的网卡有82575、82576,Boardcom的57711等,下面以公司的服务器使用较多的Intel 82575网卡为例,分析一下多队列网卡的硬件的实现。

1.多队列网卡硬件实现

下面是一张网卡,有四个硬件队列queue0,queue1,queue2,queue3。

当收到报文时,通过hash包头的SIP、Sport、DIP、Dport四元组,将一条流总是放到相同的队列。

同时触发与该队列绑定的cpu核上中断。

说明: 上面依赖hash算法实现方式,有可能根据源目的ip+port计算出hash值后,以此hash值为下标到数组中找对应的值。例如,我们使用4个cpu处理一个网卡数据包,那数组中可能存着{0,1,2,3,0,1,2,3......0,1,2,3}这样通过hash值下标就会得到数据包需要交给哪个cpu来处理

2.什么是RSS-如何根据源目的ip+port找对应的core的?

           RSS(Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个CPU之间高效分发的软件技术。

  • 网卡对接收到的报文进行解析,获取IP地址、协议和端口五元组信息
  • 网卡通过配置的HASH函数根据五元组信息计算出HASH值,也可以根据二、三或四元组进行计算。
  • 取HASH值的低几位(这个具体网卡可能不同)作为RETA(redirection table)的索引
  • 根据RETA中存储的值分发到对应的CPU

3.在DPDK中配置RSS

        DPDK支持设置静态hash值和配置RETA。 不过DPDK中RSS是基于端口的(即针对某个网卡的),并根据端口的接收队列进行报文分发的。 例如我们在一个端口上配置了3个接收队列(0,1,2)并开启了RSS,那么(redirection table)就是这样的:

{0,1,2,0,1,2,0.........}

运行在不同CPU的应用程序就从不同的接收队列接收报文,这样就达到了报文分发的效果。

在DPDK中通过设置rte_eth_conf中的mq_mode字段来开启RSS功能, rx_mode.mq_mode = ETH_MQ_RX_RSS

当RSS功能开启后,报文对应的rte_pktmbuf中就会存有RSS计算的hash值,可以通过pktmbuf.hash.rss来访问。 这个值可以直接用在后续报文处理过程中而不需要重新计算hash值,如快速转发,标识报文流等。

RETA是运行时可配置的,这样应用程序就可以动态改变CPU对应的接收队列,从而动态调节报文分发。 具体通过PMD模块的驱动进行配置,例如ixgbe_dev_rss_reta_updateixgbe_dev_rss_reta_query

猜你喜欢

转载自blog.csdn.net/yangguangmeng/article/details/83185995
今日推荐