队列调度 - 图文

更新时间:2023-10-03 06:30:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

今天先讲队列,因为中间两个知识点会用到队列的知识。

上图的三种延迟:进程延迟(路由器处理IP包、查找路由表)、队列延迟、传输延迟(与传输线路有关)。

思科路由器转发数据包的三种方式:Process Switching(进程交换)、Fash Switching(快速交换,也叫cache交换)、CEF(Cisco Express Forwarding)。

对于网络单元,当数据包到达的速度大于该接口传送数据包的速度时,在该接口处就会产生拥塞。如果没有足够的存储空间来保存这些数据包,它们其中的一部分就会丢失。数据包的丢失又可能会导致发送该数据包的主机或路由器因超时而重传此数据包,这将导致恶性循环。

对拥塞的管理,一般采用队列机制。当拥塞发生时,报文在路由器出口处按一定的策略入队;在调度时,再按照一定的策略决定报文出队发送的次序。

以下两张图是出现congestion的两种情况举例:

1

Transient:临时的;短暂的。Persistent:持续的。

2

在思科路由器上有软件队列和硬件队列之分。一个队列调度器调度下一个被转发的包的时候

3

不是直接移到出接口,而是把包从软件Q移到另外一个更小的FIFO队列中去,思科称为transimit Q(TX Q)或者transimit ring( TX Ring),这个更小的FIFO队列叫做hardware queue 硬件队列满的时候,有一些队列在软件Q中。此时硬件Q长度为4,不能被队列工具所控制。而软件Q中有之后的5、6、7个包,这三个包是可以被队列调度的,也就是我们通常说的软件队列调度机制是我们最经常操控的,而硬件Q不能被操控,即硬件队列先进先出。

加队也称插入,完成两项工作:1. 决定Queue能容纳多少包(即停车位容量);2. Queue满了之后,采取何种丢弃技术将后续的包丢弃。

调度也称服务策略,采用何种技术将包送入出接口的硬件队列。 注意:

4

注意:上图在分类这一步,并没有采取措施(比如使用ACL)。FCFS即First-Come First-serve 在加队这一步,只有一个Queue,当Queue满了之后,对后续来包采取尾部丢弃法则。 在调度这一步,采取“first come,first serve”方式。

先入先出队列FIFO(First-In First-Out Queueing)——无通信优先权以及分类的概念。使用FIFO 时,数据包从接口的发送顺序依赖于数据包抵达这个接口的顺序,此时报文的入队顺序和报文的出队顺序相同。

FIFO 提供了基本的存储转发能力

5

注意上图,high后面并没有参数可以指定协议类型(如:ICMP协议的协议号是1,TCP的协议号是6),但是有参数list,即可以指定一条acl来匹配ICMP数据流。 配置如下:

R1(config)#priority-list 1 protocal ip low list 100 R1(config)#access-list 100 permit icmp any any

接下来配置“调度”,即将priority-list绑定到哪个接口上,注意Qos通常定义在“出接口”!

查看:show inter serial 0/1

上图的数值为四种优先级队列默认允许最大占包数,默认分别为20/40/60/80。

上图,priority-list 1的配置,将telnet放入high队列,将icmp放入low队列。

下面来测试一下,通过在R1上执行指令“debug priority”查看,如下:

在R1上ping 13.1.1.3,如下:

11

在R1上telnet 13.1.1.3,如下:

PQ缺点:

1.对单一子队列而言,会继承FIFO队列的所有缺点。 2.对低优先级的数据流而言,可能会被“饿死”,因为只有高优先级队列里有数据,PQ就不会服务低优先级队列。

3.需要在每一跳(沿途每一台路由器)上都手工的配置分类。

注意:上图配置在入接口上(基于接口配置PQ),即从该接口进入的数据流都分配high priority。其余未做分类的流进入默认的队列,默认进入normal队列。

12

13

上图,PQ的第一条缺点,PQ仅有四种优先级队列,对于所有的数据流来说,分类有些少,这样导致大部分流进入normal或low优先级队列中,而在单一队列中,又遵守先进先出原则。

PQ的第三条缺点,假如对于语音流配置High优先级,需要在每一台路由器上做同样的配置。

14

