
WFQ
WFQ是加权公平排队(Weighted Fair Queuing)缩写。它是一种拥塞管理算法,该算法识别对话(以数据流的形式)、分开属于各个对话的分组,并确保传输容量被这些独立的对话公平地分享。WFQ是在发生拥塞时稳定网路运行的一种自动的方法,它能提高处理性能并减少分组的重发。
基本介绍
- 中文名:加权公平排队
- 外文名:Weighted Fair Queuing
- 缩写:WFQ
- 类型:一种拥塞管理算法
目标
1为每个活动流提供公平的频宽分配机制
2为少量互动流提供更快的调度机制
3为高优先权流提供更多的频宽
WFQ:是一种基于流的排队算法,到达的数据包被分成多个流,每个流都被分配给一个FIFO伫列。
可以基于IP和TCP或UDP头中以下栏位标识流:源IP位址 目的IP位址 协定号 TOS 源TCP/UDP连线埠号目的TCP/UDP连线埠号
WFQ插入和丢弃策略
WFQ有一个保持伫列(hold queue),保持伫列=WFQ系统中数据包占用的所有记忆体之和,数据包到达时,保持伫列已满,那就丢弃数据包(WFQ主动丢弃WFQ aggressive dropping)
例外:数据包分配到一个空伫列,不会丢弃
原理
基本原理
WFQ是根据流对报文进行动态分类,对于IP网路,五元组(源IP位址、目的IP位址、源连线埠号、目的连线埠号、协定号)和IP优先权或者DSCP相同的报文属于同一个流。在接入层的网路中,通常使用IP优先权和五元组配合进行流分类;在汇聚层网路中通常使用DSCP值和五元组配合进行流分类,具有相同特性的报文属于同一个流,使用Hash算法映射到不同的伫列中;另外的一个区别就是如果使用WFQ,那幺low-volume(位元组数小的报文)、higher-precedence(优先权高的报文)的流会比large-volume、lower-precedence的流更先处理。因为WFQ是基于流的,每个流使用不同的伫列,这就要求WFQ能够支持很大数目的伫列——WFQ最大可以在每个接口支持到4096个伫列。
WFQ与CQ主要区别如下:
WFQ与CQ主要区别如下:
- CQ可以自定义ACL规则来对报文进行分类,而WFQ只能根据元组对报文进行动态分类;
- WFQ和CQ的伫列调度方式不一样,CQ的调度方式是RR,而WFQ的调度机制是WFQ调度机制;
- WFQ和CQ的报文丢弃机制不一样:CQ使用Tail Drop机制,WFQ使用WFQ丢弃机制,该机制是对Tail Drop的一种改进。
要想理解WFQ,必须了解这个机制出现的目的是什幺,即使用WFQ是为了达到什幺目的?WFQ调度主要是为了两个主要的目的,一个是在各个流之间提供公平的调度即WFQ名字中的F(fairness)的含义,另外一个就是保证高IP precedence的流能够得到更多频宽即WFQ名字中的W(weighted)的含义。
频宽分配
为了提供各个流之间的公平调度,WFQ给每个流分配的频宽是相同的。例如一个接口有10条流,该接口频宽为128Kbps,那幺每个流得到的频宽为128/10=12.8Kbps。从某种意义上讲,有些类似于时分复用机制(TDM)。
WFQ允许其它流使用某条流的剩余频宽,例如接口频宽为128kbps,共10条流,则每条流分配的频宽为12.8kbps,可能实际上某条流例如流1只有5kbps,而流2有20kbps,那幺其它的流就可以分配流1所剩余下的12.8-5=7.8kbps的频宽。WFQ的加权是根据流中的IP precedence进行的,保证高IP precedence的流分配到更多的频宽。算法为(IP precedence+1)/Sum(IP precedence+1),例如有四个流,其IP precedence分别为1、2、3、4,那幺每个流占用的频宽分别为2/14、3/14、4/14、5/14。
伫列调度机制
要想理解WFQ的伫列调度机制,需要理解WFQ中的一个重要概念:序列号SN(不同的文档可能採用不同的参数,不管使用什幺参数都应该达到小位元组、高IP优先权的流被优先调度),报文在经过流分类后,在决定该报文是入伫列还是丢弃之前,都要赋予一个SN。SN的计算公式为SN=Previous_SN+weight×new_packet_length,WFQ进行报文调度时都是先调度SN小的报文,为了保证IPPrecedence大的能够获得更多的频宽,从SN的计算公式就可以看出Weight应与Precedence成反比。
其中Previous_SN分为两种情况:
- 如果报文进入的伫列为非空,使用该伫列中最近进入伫列报文的SN作为Previous_SN;
- 如果报文进入的伫列为空,使用传送伫列最近传送的报文的SN作为Previous_SN。

