队列管理算法及优化策略

看了好几天队列管理方面的论文,筛筛检检,整理出一篇比较全面的文章来,开心的说~

 

关于概念:

仿真试验采用Berkeley开发的网络仿真软件NS2进行。NS2集成了多种网络协议(如TCP、UDP),业务类型(如FTP、Telnet、Web等),路由队列调度算法(如Drop Tail、RED、FQ等),路由算法(如Dijkstra等)。可参看DropTail、RED、SFQ(Stochastic Fair Queuing)和DRR四种队列调度算法。

 

在网络传输中存在三种类型的连接:

非适应(Non-adaptive)流:指没有采用拥塞控制机制,因而不能对拥塞做出反应的流,如很多多媒体应用和组播都属于此类;

强壮(Robust)流:能够对拥塞通知做出反应,并且充分利用现有的网络条件发送数据的流;

脆弱(Fragiie)流:能够对拥塞通知做出反应,但它们要么对丢包过于敏感,要么对有更多可用带宽的适应很慢。比如很多交互应用,都属于这种类型。

 

TCP/IP拥寒控制主要包括两个方面,一是发送端的拥塞控制,称为源端拥塞控制,二是中间节点的拥塞控制,称为队列管理

 

中间节点有2类和拥塞控制相关的队列算法:队列调度算法队列管理算法。前者决定下一个要发送哪个包,主要用来管理各流之间带宽的分配;后者主要是在网络发生拥塞时通过丢包来管理队列长度。目前的队列管理机制可以分为2大类:被动式队列管理POM(Passive 0ueue Management)和主动式队列管理AQM(Active Queue Management)。

 

被动式队列管理是对每个队列设置一个最大值(以包为单位),然后接受包进入队列直到队长达到最大值.接下来到达的包就要被拒绝进入队列直到队长下降。这种技术也就是传统的“去尾”(drop tail)算法。还有Random Drop 和 Drop Front等。

虽然“去尾”算法在当前Internet 上得到了广泛的使用,但其存在两个重要问题:

(1)死锁(Iock-out)现象:在某些情况下,由于同步或其他定时作用的结果,“去尾”算法会让某个流或者少数几个流独占队列空间,阻止其他流的包进入队列.

(2)满队列(fuII gueues)问题:由于“去尾”算法只有在队列满时才会发出拥塞信号,因此会使得队列在相当长时间内处于充满(或几乎充满)的状态. 而Internet 数据的突发性使得队列在满状态下会产生“TCP 全局同步”(TCP gIobaI synchronization)现象.

补充:

由于Internet上的数据流都具有突发本质(Burstiness),到达路由器的封包也往往是突发的。如果队列是满的或者几乎是满的,就会导致在短时间内连续大量的丢包。而TCP数据流具有自适应特性(Adaptive),来源端发现封包丢失就急剧地把传送速率降低,于是网络拥塞情况得以解除,但来源端在得知网络不再拥塞后又开始增加发送速度,最终又造成网络拥塞。这种现象常常会周而复始地进行下去,因此网络常处于链路利用率很低的状态,降低了整体吞吐量,这就是所谓的TCP全局同步现象。

 

主动式队列管理是核心路由器在拥塞发生之前,通过检测数据包的状态特征(比如分组标记、延时时间等).按照一定的控制率主动的而非响应性的丢弃数据包。这使得路由器能够控制在什么时候丢多少包。从而有效地管理队列长度,以支持端到端的拥塞控制.

 

AQM机制的主要性能指标包括链路利用率,报文丢弃率以及平均队列长度等。平均队列长度决定了报文的排队延迟,队列长度的起伏(一般称为队列动荡)决定了延迟抖动。

AQM 解决的问题主要包括以下4 个方面:

( 1) 早期探测路由器可能发生的拥塞, 并通过随机丢弃或标记分组来通知源端采取措施避免可能发生的拥塞.

( 2) 公平地处理包括突发性、持久性和间隙性的各种TCP 业务流.

( 3) 避免多个TCP 连接由于队列溢出而造成同步进入 慢启动 状态.

( 4) 维持较小的队列长度,并且使得队列动荡比较小,在高吞吐量和低时延之间做出合理平衡.

 

RED算法