上图:CQ在16个队列中“轮询调度”,体现了公平原则,每个Queue默认容纳的包大小为1500字节(每个queue默认容纳的包数目为20),同样采取“尾部丢弃”法则。 其实是16+1个队列(0-16),其中,queue 0为系统队列,它拥有绝对的优先权,分给控制类报文,如ospf hello包。

CQ可以基于两个参数控制queue:1. 限制每个queue最多可容纳的包数(默认20)。2.限制每个queue最多可容纳的字节数(默认1500 Bytes)。

15

上图:在每一轮循环调度过程中,每一个队列只允许发送一定数量的字节数(可配)。

16

上图,如果进入队列的第一个包大小为1499字节,第二个经过调度后进入队列的包大小为1500字节,根据路由器的默认规定,依然可以传送这个1500字节大小的数据包。但是,如果此时有第三个包到来,则不允许进入队列。

上图,将telnet数据流调度进入队列2,将icmp数据流调度进入队列3.

Show inter s/1如下:

上图,因为CQ默认采用RR的调度算法,所以每一个队列的max值都相同,默认20(队列中允许存在的包的最大数目)。

17

注意:缺省使用队列为1。CQ使用了17个子队列(其中0子队列是PQ队列,优先级很高,留给系统使用)。

18

CQ可以基于两个参数控制queue:1. 限制每个queue最多可容纳的包数(默认20)。2.限制每个queue最多可容纳的字节数(默认1500 Bytes)。

R1(config)#queue-list 1 queue 2 limit 40

RR的改进版是 WRR(Weighted Round-Robin),WRR允许用户为每个队列分配一个权值,根据这个权值,每个队列都能获得一定的接口带宽。

在CQ 中,权值就是一次轮循中可以转发的字节数。如上图所示,队列2的权值更高。

19

CQ使用了17个子队列(其中0子队列是PQ队列,优先级很高,留给系统使用),可以把CQ看成是PQ+CQ。

即:0队列是PQ队列,实际上可以把其他队列也设置成PQ队列: 可以通过以下命令来设置:

queue-list list-number lowest-custom queue-number 比如命令:queue-list 1 lowest-custom 3

说明:0,1,2都是PQ队列(0队列总是最优),3以及3以上编号的队列都是CQ队列,按照Round Robin轮询。

r2(config)#access-list 101 permit ip any any precedence 5

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在一个轮循内可以传输

20

46

47

CBWFQ的缺点:调度机制仍然采用了“轮询”方法,即虽然为VOIP流量(假如语音流量进入queue 1中排队)分配了1M的带宽,但是依旧需要等待轮询之后才能从queue 1中调度后,进入出接口buffer并发送到物理链路上去。 即CBWFQ不能为语音流量做出完全保证,仍然会出现延迟和抖动,故又提出了CBLLQ机制。

48

49

CBLLQ和CBWFQ的配置指令区别:将CBWFQ中的bandwidth改为priority,意为严格有限的bandwidth,即不仅为语音流量分配1M的带宽,并且强制优先调度语音流量到出接口buffer中去。

以前面的例子介绍:

50

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中

定制队列CQ(Custom Queueing)―可以根据用户的需求,将流量按TCP/UDP 端口号、ACL、接口类型等进行分类,然后为每种流量分配一定比例的带宽,这样当网络拥塞时,可以保证语音等对延迟有较高要求的流量得到可靠的服务。而当流量不足以达到预留带宽时,其他流量可以自动地占用这些预留带宽,使资源得到了更有效的利用。在CQ 方式下,带宽是按比例分配的。定制队列还可以配置从每个指定队列中抽取出来的字节或数据包的总的数目。 对于速率较低的接口,为其定制队列就能确保通过该接口的数据流也能在一定程度上得到网络服务。

21

CQ (Custom queuing): 定制队列,用户可配置队列占用的带宽比例关系。

CQ共分为17个队列: 0号队列为系统队列,优先调度;1-16为用户队列,轮询调度。 各队列在统计规律上满足用户配置的带宽比例。队列1-16之间没有优先级高低之分。

Weighted的含义:针对不同优先级的报文,实施不同的action。 区分flow与class:

Class是指可以通过手工配置进行区分的数据报文;PQ/CQ/CBWRQ都是基于class的。 Flow是不能手工配置进行区分,只能由路由器自动识别。Flow根据六元组分类。

