CBQ

CBQ,CBQ是Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富的连接共享
类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽限制是通过
计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接(数据
链路层)的带宽。

CBQ的工作机制是确认链路的闲置时间足够长,以达到降低链路实际带宽的目的.为此,它
要计算两个数据包的平均发送间隔.操作期间,有效闲置时间的测量,使用EWMA
(exponential weighted moving average,指数加权移动均值)算法,也就是说最近处理
的数据包的权值比以前的数据包按指数增加.UNIX的平均负载也是这样算出来的. 计算
出来的平均时间值减去EWMA测量值,得出的结果叫做"avgidle".最佳的链路负载情况
下,这个值应当是0:数据包严格按照计算出来的时间间隔到来. 在一个过载的链路上,
avgidle值应当是负的.如果这个负值太严重,CBQ就会暂时禁止发包,称为"overlimit"
(越限). 相反地,一个闲置的链路应该有很大avgidle值,这样闲置几个小时后,会造成链路
允许非常大的带宽通过.为了避免这种局面,我们用maxidle来限avgidle的值不能太大.
理论上讲,如果发生越限,CBQ就会禁止发包一段时间(长度就是事先计算出来的传输数据
包之间的时间间隔),然后通过一个数据包后再次禁止发包.
配置范例:WEB服务器的流量控制为5Mbps,SMTP流量控制在3Mbps上.而且二者一共
不得超过6Mbps,互相之间允许借用带宽
#tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8
#tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 6Mbit weight
0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
这部分按惯例设置了根为1:0,并且绑定了类1:1.也就是说整个带宽不能超过6Mbps.
#tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 5Mbit weight
0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000
#tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 3Mbit weight
0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000
建立了2个类.注意我们如何根据带宽来调整weight参数的.两个类都没有配置成"bounded",
但它们都连接到了类1:1上,而1:1设置了"bounded".所以两个类的总带宽不会超过6Mbps.
别忘了,同一个CBQ下面的子类的主号码都必须与CBQ自己的号码相一致!
#tc qdisc add dev eth0 parent 1:3 handle 30: sfq
#tc qdisc add dev eth0 parent 1:4 handle 40: sfq
缺省情况下,两个类都有一个FIFO队列规定.但是我们把它换成SFQ队列,以保证每个数据
流都公平对待.
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid
1:3
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 25 0xffff flowid
1:4

猜你喜欢

转载自blog.csdn.net/weixin_43664746/article/details/94736602
CBQ