CBQ(Class Based Queueing)排队规则:
为可进行分类的排队规则,文档说它是最复杂,难理解,但效果却不是很好。好奇心驱使,所以就了解了下。它的难点在于它的shaping,由于它是通过计算传送包请求之间的时间间隔来控制传输速度的,但这种间隔却又很难测量,于是就有了它的不准确性。下面讲下它的shaping 原理吧,没那么难理解。
如何在一个10Mb/s的网卡上限速为1Mb/s呢?
如果传输速度为1Mb/s时,那么网卡90%的时间处于空闲状态。CBQ的shaping就是如何确保网卡的空闲时间为90%。
给定传输包的平均值avpkt,那么在1Mb/s情况下,传输一个包的时间为(calculated idle time)cit=avpkt/1Mb,所以只需要保证发送包的平均时间为cit时,即可将速度限制为1Mb/s。
实际包发送时间可视为两个包传送请求的时间间隔,当前包发送的平均时间使用exponential weighted moving average (EWMA)计算,不要被这个算法吓到,只是一个指数加权平均值算法。公式如下:
Yt为时刻t时,发送一个包时所花的时间(即两个包传送请求的间隔时间)。
St为时刻t的包平均传输时间。
1>a>0
由此可见,当前包发送时间对平均时间影响最大。
在设置1Mb/s时,平均空闲时间:avidle = St - cit
当avidle>0时,说明当前包传输速度小于1Mb/s
当avidle=0时,当前包传输速度等于于1Mb/s
当avidle<0时,当前包传输速度等于于1Mb/s。此时CBQ就要进行响应调节了,减慢包发送速度。
参数:
avpkt包平均大小,Average size of a packet, measured in bytes. Needed for calculating maxidle, which is derived from maxburst, which is specified in packets.
物理网卡带宽,如100Mb/s。
包传输时间与包大小成阶梯关系,而非连续。想想也对,计算机最小单位为1byte,传输800bit和806bit包所用字节数是一样的,网络传输,最小单位就cell。
当长长时间不发包时,avidle会很大,为了避免avidle无限大,导致网络带宽出现超大峰值,所以设定该值。maxburst 加上avpkt / bandwidth 来计算出maxidle,即avidle的最大值
当超速时,每次最小发送包的个数,当个数增加,可以增大链路的空闲时间粒度,方便控制。
为防止由于avidle过小,导致包发送等待时间过长,特此设定minidle,以作avidle最小值。
最小包大小