一、多队列网卡
网卡多队列,显而易见说的就是传统网卡的DMA队列有多个,网卡有基于多个DMA队列的分配机制,它可以同时处理多个网络流量队列。

多队列网卡的优点主要有以下几点:
- 提高网络传输的效率和吞吐量。多队列网卡可以将网络流量分配到不同的队列中,每个队列都有自己的处理能力,从而避免了单一队列的瓶颈问题,提高了网络传输的效率和吞吐量。
- 实现流量隔离和优先级控制。通过使用不同的队列,可以实现流量隔离和优先级控制,从而提高网络的服务质量。
- 提高网络性能和可靠性。多队列网卡可以提高网络性能和可靠性,特别是在高负载和高并发的情况下。
二、DPDK处理网络数据流程
DPDK主要应用UIO、HUGEPAGE和CPU Affinity机制3个技术点直接提高高度网络数据的处理性能。
内核接收数据包处理流程:从网卡收到报文后,通过DMA机制将报文放到内存 -->网卡触发中断通知系统有报文到达(一个报文,一个中断),系统分配sk_buff,将报文copy到这块sk_buff -->经过协议栈处理,将报文传送用户态应用程序处理。

传统内核流程:硬件中断->获取数据包分发到内核线程->软件中断->内核线程在协议栈中处理数据包->数据包处理完毕通知用户层用户接收数据包->网络层->逻辑层->业务层
DPDK流程:硬件中断->放弃中断流程、用户层通过设备映射获取数据包->进入用户层协议栈->逻辑层->业务层
三、DPDK与多队列网卡
多队列网卡和DPDK可以结合使用,以进一步提高网络性能和可靠性。通过使用多队列网卡,可以将网络流量分配到不同的队列中,然后使用DPDK来优化每个队列的处理能力。这样可以实现更高的网络吞吐量和更低的延迟,从而提高网络应用程序的性能和可靠性
我们从DPDK提供的一些列以太网设备API入手,可以发现Packet I/O机制与生俱来的支持多队列功能,可以根据不同平台或者需求,选择需要支持的队列数目,可以很方便地使用队列,指定队列发送或者接收,由于这样的特性,可以很容易实现CPU核、缓存与网卡多队列之间的亲和性从而到达很好的性能。
一、从RTC模型为例来看,核、内存、网卡队列之间的关系理解DPDK是如何利用网卡多队列技术带来的性能提升。
- 将网卡的某个队列分配给某个核,从该队列中收到的报文都应当在该指定的核上处理结束。
- 从核对应的本地存储分配内存池,接收报文和对应的报文描述符都位于该内存池。
- 为每个核分配一个单独的发送队列,发送报文和对应的报文描述符都位于该核和发送队列对应的本地内存池中。
所以通常情况我们绑定一个核使用一个单独的发送队列来避免多个核访问同一个队列带来的锁开销。当然也可以绑定多个队列到一个核,总之在设计时尽量避免引入保护队列的机制。对应的可以看源码中l3fwd的例子,其中每个核对应结构中记录了操作的队列是哪个队列。除了队列和核之间的亲和性这个主要目的之外,网卡多队列机制还可以用与Qos调度、虚拟化等。