FBWFQ就是传统的WFQ,基于flow的WFQ,即WFQ自己产生队列,不可以人工干预; CBWFQ是基于Class的WFQ,即可以人工干预。

如上图,Flow N,N不是固定值,数据流进入路由器后,如果已经存在了对应的queue,则根据FIFO排队,如对应的queue已经排满,则尾丢弃;数据流进入路由器后,如果不存在对应的queue,则新创建一个对应的queue。

WFQ能占用多少个队列,和出接口的带宽有关,默认为256,最高四千多。如果手工配置了WFQ最大队列数目,此时新来的数据流有需要新建一个queue,那么会将之前建立的queue清除一个(由算法自动实现)。

可以设置WFQ所有队列中允许存在的所有报文的数量之和,默认不超过1000。如果超过了限值,则不让新的数据包进入队列。

22

哈希算法将任意长度的二进制值(flow parameters)映射为固定长度的较小二进制值(queue number),其特点为:不等长的输入,等长的输出。Hash值相同的,就是相同的flow。 通过哈希算法将flow parameters转换为queue number。

上图,严格说N=256(默认值),意味着可能前255个flow,对应生成255个queue,但是其余所有的flow都进入第256个queue。

23

上图,WFQ默认分配256个队列,对于systerm报文额外增加了8个队列,并且可以为RSVP (如果配置了RSVP)flows保留一定数量的队列数目。 上图标红色的含义:多个flow可能映射到同一个queue,此时容易导致该queue发生拥塞。

不同于PQ和CQ(每个队列的“座位数”是固定的,可以针对每个queue的长度进行调整),WFQ是针对所有256个Queue,进行宏观调控(总共有多少个座位,然后往每个queue中放多少个座位),方法如下图:CDT就是座位数的下限,HQO就是座位数的上限。

举例如下:

24

上图,已有三个数据Flow,对应进入三个队列,一共占了8个座位;

对于新来的数据包,由于数据包的number(数量)超过了CDT定义的值,而且该新来的数据包将要进入的Queue长度是目前所有队列中最长的,那么,将丢弃这个新来的数据包。

25

总结如下:

现有数据包的数量>CDT,如果新来的数据包要进入目前最长的队列,则丢弃该数据包;如果新来的数据包不是进入目前最长的队列,则插入该数据包。

26

上图,已有三种Flow,对应进入三个队列,且占用了10个座位;

对于新来的数据包,由于数据包的number(数量)超过了HQO定义的值,而且该新来的数据包将要进入的Queue长度是目前所有队列中最长的,那么,将丢弃这个新来的数据包。

27

上图,将最长队列中的最后一个数据包删除,然后自己加入队列(图中为第三行的队列)。

上图,CDT和HQO的目的:每个队列中的报文数比较均衡,不会出现某个队列过长或过短。 总结WFQ的三步骤:

分类:自动进行,按FLOW进行分类;

插入:对256个队列宏观调控;丢弃原则(依靠CDT和HQO,具体情况如前面所讲)。 调度:

接下来讲WFQ的调度机制。

28

上图,假设IP Precedence采用默认值0,real packet size为真实报文的大小,A1[100]表示报文A1的大小为100.

那么上图四种报文的FT值如何计算呢?如下图所示:

注意:Finish time即报文在queue中等待被发送出去的时间。图中对于A2来说,必须等A1发送出去之后才能轮到其发送,故A2的FT=100+20,而不是20。

WFQ的调度机制:报文FT数值越小,越优先调度该报文。WFQ的思想:让大包先走。 所以上图中四种报文出队列的顺序为:A1—A2—B1—B2。

上面的方法,仅仅体现出了WFQ的Fair特性,而没有体现出Weighted特性,因为所有报文的precedence都采取默认值0。

为体现Weighted特性,可以将重要报文的precedence设置的大一些,如下图:

29

上图报文发送的先后顺序为:B1—B2---A1—A2.

30

WFQ对于要求较高的业务,可以通过设置较高的IP precedence来保证优先传送。

VOIP采用UDP port range:16384---32767(32767=16384+16383,写16384是因为要求输入的是range of UDP ports)

36

注意:LLQ的配置就上面一条指令。

上图:如何计算可用带宽?用上图公式。注意:默认参数为75%,可以通过指令修改(在接口模式下配置max-reserved-bandwidth percent)

