作为CCIE LAB中最让人头痛的的东西之一,QOS绝对有让我们深度探究的价值。今天,我们就分享一下QOS队列。
一、 CBWFQ CBWFQ (基于类别的加权公平排队),通常使用ACL定义数据 流类别,并将注入宽带和队列限制等参数应用于这些类别. CBWFQ特点: 1. 能够给不同的类保障一定的带宽 2. 对传统的WFQ作了扩展 支持用户自己定义流量的分类: 3. 队列的个数和类别是一一对应,给每个class 保留带宽
CBWFQ与WFQ的区别: WFQ: 用户无法控制分类,由HASH算法自己决定
CBWFQ:让用户对流量自己来分类
WFQ 对正常流量处理没问题,但是对语音流量显得"太公平"(语音要求低延迟)
CBWFQ:考虑到公平特性,并没有考虑到语音的应用
CBWFQ 配置:
CBWFQ(config)#
CBWFQ(config)#class-map match-any CBWFQ1
CBWFQ(config-cmap)#match dscp 6
CBWFQ(config-cmap)#match protocol http //两个条件,满足其中一个就可以匹配CBWFQ1//
CBWFQ(config-cmap)#exit
CBWFQ(config)#
CBWFQ(config)#class-map match-all CBWFQ2
CBWFQ(config-cmap)#match precedence 3 CBWFQ(config-cmap)#match protocol telnet //两个条件必须全部满足才能匹配CBWFQ2//
CBWFQ(config-cmap)#exit
CBWFQ(config)#
CBWFQ(config)#policy-map CBWFQ
CBWFQ(config-pmap)#class CBWFQ1 //调用class-map CBWFQ1//
CBWFQ(config-pmap-c)#bandwidth 60
CBWFQ(config-pmap)#
CBWFQ(config-pmap)#class CBWFQ2
CBWFQ(config-pmap-c)#bandwidth 30
CBWFQ(config)#
CBWFQ(config)#int s0/0 CBWFQ(config-if)#service-policy output CBWFQ //CBWFQ只能在出方向上调用//
CBWFQ#
二、 QOS-WFQ Weighted Fair Queue,加权公平队列。 WFQ将分组按照不同的业务流、不同的IP优先级,自动按照HASH算法,划分成不同的队列,在保证高优先级业务的同时,按照配置权重 ,将带宽公平地分给低优先级别的业务。
WFQ的思想: 1. 为每个流创建一个专用的队列,避免队列的饥饿,延迟,抖动等 2. 在所有流间公平,正确地分配带宽 3. WFQ使用 [IP优先级] 作为分配带宽的权重
在CISCO路由器上,接口小于E1的 链路会默认启用WFQ. 注:在WFQ中,weight的计 算方式为4096/(IP优先级+1)或者32384r/(IP优先级+1)
因此在show queue中看到的weight值越大,表示权重越低。
WFQ优点 1.配置简单(不用手工分类) 2.保证所有的流都有 一定的带宽 3.丢弃野蛮流量 4.大多数平台上都支 持 5.支持所有IOS版本(11.0以上) WFQ缺点 1.每个子队列都继承 了FIFO的缺点 2.多个不同的流可能 会被分入同一个队列(流的数量超过了配置的队 列数) 3.不支持手工分类 4.不能提供固定带宽 保证 5.因为使用了复杂的 分类和调度机制,对系统资源有一定的限制
配置命令: route(config-if):fair-queue cdt dynamic-queues reservable-queues
reservable-queues:保留队列个数:针对RSVP流,可以保留一定的队 列,缺省是0,范围0~1000
dynamic-queues:动态队列个数: 缺省是256,流确实很多,可以调大,最大4096
cdt: 每个队自己的长度
一个数据排到第一个队中,cdt=64,如果该队的报文己达到64,新的报文丢包!
每个队中排的报文数量是有限的
所有队列加起来,上限: router(config-if)#hold-queue max-limit out 缺省1000
一个报文是否在WFQ中排到队列中的二个因素:
1)--本队列是否己满
2)--所有队列是否超出队列上限 ----超出报文丢弃
WFQ 配置:
WFQ(config)#int s0/1
WFQ(config-if)#fair-queue //表面接口启用WFQ,CISCO路由器小于E1会默认启用// WFQ(config-if)#fair-queue 128 1024 100 //设置CDT为128,动态队列数量为1024个,保留队列个数100// WFQ(config-if)#hold-queue 1200 out //所有队列加起来CDT上 限是1200//
查看: WFQ#
WFQ#show int s0/1
Serial0/1 is up, line protocol is up
Queueing strategy: weighted fair
Output queue: 0/1200/64/0 (size/max total/threshold/drops)
Conversations 0/1/256 (active/max active/max total)
Reserved Conversations 0/0 (allocated/max allocated)
Available Bandwidth 1158 kilobits/sec
5 minute input rate 3000 bits/sec, 3 packets/sec
5 minute output rate 3000 bits/sec, 3 packets/sec
1001 packets input, 97009 bytes, 0 no buffer
Received 0 broadcasts, 0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
1004 packets output, 96674 bytes, 0 underruns
0 output errors, 0 collisions, 3 interface resets
0 output buffer failures, 0 output buffers swapped out
3 carrier transitions DCD=up DSR=up DTR=up RTS=up CTS=up
三、 QOS-CQ Customized Queue 用户定制队列 CQ使用了17个子队列(其中0子队列是PQ队列,优先级很高,是留给系统使用的),CQ使用WRR(Round-Robin)机制。 首先谈谈RR机制,RR在处理完一个队列的一个数据包之后,会接着处理另一个队列的一个数据包,一直下去,最后又从第一个队列开始轮流处理每个队列中的数据包,RR中的每个队列的优先级都是一样的。RR的改进版是 WRR(Weighted Round-Robin),WRR允许用户为每个队列分配一个权值,根据这个权值,每个队列都能获得一定的接口带宽。 在CQ 中,权值就是一次轮循中可以转发的字节数。 前面说到了0队列是PQ队列,实际上可以把其他队列也设置成PQ队列: 可以通过以下命令来设置: queue-list list-number lowest-custom queue-number 比如命令queue-list 1 lowest- custom 3,说明0,1,2都是优先级队列,3以及3以上编号的队列都是定制队列。
CQ 配置: r2(config)#
r2(config)#access-list 101 permit ip any any precedence 5
r2(config)# r2(config)#queue-list 16 protocol ip 1 list 101 //把ACL101定义的数据流映射到子队列1中//
r2(config)#queue-list 16 queue 1 limit 40 //设置子队列1的队列深度为40个数据包//
r2(config)#queue-list 16 lowest-custom 2 //设置queue 0,1为优先级队列PQ,其余的为CQ// r2(config)#queue-list 16 interface s0/0 2 //把s0/0接口进入的流量映射到子队列2中//
r2(config)#queue-list 16 queue 2 byte-count 3000 //设置队列2在轮循内可以传输3000字节数据包 r2(config)#queue-list 16 protocol ip 3 //把所有IP流量映射到子队列3中//
r2(config)#queue-list 16 queue 3 byte-count 5000 r2(config)#queue-list 16 default 4 //其它所有流量映射到子队列4中//
r2(config)#int s0/1 r2(config-if)#custom-queue- list 16 //应用CQ到接口s0/1上//
r2(config)#
四、 QOS-PQ PQ使用了4个子队列,优先级分别是high,medium,normal,low。 PQ会先服务高优先级的子队列,若高优先级子队列里没有数据后,再服务中等优先级子队列,依次类推。如果PQ正在服务中等优先级子队列,但是高优先级里又来了数据包,则PQ会中断中等优先级子队列的服务,转而服务高优先级子队列。 每一个子队列都有一个最大队列深度(queue-size),如果达到了最大队列深度,则进行尾丢弃。 PQ优点 1.对高优先级的数据流提供了低延迟的转发 2.大多数平台上都支持该队列机制 3.支持所有的IOS版本(10.0以上) PQ缺点 1.对单一子队列而言,会继承FIFO队列的所有缺点 2.对低优先级的数据流而言,只要高优先级队列里有数据,PQ就不会服务低优先级队列 3.需要在每一跳上都手工的配置分类
PQ 配置: PQ(config)#priority-list 1 protocol ip high list 101 //把Acl101定义的数据映射到high优先级队列//
PQ(config)#priority-list 1 interface s0/0 medium //来自s0/1口的流量映射到Medium优先级队列//
PQ(config)#priority-list 1 default normal //所有其它流量映射到Normal优先级队列// PQ(config)#priority-list 1 queue-limit 20 30 40 50 //分别设置高,中,普通,低优先级队列长度//
PQ(config)#int s0/1 PQ(config-if)#priority-group 1 //把PQ映射到接口s0/1上//
查看:
PQ#show queueing int s0/1
Interface Serial0/1 queueing strategy: priority Output queue utilization (queue/count)
high/13 medium/0 normal/2056 low/0
PQ#show queueing priority
Current DLCI priority queue configuration:
Current priority queue configuration: List Queue Args
1 high protocol ip list 101
1 medium interface Serial0/0
1 medium limit 30
1 normal limit 40
1 low limit 50
五、 QOS-LLQ Low Latency Queueing(低延迟队列 LLQ) 原理:在CBWFQ中添加一个优先 级队列用于实时的流量。 LLQ= CBWFQ+PQ 高优先级队列(priority)得到如下保障:
a)低延迟的报文转发
b)带宽
注:在拥塞发生时,高优先级 的流量同时受到管制---即它们占用的带宽不能超过它们所保障的带宽。
低优先级队列使用CBWFQ。
LLQ 配置:
LLQ(config)#class-map VOIP LLQ(config-cmap)#match ip precedence 5
LLQ(config)#class-map cbwfq1
LLQ(config-cmap)#match ip precedence 3 4
LLQ(config)#class-map cbwfq2
LLQ(config-cmap)#match ip precedence 1 2
LLQ(config)#policy-map LLQ
LLQ(config-pmap)#class VOIP
LLQ(config-pmap-c)#priority percent 10 //针对VOIP类流量使用PQ,这路流量在任何情况下都优先
发送 ,同时最大带宽可以为接口带宽的10%//
LLQ(config-pmap)#class cbwfq1
LLQ(config-pmap-c)#bandwidth percent 30
LLQ(config-pmap)#class cbwfq2
LLQ(config-pmap-c)#bandwidth percent 20 //CBWFQ方式,分别保障30%和20%接口带宽//
LLQ(config-pmap-c)#
LLQ(config-pmap)#class class-default
LLQ(config-pmap-c)#fair-queue //剩下其它队列采用缺省的WFQ调度//
LLQ(config-pmap-c)#
LLQ(config)#
LLQ(config)#int s0/0
LLQ(config-if)#service-policy output LLQ
|