Braden等人于1998年在IETF提出AQM的研究动议。novd和Jacobson于1993年提出实现技术指标的RED算法。其基本思想是路由器通过监控队列的平均长度来探测拥塞。一旦发现拥塞逼近.就随机地选择源端来通知拥塞。使它们在队列溢出之前降低发送数据速率,以缓解网络拥塞。

 

RED算法主要分为两部分:

1)计算平均队列长度(指数加权滑动平均--exponentialweighted moving average)。

队列管理算法及优化策略

使用平均队列长度的目的是将中间节点上的暂态过滤掉,平滑队列长度。Wq相当于低通滤波器长度,决定了q变化时,avg改变的快慢。通常Wq的值较小时,avg与实际队列的变化相比有一定滞后,但可防止RED对短暂的队列干扰反应过激。

2)计算丢包概率。

队列管理算法及优化策略

RED并不直接把Pb作为数据包丢弃的概率,RED希望数据包丢弃相对均匀分布,对一个突发流不进行惩罚,所以引进一个变量count,其用来保存上次丢包后收到的数据包个数, P为实际丢包率,随着Count的变大,到达数据包被丢弃的概率也在增加,这样做的目的是实现丢包间隔均匀,避免连续丢包,导致扼杀突发数据流和数据流同步。

 

 具体算法如下:

队列管理算法及优化策略

 

算法具体描述如下:数据包到达路由器后,需要在不同的输出端口缓冲区中进行排队,每一个输出端口维护一个队列;当有新的数据包到达时,采用指数加权滑动平均的方法计算平均队列长度avg(这个平均是指对时间的平均),并把avg 与两个预先设定的门限( 最小门限minth和最大门限maxth )相比较,若平均队列长度avg 小于minth,则不丢弃分组;若avg 大于或等于maxth,则丢弃所有分组;若avg 大于或等于minth而小于maxth,则根据平均队列长度avg 计算概率pa,以概率pa丢弃到达的分组。如图l所示,其中q_time 表示队列为空的起始时刻;count 表示上次丢弃分组后收到的分组数目;wq表示计算队列的平均长度时采用的权重;maxp表示pa能够取得的最大值;pb表示当前分组被丢弃的概率;q 表示当前队列的实际长度;time 表示当前时间;(f t)表示时间 t 的线性函数。

 

总结:

RED的稳定性主要由最大报文丢弃概率决定,队列动荡主要由队列的最小阈值和最大阈值之间的差值决定。

 

RED变种算法

RED 算法的性能敏感于配置参数和网络状态,在特定的网络负载状况下依然会导致多个TCP 的同步,造成队列震荡,吞吐量降低和时延抖动加剧.为了增强RED 算法的鲁棒性,研究者提出了一系列的RED 变种算法,典型的有Stabilized RED、Balanced RED、FRED、Adaptive RED、 Selfconfiguration RED、Weighted RED和gentle-RED等. 

其中FRED 和Balanced-RED 侧重解决RED 存在的公平性问题,其余均意在增强RED 的稳定性,如RED-gentle 在最大门限值与队列长度之间用斜线代替了原来竖直的工作曲线,以避免队列工作在该区间上时由于丢弃概率的突变而容易导致队列的震荡. 为克服负载变化对RED 稳定性的影响,Stabilized-RED 用称为Zombie 的列表来估计**的TCP 连接数; Selfconfiguration  RED 用队长作为观测负载的状态参数,并依据负载状态,动态调整分组丢弃概率. 作为对 Selfconfiguration  RED 的进一步改进,在调整丢弃概率时,Adaptive RED 用加性增加倍乘减小(AIMD)策略替代了倍乘增加倍乘减小(MIMD)策略,并提出了目标队长的概念.

 

Adaptive RED(ARED)

RED 算法的拥塞指示的发送速率是由参数maxp来体现的.如果maxp太大,那么丢包比例主要就是由于早期拥塞检测中产生的丢包造成的;如果maxp太小,丢包主要就是由于队列溢出造成的.RED 的一个弱点是平均队长对流量负荷和参数设置很敏感,导致队列长度波动较大,结果造成平均排队时延对流量负荷和参数设置很敏感.ARED提出了一种自动配置机制,根据流量的变化来配置参数maxp .

 ARED 的基本思想就是通过检查平均队长的变化来决定RED 是应更激进还是更保守,从而尽量保持平均队长在minth和maxth之间. 具体地说,如果平均队长是在minth附近振荡,说明拥塞控制太激进了,那么就减小maxp,队列管理算法及优化策略;如果在maxth附近振荡,说明拥塞控制太保守了,那么就增大maxp,队列管理算法及优化策略

