前言:QoS是网络中提供差异化服务的重要方法,它通过区分不同的流量和优先级,为不同的应用和使用者提供不同质量的网络服务,比如,金融网络,可能购买了专线,要求延迟小,更不能忍受丢包,自然优先级就高些;又比如网络直播和游戏,对于网络的延迟要求非常高,而普通的上网用户则没有这么高的要求(土豪除外)。DPDK中提供了QoS的参考框架,包含了多个流程组件,十分有趣。
一.DPDK QoS 概述
在DPDK提供的QoS框架中,一个复杂的处理流程被分成了几个不同的处理阶段,如下图所示:
对于这些流程中模块,其具体解释是这样的:
从这个图中可以看出,整个包的处理过程被分成了4个阶段完成。
- 1.第一阶段是在线程0中的,主要的工作就是接收包然后进行检查校验。
- 2.第二阶段是一个重点,主要工作是进行流分类,测速和负载均衡。把不同的流量导到不同的工作负载核上。
- 3.第三阶段是在不同的负载核上处理业务报文。
- 4.第四阶段也是一个非常重要的阶段,主要工作是根据算法调度,丢弃,最后发送出去。
这次重点介绍QoS的部分,也就是第四阶段,第二阶段的流分类和负载均衡在后面再进行单独说明。
二.DPDK QoS模块分析
因为重点分析的是第四阶段的处理过程,所以,这个阶段中主要包含3个模块:测速标记模块(流量监督,police),弃包策略模块(拥塞避免,dropper),调度模块(拥塞管理,sched)。依次说明这三个部分。
在QoS里,有两个概念:流量监督和流量整形。他们的区别是流量监督对于不符合流量特征的报文直接丢弃,而流量整形对于不符合流量特征的报文进行缓存,减少了丢包;自然,相对的,流量整形可能就引入延迟,而流量监督几乎不会导致延迟。
2.1 测速标记模块
测速模块主要就是测量一个流的速度,然后根据速度情况打上颜色标记。DPDK中提供了2种测速标记算法---srTCM(单速三色标记)和trTCM(双速三色标记)。通过算法计算,会根据结果为每个包标记上红或者绿或者黄三种颜色。
2.1.1 令牌桶算法
无论是srTCM还是trTCM都是基于令牌桶算法实现的,了解了令牌桶算法,就了解了这两种测速标记算法的大部分。简单的说,令牌桶算法测速限速的原理就是:每个符合规则的报文,只有在从桶中拿到令牌后才能发送出去。那桶中的令牌是怎么来的呢?可以自己设置桶中令牌生成的速度,也就是通过设置生成令牌的生成速度来定义发送数据包的速度。通常为了数据包解决突发性问题等,会使用2个令牌桶,根据他们各自生成令牌的速度,分为单速三色标记和双速三色标记。具体详细的令牌桶算法可以参考如下链接:http://blog.csdn.net/maotianwang/article/details/41310957
2.1.2 DPDK测速标记接口
测速标记接口使用起来,非常简单,主要接口定义在rte_meter.c
和rte_meter.h
中,在使用前先配置一下限速的参数。struct rte_meter_trtcm_params
,这是使用双速三色算法的配置参数结构体。配置完成后,就在处理每个符合规则的包时,调用rte_meter_trtcm_color_blind_check()
来给当前的包标记颜色,这里使用了色盲模式,对于单速和双速算法,都可以使用色盲或者非色盲模式,他们的差别就是色盲模式对于包已经标记的颜色不关心,只计算当下应该标记什么颜色;而非色盲模式会关心包已经被标记的颜色,再结合当下的情况,综合以后再标记颜色。
2.2 拥塞避免模块
拥塞避免使用的主要算法是RED(早期随机丢弃),当拥塞快要发生前,提前丢弃一些报文,避免最后拥塞发生。当然,这里的随机丢弃是这样的:算法设置有两个阀值,当小于最小阀值时不丢弃,当介于最小阀值和最大阀值之间,随机丢弃,当大于最大阀值时,采用尾丢弃。如下盗图:
自然,在随机丢弃阶段,因为所有的包一视同仁,可能会丢弃真正重要的包。因此,可以采用WRED等,带有权重的随机丢弃算法,根据优先级的不同选择丢包。
2.2.1 DPDK拥塞避免接口
拥塞避免接口主要定义在rte_red.c
和rte_red.h
文件中,使用起来也很简单,也是要先配置阀值等参数。配置完成后,当数据包到来时,会根据队列剩余的空间大小,来决定是否需要丢弃数据包。
rte_red_config_init()
,对算法的参数进行配置。rte_red_enqueue()
,如果返回值为0,则不丢弃;如果返回值为1,则表示超过最大阀值丢弃;如果返回值为2,丢弃,因满足随机丢弃条件而丢弃。
拥塞避免模块经常和拥塞sched一起使用。
2.3 拥塞管理模块
在拥塞管理模块中,主要就是一个调度功能。DPDK的调度功能是分层调度,共分为4个层次,如下图:
其每一层次代表的意思看下图的解释:
这种分层调度是个很复杂的过程,具体细节就没有细究了。最后看一下其接口吧。
2.3.1 拥塞管理接口
首先也是进行每一个层次的初始化配置:
rte_sched_port_config();rte_sched_subport_config();rte_sched_pipe_config()
,对于每一层的配置,都有对应的结构体。如struct rte_sched_subport_params
等。根据需要设置参数。rte_sched_port_enqueue()
尝试入队,在其中就会进行RED算法和调度处理,如果符合条件,则可能会丢弃数据包,所以,返回值是实际调度的数据包个数。rte_sched_port_dequeue()
, 取出存在队列中经过调度的包,然后就可以发送了。
三.总结:
QoS为数据包的发送管理提供了一整套的机制,目的在于提高网络的平稳性,根据网络业务的情况,合理分配资源,最大限度保障各方网络使用者都能满足需求。对于其中的流量监督,整形,调度等多种手段,既可以单独使用,也可以结合使用,如果配合流分类技术,即可使得QoS对流量的管理更加有针对性。
来源:https://www.cnblogs.com/yhp-smarthome/p/6901317.html