Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

流量控制系列手册页:tc-cbq

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

CBQ

原文最近更新时间:2001年12月16日
来源http://lartc.org/
到索引  

名字

  CBQ - 基于类别排队(Class Based Queueing)  

摘要

tc qdisc ... dev dev (parent classid | root) [ handle major: ] cbq [ allot bytes] avpkt bytes bandwidth rate [ cell bytes] [ ewmalog ] [ mpu bytes ]

tc class ... dev dev parent major:[minor] [ classid major:minor] cbq allot bytes [ bandwidth rate ] [ rate rate] prio priority [ weight weight] [ minburst packets] [ maxburst packets ] [ ewma log] [ cell bytes] avpkt bytes[ mpu bytes] [ bounded isolated ] [ split handle& defmapdefmap ] [ estimator interval timeconstant]

 

简介

CBQ实现了一个丰富的共享连接的类别层次,既有固定(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽固定是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件发生的频率和下层连接(数据链路层)的带宽。

 

带宽固定算法

当把一条10mbit/s的连接限制为1mbit/s时,这条连接将有90%的时间是空闲的。如果不是,它就会调低带宽以满足90%空闲时间的限制。

在操作过程中,空闲时间还要进行指数平滑移动平均(exponential weighted moving average,EWMA)计算,在这种计算方法中最近经过的数据包权重是前面数据包权重的指数。UNIX系统的平均负载就是使用这种算法计算的。

最后,由EWMA计算的值减去空闲时间,所得结果叫做avgidle。最好的情况是avgidle等于0,也就是数据包是严格地按照计算的时间间隔到达。

而过载连接的avgidle值是负数,如果这个负数太大,CBQ就会调低带宽,这就造成了过度限制(overlimit)的情况。

相反,一个空闲的连接会积累下一个很大的正数avgidle,这样可能造成经过一段空闲后,使带宽失控。为了防止出现这种情况的出现,可以使用maxidle参数限制avgidle的值。

如果处于过度限制(overlimit)的情况,CBQ会限制数据包通过的时间间隔严格按照计算的值。不过,由于时钟解析度的原因,这样可能不太合适。见minburst参数。

 

类别划分

在一个CBQ实例中,可以存在很多分类。每个类有可以包括其它的QDisc,默认情况下,是pfifo。

在为数据包排队时,CBQ作为根,使用不同的方法确定那个类接收数据包。

如果没有一些不常见的配置选项,这个过程非常简单。我们在每个节点上查询一个指令,接着按照指令的指示让数据包进入某个类。如果这个类是一个叶子节点,我们就把数据包排到这里;如果这个类还有子节点,我们就重复以上过程。

我们在每个节点上重复以下操作,直到数据包被发送到其它节点,或者这个过程由于其它原因中止。

  • 查询附属于类上的过滤器,如果过滤器把数据包发到某个叶子节点,处理完毕;否则,开始下一个查询。
  • defmap中查询这个数据包的优先级,优先级倚赖于TCP头的TOS域。检查这个类是否还继续分类,如果是重新开始下一个查询。
  • defmap要求获得best effort优先级的指令,检查应答是否还存在分类,如果不是则重新开始下一个查询。
  • 如果上述操作都没有返回一个指令,就在这个节点把数据包排队

这个算法可以保证数据包最终会有归宿,即使你正在建立流量控制的配置。

 

连接共享算法

在向网络设备发送数据包时,CBQ首先要决定发出哪个类的数据包。它对所有的类采用加权轮转(Weighted Round Robin)的方式处理,使每个类的数据包都有机会被送出。WRR处理首先从优先级最高(数字最小的优先级)的类开始处理,直到处理完类中所有的数据包,再接着处理优先级次之的类。

每个类可以从其兄弟类借带宽。一个类可以使用bounded声明其带宽不可外借;也可以使用isolated声明不原意外借带宽。  

QDISC

一个CBQ QDisc类的根有如下参数:

parent major:minor | root
这个命令的参数决定这个CBQ实例所在的位置,或者是在一个网络接口的根(root),或者位于一个现有的类里面。
handle major:
和其它的QDisc一样,CBQ QDisc也可以指定一个句柄。句柄只能包含主识别号(major number)和一个冒号。数字的选择是随意的,不过如果在这个QDisc里面会继续分类,这个数字非常有用。
allot bytes
这个参数用于分配的带宽,决定数据包传输的时间表。QDisc的allot参数和类的allot参数略有不同。数字bytes是任意的。缺省是一个根据avpkt得到的数字。
avpkt bytes
数据包的平均大小,它用于计算最大空闲时间(maxidle),也用于确认allot参数的值是安全的 。
bandwidth rate
为了决定空闲时间(idle time),CBQ必须知道底层物理接口的带宽,或者父QDisc的带宽。这是一个极为重要的参数,下面会继续讨论。
cell time
time的值决定进行数据包传输时间计算的时间间隔。使用缺省值是比较明智的。
mpu bytes
一个大小为0的数据包仍然会消耗时间来传输。用这个参数设置小于bytes个字节的数据包在进行传输时间的计算忽略不计。缺省值是0。
ewma log
在CBQ需要测量平均空闲时间时,它会使用加权指数移动平均算法来平滑测量的值,得到一个移动平均值。log决定平滑因子的大小。这个数值介于0到31之间,数值越小敏感度越大。默认值是5。

一个CBQ QDisc只需要知道底层连接的大小。实际的带宽限制由其子类完成。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:流量控制系列手册页:tc   下一篇:ea/acl访问控制系统介绍

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号