ARED 是对RED 改动很小的一种算法,它保留了RED 的基本结构,只需调节参数maxp从而保持平均队长在minth和maxth之间,消除了RED 的队列延时问题和参数敏感性问题.当拥塞发生时采用这种控制方式能够保证高吞吐量和低丢包率,有效地提高网络性能。

 

ARED虽然解决了RED的参数敏感性问题,但其自身也带来了参数设置问题。α、β设置太大,maxp振荡过于频繁,不利于网络性能稳定;α、β设置太小,maxp就要经过多次调整荡才能达到期望值。


 

FRED

FRED(flow random early detection)是RED的一个关于公平性的重要改进版本,它根据活跃流在队列中缓存的包数量来对使用不同带宽的流做出不同的丢包决策,从而提高了流之间带宽分配的公平性.对于非适应流,给予较高的丢包概率;对于脆弱流和强壮流,以低丢包概率保护其带宽占有率.平衡每个流在队列中缓冲的包数量就平衡了流带宽是FRED算法公平性的基本思想,因为每个包都是依次从队列头被转发的.

采用该算法能够对非适应流进行有效的鉴别和管理,同时能够有效保护脆弱流,增强RED 算法的公平性。但是该算法需要维护每个流的信息,计算量较大,明显增加了路由器的负载。

 

它只把当前在队列中有包的流定义为活跃流,并维护这些流的数量nactive,以及他们在队列中的平均每流包个数avgcq;它对每个活跃流进行记账(accounting),维护活跃流的当前缓存包数量qlen[i]和一个击中次数值strike.当在平均队长小于maxth时保护在队列里缓存包较少的流,只对包数

量大于avgcq的流进行随机包丢弃.同时它用qlen[i]≥maxq||(avg≥maxth&&qlen[i]>2*avgcq)||(qlen[i]≥avgcq&&strike[i]>1)作为判别条件鉴别和惩罚非适应流,对这些流的击中次数strike加1,同时丢弃当前包.在FRED算法中一旦流的strike>1而被鉴别为非适应流后,原来的随机丢弃不再起作用,不管平均总队长avg的情况如何,一旦该流缓存包数量qlen[i]大于等于平均每流包数量avgcq时,马上丢弃该包,从而对非适应流进行惩罚.而且在整个算法中strike只会继续增加不会减少,直到队列中没有该流的包后,删除状态表项时strike才会被清零.把鉴别和管理非适应流的部分语句节录如下:

队列管理算法及优化策略

 

改进:当鉴别非适应流的条件满足时,对当前流的strike值加上一个数N而不是加1,在strike的值大于M(M>N)时判定该流为非适应流并进行惩罚;在包离开队列时如果当前流的strike值为非零则对strike减1.这样在一个TCP流在鉴别条件满足后,将因丢包而调整发送速率,在若干个包被转发后,strike又回到0,重新被鉴别为适应流,从而纠正了错误.而侵略性的(aggressive)非适应流由于不对丢包做出反应,鉴别非适应流的条件被满足后strike值每次以N增加的速度大于包转发时每次减1的速度,将始终被鉴别为非适应流.改进后的算法称之为MFRED(modified flow random early detection).N、M的取值通过实验得出当N一5、M一20时可以取得较好的效果,对鉴别和管理非适应流的部分程序作改动如下:

队列管理算法及优化策略

 

此外原FRED算法计算活跃流在队列中的平均包数量avgcq的值时,采用了平均队长avg除以活跃流数量nactive的方法,由于平均队长avg计算采用了指数加权滑动平均,存在一定滞后,使得avgcq和实际值有所偏离,并不利于FRED算法为平衡带宽进行选择性丢包或鉴别非适应流.因此把avgcq的计算改为用实际队列长度除以nactive的方法.

 

 

Stabilized RED(SRED)