上图中:有四条流,每条流的precedence相同都为0,只是报文的大小不同,Flow1到Flow4的报文长度从大到小,按照SN的计算公式,报文长度小的SN小,所以Flow4中的报文应该被优先调度出去,当然最终的决定因素还是SN的大小,对于SN相同的报文实行顺序调度,如本例所示:Packet5和Packet10的SN相同、Packet1和Packet11的SN相同,按照顺序调度规则,应该是Packet5在Packet10前,Packet1在Packet11前。最终的调度的结果是:13,14,15,16,9,5,10,1,11,6,12,2,7,8,3,4。
丢弃机制
HQL(Hold-Queue-Limit):限制了所有伫列中能够存放的报文总数目;
CDT(Congestive Discard threshold):限制了每个伫列中能够存放的报文数目。
WFQ使用WFQ丢弃机制,该机制是对TailDrop的一种改进,其中的一个决定因素也是SN,另外WFQ还使用HQL和CDT来决定如何对报文进行丢弃。
如果一个新的报文达到时HQL已经到达最大值,该报文直接被丢弃;如果此时HQL没有到达最大值,WFQ将该报文根据WFQ的分类原则进行分类决定进入到哪个伫列并计算出SN,剩下的丢弃机制还会由CDT决定,CDT是每个伫列自己的丢弃阀值,如果此时CDT没有到达最大值报文直接进入该伫列,如果CDT已经达到阀值,则判断其它伫列是否有SN比新进入的报文SN大,如果没有直接丢弃新进入的报文,如果其他伫列有SN大于当前入伫列的报文,WFQ会选择丢弃SN大最大的报文。
简单的说就是当某个伫列的报文数目已经超过该伫列CDT,WFQ可以选择丢弃其它伫列中SN最大的报文!
优缺点
主要优点
WFQ配置简单,无需显示分类
不会让任何流得不到处理机会,能够保证所有流的吞吐量
从最主动的流中丢弃数据包,可以为非主动流提供更快的服务
是一种标準.简单的排队机制,大多数CISCO平台和IOS版本都支持
缺点
WFQ的每个子伫列都继承了FIFO的缺点
WFQ的分类和调度机制是不可配置和无法修改的
WFQ仅支持低速链路(2.048Mbit/s及以下的)
WFQ不能为流量流提供频宽和时延保证
WFQ系统中多个流量流可能会被分配到同一个对列中去
配置和监控
默认情况下,所有低速(2.048Mbit/s及以下)串列接口都启用WFQ
接口模式下: fair-queue [cdt] [dynamic-queues] \\ cdt 为拥塞丢弃门限,dynamic 动态伫列默认为256
hold-queue max-limit out \\定义保持伫列
CBWFQ基于类别的加权公平排队
比WFQ更好,因为可以创建用户自定义的类别,并为所有类别分配专属伫列,每个伫列都有用户自定义的(最小)频宽,而且在有可用频宽伫列可以使用更多频宽。
最多可以创建64个用户自定义类别,每个伫列都是有保证频宽和最大包门限的FIFO伫列,一旦达到最大,就会产生尾部丢弃。
分类,调度和频宽保证
频宽
频宽百分比
频宽剩余百分比
CBWFQ的优点
可以创建用户自定义的类别,利用MQC的分类映射可以很容易地定义这些流量类别
可以基于用户策略和用户意愿为每种流量类别分配/预留频宽
可以基于现有网路套用和用户策略定义最多64个固定类别,从而提供微调手段,而且扩展性更好
缺点:没有为实时性套用提供合适地伫列(VOIP和 视频)无法保证低时延
配置和监控
LLQ
包含了一个优先权伫列,使其非常适合时延和抖动敏感型套用
优点:
LLQ具有CBWFQ的所有优点,包括自定义流量类别,为每种类别的流量提供频宽保证,并且可以在所有类别的伫列上套用WRED。(严格优先权伫列除外)
对于LLQ和CBWFQ来说,任何没有被显示分类的流量都被认为class-default流量,可以将class-default流量类别伫列由FIFO改为WFQ,需要时也可以用WRED.
LLQ最大优势 可以为时延和抖动敏感型套用的流量提供一个或多个有频宽保证的严格优先权伫列
LLQ并不局限于特定平台或传输介质
配置和监控LLQ