朱杰
(南京中兴新软件有限责任公司 江苏省南京市 210012)
QoS 是对网络进行差异化管理的一种技术,针对不同的业务需求为其提供端到端的服务质量保证。有效的利用网络资源,允许不同流量不平等的竞争网络资源。特别在网络拥塞的时候,可以优先保证高优先级报文得到优先调度,进而保证高优先级流量的服务质量。
QoS 主要有三种服务类型:尽力而为服务类型、综合服务类型以及差分服务类型。本文所提到的技术是基于差分服务类型的。QoS 技术包括流量分类、流量监管、流量整形、拥塞管理、拥塞避免等。
流量分类是将数据报文划分为多个优先级或多个服务类,是进行服务的前提,通常作用的接口入方向。可以根据报文输入接口、源IP 地址、目的IP 地址、MAC 地址、IP协议或应用程序的端口号进行分类。
流量监管是指监管进入到某一网络或系统中的各种流量。对特定类型的流量设置一个门限,当超出该门限的时候,则会对这种类型的流量进行惩罚,惩罚的措施包括降低报文优先级、丢弃改报文等。其达到的效果是,防止该流量因过大,导致其他的流量被挤掉。
流量整形主要目的是保证报文从某端口出去的时候,不会产生突发。当上游带宽大于下游带宽的时候,经常可以通过浏览整形的方式,使得流量可以均匀的进入下游流量。因此该技术主要应用的端口的出向方向。
拥塞管理是指当网络出现拥塞时,如何对报文进行差异化调度管理。例如有两种报文,其中一种报文有较高的优先级,另外一种优先级则较低,而低优先级的报文流量很大,导致将整个带宽挤满,此时如果不做拥塞管理,则这两种报文会无差别丢包,而拥塞管理技术则可以将高优先级报文入队到单独的队列,低优先级报文则入另外一个队列,通过优先调度高优先级队列中的报文,保证高优先级报文及时转发出去。常见的优先级调度算法有:严格优先级调度、加权轮询调度、加权公平调度和基于类的调度。
2.4.1 严格优先级调度
一般网络设备或芯片的每个端口又8 个队列,他们的优先级从到到底一次降低。当这些队列设置为严格优先级调度时,则系统设备或芯片则会优先调度优先级最高的队列中的报文,当最高优先级队列中没有报文时,再调用次高优先级队列中的报文,一直到最低优先级队列。
优点:可以保证高优先级的报文及时得到调度。
缺点:如果高优先级队列中一直有报文时,低优先级队列中的报文则一直无法得到调度。
2.4.2 加权轮询调度
加权轮询调度是指各个队列之间按照一定权重进行调度。例如网络设备或芯片的每个端口8 个队列,可以将这8个队列按照一定的比例权重进行配置,如队列7~队列0,权重配置为30:15:10:5:3:2:1:1,则该网络设备或芯片则按照此比例对各个队列中的报文进行加权调度。
加权轮询调度相对于严格优先级调度的好处在于,即使高优先级中仍然有报文,低优先级队列中的报文仍然有机会得到调度。
2.4.3 加权公平调度
加权公平调度和加权轮询调度法类似,在权重算法上都支持 byte-count 和 weight,也支持SP 分组,可以相互替换。
两者的不同之处在于:加权轮询调度支持最大时延,可以保证所配置队列中的报文从进入队列到离开队列的最大时间不超过所设定的最大时延;加权公平调度支持带宽保证,可以保证端口流量拥塞时能够获得的最小队列带宽。
2.4.4 基于类的调度
基于类的调度是指使用者可以根据报文的特征进行归类,并为每个类分配一个独立的队列,当网络发生拥塞时,可以根据用户定义的规则进行匹配调度。
拥塞避免是指网络设备或芯片通过监控其内部的队列使用情况,当队列中的报文超出其预先设置的门限时,主动丢弃报文,进而调整网络中的流量带宽。
图1为一个典型的电信设备内部板卡组合,图中有3 块线卡通过交换板与主控进行通信,主要分为协议报文和控制报文,典型的协议报文如lacp 报文(以太类型为0x8809)、IP 报文(以太类型为0x0800)。其中协议报文优先级高于控制报文,而控制报文的优先级则由其自身携带的vlan 优先级决定。当报文从各个线卡发送到主控时,有可能导致流量拥塞而导致报文无差别丢包。特别是当控制报文很多的时候,会沾满整个链路带宽,此时协议报文将会被挤掉。为了使的高优先级的报文优先被调度,因此需要在交换板与主控板互联的端口上做QOS。
图1
交换板主要使用以太网交换芯片进行报文转发,因此本实践的QOS 主要配置在内部的以太网交换芯片中。
如图2所示,以太网交换芯片每个端口有8 个队列,队列0 到队列7,队列优先级依次升高,其中队列5、6、7 三个队列,优先级配置为严格优先级,队列0、1、2、3、4 配置为WFQ 加权轮转调度优先级,权重为 1:2:3:10:15。
图2
802.1 p 类型的报文vlan 字段携带报文优先级,一共8 个优先级。具体映射如下:
LACP 类型的报文映射到芯片端口的队列7 中,IP 类型的报文映射到芯片端口的队列6 中,
将报文优先级0 映射到芯片端口的队列5 中,将报文优先级1 映射到芯片端口的队列4 中,将报文优先级2 映射到芯片端口的队列3 中,将报文优先级3 映射到芯片端口的队列2 中,将报文优先级4 映射到芯片端口的队列1 中,将报文优先级5、6、7 映射到芯片端口的队列0 中。
主要从如下几个方面考虑:
(1)普通以太报文是否按照我们配置的队列映射进行入队?
(2)特定ethtype 类型是否正确入队?
(3)芯片的sp+wrr 功能是否正常,此处需要验证两种情况:
1.当报文流量大于端口带宽时,队列6(SP)和队列3(WRR)都有报文时,是否优先处理队列6 中的报文?
2.当报文流量大于端口带宽时,队列3(WRR,权重10)和队列1(WRR,权重2)都有报文时,处理的报文比例是否是 5:1。
3.3.1 普通以太报文入队验证
测试仪发送报文优先级为3,按照上述队则应该入队2。如表1所示。
表1
MC_PERQ_PKT(2).xe2 和 MC_PERQ_BYTE(2).xe2 表示该报文进入了端口xe2 的2 队列,符合预期。
结论:普通以太报文入队符合预期
3.3.2 特定ethtype 的报文入队验证
查看芯片的ethtype 配置,lacp(0x8809)和IP(0x0800)的报文分别入队7 队列和6 队列。
接下来我们看下实际的报文入队情况:分两种情况:
3.3.2.1 未知单播的0806 报文
如表2所示。
表2
MC_PERQ_PKT(6).xe2 和MC_PERQ_BYTE(6).xe2 表示未知单播报文进入xe2 口的6 队列,符合预期。
3.3.2.2 已知的0806 报文
接下来我们在芯片中配置一条二层转发表,使上面的报文变成已知单播报文(如表3所示)
表3
UC_PERQ_PKT(6).xe2 和UC_PERQ_BYTE(6).xe2 表示单播报文入队xe2 的6 队列,符合预期。
结论:特定ethtype 报文入队符合预期
3.3.3 芯片sp+wrr 功能的验证
上面几条可以看出我们的所有报文都可以正常入队,现在需要验证的是,在带宽受限的情况下,芯片如何调度各个队列中的报文。
3.3.3.1 带宽受限情况下,sp 和wrr 的调度情况
此处我们同时发2 种报文,一种是0806 的报文,让其进入6 队列,另一种发优先级为2 的普通以太报文,让其进入3 队列。如表4所示。
表4
查看上述两种报文的入队情况,如表5所示。
表5
可以看出上面两种报文分别入6 队列和3 队列,然后对xe2 端口进行限速,并加大上述两种报文的流量发送,使得发送的报文流量大于xe2 的带宽。
查看端口统计,如表6所示。
表6
MC_PERQ_PKT(6).xe2 和MC_PERQ_BYTE(6).xe2 表示6 队列的报文正常转发
MCQ_DROP_PKT(3).xe2 和MCQ_DROP_BYTE(3).xe2表示3 队列的报文丢弃
可以看到所有的队列3 都丢,所有的队列6 都没有丢。
结论:sp 队列中的报文优先处理,当sp 中的报文处理完之后,才会处理WRR 中的报文
3.3.3.2 带宽受限情况下,wrr 队列3 和队列1 调度情况
我们发两种报文,使其分别入3 队列和1 队列,如表7所示。
表7
对xe2 限速,并查看端口统计,如表8所示。
表8
上面的统计显示,在一段时间内队列1 转发报文3,411,262 BYTE,队列3 转发报文15,898,080,两者近似1:5的比例,符合预期。
结论:两个WRR 队列中的报文处理与实际配置的比重一致
通过上述QOS 的配置及验证,很好的解决了因网络拥塞而导致的报文无差别丢包,实现了特定类型报文优先调度的目的。