SRED的设计目的是保持FIFO 队列长度的稳定而与活跃流(active flow)数量无关. SRED 的基本思想就是进行比较.当有一个包到达队列时,就从队列中随机选出的一个包进行比较,若这两个包属于同一个流,则称为“击中”(hit). SRED 设计了一种数据结构,称为“僵尸”列表(Zombie List),相当于一种流Cache,其中记录了最近流经该队列的M 个流. 每个“僵尸”包含了两个状态信息,其中count 表示被击中的次数;时间戳则记录了该“僵尸”产生的时间或最近一次被“击中”的时间(count 大于0).起初列表为空,当有一个包到达时,则将该包的流标识(源、目的地址等)加入列表,这样,就产生了一个新的“僵尸”.一旦“僵尸”列表满了,那么就将新来的数据包和“僵尸”列表中随机选出的“僵尸”进行比较:(1)如果击中,则此僵尸的count 加1,时间戳改为当前的时间;(2)如果未击中,则以某个概率用新数据包的流标识覆盖选出来的僵尸.

SRED用一个函数 Hit(t)来记录第t个包是否击中,如果击中,则 Hit(t)取值为 1,否则为 0。然后计算第t 个数据包到达时击中的概率P(t):

队列管理算法及优化策略

其中, α 是一个常数.1/ P(t)可以被认为是在第t个包到达前很短时间内对活跃流数量的估计。计算数据包的丢弃概率依赖于队列的占用情况和活跃流的估计值。

队列管理算法及优化策略

其中,B 是队列大小,q是当前队列长度. Pzap为丢包概率。

 

总结:

就改进的角度来说,ARED 从调整配置参数的角度,SRED 和BLUE 从获得低时延抖动和低丢包率的角度,FRED从获得高公平性的角度分别改进了RED 算法。

就方法来说,ARED 仍采用RED 丢包概率(pb)计算方法,但是它根据平均队列长度的变化自动调整pb,使算法在各种负载环境下均获得较高的吞吐量和较低的丢包率,减轻了RED 参数配置带来的网络性能不稳定问题;SRED 算法采用不同于RED 的丢包概率计算方式,根据当前连接数目、当前队列长度和连接带宽占用三个因素来计算数据包丢弃概率,显著增强了平均队列长度avg 的稳定性,解决了RED 算法存在的时延抖动题;BLUE 算法也采用不同于RED 的丢包概率计算方式,它基于包丢失概率和当前链路利用率来计算包丢弃概率,使用较小的缓冲区完成了拥塞控制,同时获得了较高的吞吐量和较低的网络时延;FRED 算法改进了RED带来的公平性问题,它通过记录每个连接的信息来区分对待不同数据流,有效地遏制了非适应流大量侵占网络带宽,提高了各连接共享带宽的公平性。

 

 

AQM策略

除了改进的RED 算法,新的AQM策略也不断涌现,诸如BLUE、PI 控制器、REM、GKVQ、 模糊逻辑控制器、SMVS和AVQ 等.BLUE 通过监测链路的空闲状态和分组丢失事件,以增量形式动态调整分组丢弃概率,稳定性虽有所增强,但在某些状态下队列依旧会发生振荡. PI 控制器虽增强了系统的稳定性和适应能力,但却存在不少问题,比如瞬态性能差,过分依赖缓存空间的大小. REM 利用了F. Kelly 提出的网络流量优化理论中“价格” (price) 的概念来探测和控制网络的拥塞状态,为流量控制开辟了一个新的领域. 因为REM算法是梯度寻优的解,虽然能实现AQM 的技术目标,但目前的性能还不甚理想. GKVQ 和AVQ 采用虚拟链路容量小于实际容量的逻辑队列辅助决策分组的丢弃. 只是GKVQ 的链路利用率总小于某个定常值,AVQ 采用了虚拟链路容量的自适应技术. 从本质上讲,虚拟队列策略也是早期分组丢弃技术的一种,因为没有对队长的显式控制,很难在高吞吐量和低时延之间做出合理的平衡。

 

总结上述已有的算法和策略,除GKVQ 和AVQ 引入虚队列概念辅助分组丢弃决策之外,所有的算法在确定是否丢弃分组时,全部沿用了RED 的概率丢弃机制,不同之处主要表现在概率的计算和更新方法上.

队列管理算法及优化策略

 

 

BLUE

