队列缓存对时延和抖动的影响
队列缓存
NE20E转发平面的流量管理器TM(Traffic Manager)上有一些高速缓存,用于报文的缓冲和转发,缓存由所有端口共享,各端口竞争使用。为了避免有的端口长时间抢不到缓存而出现断流,NE20E给每个端口分配了一块最小可用缓存,并且分配到端口的各个队列上,保证每个队列均有缓存可用。
队列缓存对时延的影响
当TM收到报文时,将报文放入缓存,网络不拥塞时,报文能被及时转发,不会在缓存中产生堆积。这种情况下报文在缓存中的时间为μs级,延迟时间可以忽略不计。
当网络拥塞时,报文在缓存中产生堆积,被延迟处理,延迟时间会大幅增加。从报文进入缓存到报文被调度出去的时间间隔称为缓存时延(也称为队列时延)。
缓存时延的大小主要取决于队列的缓存长度以及该队列获得的输出带宽,可以使用如下公式计算缓存时延的最大值:
缓存时延最大值 = 队列缓存长度÷队列输出带宽
队列缓存长度单位是Byte;队列输出带宽即队列整形速率,单位是bit/s,因此上述公式可表达为:
缓存时延最大值 = 队列缓存长度×8÷队列整形速率
从上述公式可以看出,缓存越大,缓存时延越大。
队列缓存对抖动的影响
抖动,也叫做延时的变化,是指同一业务流中不同分组所呈现的时延不同。数据包离开发送端时,是按照一定的间隔均匀发送,然而在通过网络时,这一均匀的间隔因数据包经历不同的延迟而遭到破坏,从而产生抖动。抖动会对语音、视频流等实时业务造成影响,分组到达时间的差异将在话音或视像中造成断续。为了解决抖动问题,通常语音/视频的接收终端会有去抖动缓存机制,但如果网络抖动过于严重,超出了接收终端的容忍度,依然会导致语音或视像的失真和断续。
网络抖动严重的原因主要是IP网络路由状态频繁变化,使得各数据包分别经由不同物理路由到达;或者网络节点流量拥塞,数据包在各节点缓存时间过长,使得数据包到达接收端的时间差较大。其中,后者是较为常见的原因。
根据抖动的定义可知:抖动=时延差。时延差越大,则抖动越大。那么,如果把时延都控制的很小,那时延差也就得到控制。即,通过控制时延,可间接控制抖动。例如,把时延控制在5µs之内,那么时延差也就控制在5µs,即抖动也控制在5µs之内。
在队列缓存对时延的影响中介绍过,缓存越大,缓存时延越大。那么,适当控制缓存长度,可控制时延,从而控制抖动。
队列缓存的设置
NE20E允许在配置WRED时修改队列缓存长度。
队列不能设置过短。如果某队列过短,缓存空间过小,流量即使速率不大也容纳不下,容易造成丢包,从而给使用TCP协议传输的业务带来抖动。
队列也不能设置过长。如果队列太长,时延过大。尤其对于TCP应用,通信两端会预测网络拥塞情况,在发送完一个报文后,启动超时定期器等待对方应答,如果在定时器超时前没有等到应答,发送方会重发报文。如果报文在网络中被缓存的时间过长,不丢弃与丢弃没有区别。
“队列缓存对时延的影响”中介绍过:
缓存时延最大值 = 队列缓存长度×8÷队列整形速率
此公式可推断出:
队列缓存长度(Byte) =队列整形速率(bit/s)×业务能容忍的最大时延(s)÷8
低优先级业务的时延通常要求≤100ms,高优先级业务的时延要求≤10ms。结合上述公式,推荐高优先级队列(CS7、CS6、EF)的长度设置为10ms×队列整形速率;低优先级队列的长度设置为100ms×队列整形速率。