对于serial口,默认带宽为1.544M,故可用带宽=1.544*0.75=1158Kbps,如下图:

如果使用bandwidth修改了默认带宽,则使用bandwidth后面的参数来计算可用带宽。 在前面的例子中,show runn inter s0/0,如下:

S0/0口的可用带宽计算为:1.544*0.75-100=1158-100=1058,如下图(show interface serial 0/0):

37

CBWFQ 是基于类别(class)的加权公平排队,通常使用ACL或者NBAR定义数据流类别,并将注入宽带和队列限制等参数应用于这些类别。 CBWFQ特点:

1)能够给不同的类保障一定的带宽。

2)对传统的WFQ作了扩展,支持用户自己定义流量的分类。 3)队列的个数和类别是一一对应的,给每个class 保留带宽。 CBWFQ与WFQ的区别:

WFQ: 用户无法控制分类,由HASH算法自己决定。 CBWFQ:让用户对流量进行手动分类 。

WFQ 对正常流量的处理没有问题,但是对语音流量显得\太公平\语音要求低延迟)。 CBWFQ:考虑到公平特性,并没有考虑到语音的应用

上图,可通过指令把class default配置为WFQ,则采用“WFQ drop”,而不是默认的“Tail drop”。

38

其余64个队列还采用默认的“Tail drop”。

通常,手工分类仅仅分出2或3个class,而其余的都默认进入class default队列。

CBWFQ

CBWFQ:

分类:64+1=65种类 加队(插入):对应64+1个队列,对于class default,可采用WFQ入队方式;对于其余64个队列,采用FIFO入队方式。 调度(服务策略):直接为每个队列分配不同的bandwidth,然后在65个队列之间进行“轮

39

询”调度。

Bandwidth bandwidth (具体的数值)用于指定具体带宽,该带宽为一个逻辑带宽,常用于计算ospf/eigrp的cost值,或者用于QOS计算带宽。

如果知道接口总带宽,就可以使用percent关键字指定接口可用带宽百分比,0-100取值,

40

可以通过指令max-reserved-bandwidth precent 来配置可用带宽的大小(占物理带宽的百分比)

现在举例说明CBWFQ,如下:

本例目的:为VOIP流量预留50%的带宽,为WWW流量预留20%的带宽,为其余流量预留30%的带宽。

第一步:分类

Router(config)#class-map VOIP------------------------------抓取voip流量,此处利用了NBAR。 Router(config-cmap)#match ip rtp 16384 16383

Router(config)#class-map WWW----------------------------抓取www流量,此处利用了NBAR。 Router(config-cmap)#match protocol http

第二步:策略

配置policy-map,见上图,其中,bandwidth后面参数有三种选择:

如果选择配置具体的数值,则该方式为CBMarking(CBMarking是打标记的一种方式)。 如果选择配置percent,则该方式就是CBWFQ;

Show running-config如下:

42

注意:必须显式配置针对其余流量预留的带宽(30%),如果不配置,则为其余流量预留的带宽将为总带宽(物理带宽)的5%(因为默认情况下接口可用最大带宽为物理带宽的75%,即:75-50-20=5)。

如上图,显式配置针对其余流量预留的带宽(30%),则为其余流量预留的带宽将为总带宽(物理带宽)的30%。

下面将policy-map绑定到端口上:

注意:CBWFQ虽然可以在接口上选择input方向,但是这样没意义,因为是要在接口的出队列方向进行调度,所以这里要选择output方向。

使用NBAR简化了配置,无需再配置ACL来定义特定的数据。注意,此时,将policy-map绑定到接口时,需要增加一条指令,如下:

然后在S0/0口绑定policy-map,如下图:

发现,对于除voip和www之外的流量,此时的可用带宽仅为5%,而要求预留的带宽为总带宽的30%,这是因为端口默认最大带宽为总带宽(物理带宽)的75%。 故需要配置:max-reserved-bandwidth 100,如下:

43

上图,把class-default配置为WFQ,默认为FIFO。

上图中的提示为:要配置为WFQ,就不能包含bandwidth指令。

44

上图为配置WFQ中的CDT,class-default配置为WFQ。

上图,F0/0口上配置了LLQ,为语音流量分配1000k的带宽。

45

本文来源:https://www.bwwdw.com/article/bvod.html

Top