BLUE与RED 最大的区别在于前者使用实际队长来反映拥塞状况,并且使用丢包事件和链路空闲事件 进行拥塞控制 ,而RED 则使用平均队长. BLUE维护一个包丢弃概率pmark,当出现缓冲溢出而持续性丢弃数据包时,就增加pmark的值,即增加向源端发送拥塞通知的速度;相反,当出现链路空闲而导致缓存队列为空时,就减小pmark;从而有效地控制拥塞通知的发送速度。为了避免丢包过于激进,BLUE 设置了一个最小时间间隔freeze- time,在该时间间隔内,概率 pmark 只能更改一次. BLUE 另外两个重要参数是  detin、detde,其中,detin决定了当队列溢出时P增加的量, detde  决定了当链路空闲时P 减少的量. 一般来说, detin要比 detde大很多,这主要是因为,通过赋予丢包事件更大的比重,BLUE 能够对流量大量迅速地增加很快作出反应。

具体算法描述如下:

队列管理算法及优化策略

 

last_update 是上次更新pmark的时间,now 是当前时间;freeze_time 是系统参数,给出了两次连续pmark更新的最小时间间隔。参数 detin、detde给出了每次pmark更新的幅度。该算法的最大优点是使用较小的缓冲区就能够完成拥塞控制,并且与RED 算法相比网络性能更好。

 

但是该算法也存在freeze_time、 detin、detde等参数的设置问题。通过实验我们发现,当参数 detin、detde设定以后,对于一定范围内的RTT 和连接数量,BLUE 算法的性能非常良好。然而,当连接的主要RTT出现大的改变或连接的数量突然剧烈变动时,就使得所设参数无效并导致队列在丢包和低使用率状态间波动。

 

设计了增强BLUE 的算法,其主要思想就是依据平均队列长度的变化,来间接地推断连接数量的变化,进而调节参数 detin、detde。当连接的数量增加时,我们增大pmark的调整步长detin、detde; 而当连接的数量减少时,我们减小pmark 的调整步长detin、detde,同时为了保持队列长度尽量接近于缓存空间的一半,我们对pmark进行了调整。当平均队列长度较小时减小pmark,而当平均队列长度较大时,增加pmark。 我们不对原BLUE 算法做任何改动只是对其相关参数进行动态调整。

队列管理算法及优化策略

其中,qave 为平均队列长度qmid= qlim/2.0, part= qlim/10.0, qlim 为队列长度极限值缓存空间的大小,detde、detin 分别为BLUE 算法中的标记率增加和减小的步长,pmark 为当前标记率,alpa、beta 为常数试验中取2.5 和1.5, num 是用来防止过于频繁的pmark 调节引起队列长度

剧烈波动。

其主要思想是根据平均队列长度对BLUE 的标记率参数pmark 步长参数detin detde 进行自适应调节。加强算法可以明显地提高吞吐率。

 

最后总结:

现有基于控制理论的典型算法存在如下的不足之处:

(1)没有充分考虑被控对象模型的不精确性,导致所设计的算法不能达到预期的性能指标,主要表现在以下几个方面:

1)近似模型只考虑了TCP流,而没有考虑UDP等采用其它协议的流。

2)只考虑了TCP协议的拥塞避免阶段,忽略了慢启动和超时阶段。实际上,持续时间比较长的TCP流主要工作在拥塞避免阶段。相反,持续时间比较短的TCP流通常在慢启动阶段就已经完成了数据传输。

3)在模型线性化过程中,假设活跃的TCP连接数目、TCP连接的RTT等参数在较长时间内保持不变。

(2)对被控对象缺乏深入的分析,导致AQM控制器不能很好地保证系统的稳态性能和暂态性能。

 

 

补充:

主动队列管理算法的分类器实现(电子学报  清华大学)

使用队列的变化率来衡量:

队列管理算法及优化策略

 

 

可以继续看的算法:

《主动队列管理算法的分类器实现 》使用队列的变化率来衡量当前网络状况,有一定的适用性和鲁棒性

《一种实时网络的QoS队列管理算法*》多队列算法

《一种基于速率的公平队列管理算法》

《区分服务的一种自适应队列管理算法》 多流之间的公平性

 

资料:http://www.newsmth.net/pc/pccon.php?id=1338&nid=98376&pid=0&tag=0&tid=0 (资料讲述的蛮全)