在DPDK提供的QoS框架中,一个复杂的处理流程被分成了几个不同的处理阶段,如上图所示 ,从这个图中可以看出,整个包的处理过程被分成了4个阶段完成。
- 1.第一阶段是在Thread0中的,主要的工作就是接收包然后进行检查校验。
- 2.第二阶段是一个重点,主要工作是进行流分类,测速和负载均衡。把不同的流量导到不同的工作负载核上。
- 3.第三阶段是在不同的负载核上处理业务报文。
- 4.第四阶段也是一个非常重要的阶段,主要工作是根据算法调度,丢弃,最后发送出去。
四、DPDK QoS模块分析
这次重点介绍QoS的部分。重点分析的是第四阶段的处理过程,这个阶段中主要包含3个模块:测速标记模块(流量监督,policer),弃包策略模块(拥塞避免,dropper),调度模块(拥塞管理,sched)。依次说明这三个部分。
在QoS里,有两个概念:流量监督和流量整形。他们的区别是流量监督对于不符合流量特征的报文直接丢弃,而流量整形对于不符合流量特征的报文进行缓存,减少了丢包;自然,相对的,流量整形可能就引入延迟,而流量监督几乎不会导致延迟。
4.1 测速标记模块
测速模块主要就是测量一个流的速度,然后根据速度情况打上颜色标记。DPDK中提供了2种测速标记算法---srTCM(单速三色标记)和trTCM(双速三色标记)。通过算法计算,会根据结果为每个包标记上红或者绿或者黄三种颜色。
4.1.1 令牌桶算法
无论是srTCM还是trTCM都是基于令牌桶算法实现的,了解了令牌桶算法,就了解了这两种测速标记算法的大部分。简单的说,令牌桶算法测速限速的原理就是:每个符合规则的报文,只有在从桶中拿到令牌后才能发送出去。那桶中的令牌是怎么来的呢?可以自己设置桶中令牌生成的速度,也就是通过设置生成令牌的生成速度来定义发送数据包的速度。通常为了数据包解决突发性问题等,会使用2个令牌桶,根据他们各自生成令牌的速度,分为单速三色标记和双速三色标记。具体详细的令牌桶算法可以参考如下链接:http://blog.csdn.net/maotianwang/article/details/41310957
4.1.2 DPDK测速标记接口
测速标记接口使用起来,非常简单,主要接口定义在rte_meter.c和rte_meter.h中,在使用前先配置一下限速的参数。struct rte_meter_trtcm_params,这是使用双速三色算法的配置参数结构体。配置完成后,就在处理每个符合规则的包时,调用rte_meter_trtcm_color_blind_check()来给当前的包标记颜色,这里使用了色盲模式,对于单速和双速算法,都可以使用色盲或者非色盲模式,他们的差别就是色盲模式对于包已经标记的颜色不关心,只计算当下应该标记什么颜色;而非色盲模式会关心包已经被标记的颜色,再结合当下的情况,综合以后再标记颜色。
4.2 拥塞避免模块
拥塞避免使用的主要算法是RED(早期随机丢弃),当拥塞快要发生前,提前丢弃一些报文,避免最后拥塞发生。当然,这里的随机丢弃是这样的:算法设置有两个阀值,当小于最小阀值时不丢弃,当介于最小阀值和最大阀值之间,随机丢弃,当大于最大阀值时,采用尾丢弃。

4.2.1 DPDK拥塞避免接口
拥塞避免接口主要定义在rte_red.c和rte_red.h文件中,使用起来也很简单,也是要先配置阀值等参数。配置完成后,当数据包到来时,会根据队列剩余的空间大小,来决定是否需要丢弃数据包。
- rte_red_config_init(),对算法的参数进行配置。
- rte_red_enqueue(),如果返回值为0,则不丢弃;如果返回值为1,则表示超过最大阀值丢弃;如果返回值为2,丢弃,因满足随机丢弃条件而丢弃。拥塞避免模块经常和拥塞sched一起使用。
4.3 拥塞管理模块
在拥塞管理模块中,主要就是一个调度功能。DPDK的调度功能是分层调度,共分为4个层次,如下图:

五、 总结
DPDK的QoS(Quality of Service)是指通过对网络流量进行分类和优先级处理,以确保关键应用程序的网络性能和可靠性。DPDK支持多种QoS技术,包括流量分类、流量限制、流量调度和流量标记。通过这些技术,DPDK可以确保关键应用程序的网络流量优先级高于其他流量,从而提高网络性能和可靠性。此外,DPDK还支持动态QoS,可以根据网络流量的实时情况进行动态调整,以确保网络性能和可靠性的最佳平衡。总之,DPDK的QoS是一项非常重要的功能,可以帮助开发人员和管理员管理高负载服务器和数据中心的网络性能和可靠性。