加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

linux系统下的TC控制参数解析

(2010-08-02 12:14:55)
标签:

tc参数

参数介绍

tc流量控制

sfq

随机公平队列

杂谈

分类: LinuxTC流量管理
翻阅了很多TC流量管理的文章,发现讲解案例的文章很多,但是针对TC参数的讲解就寥寥无几,甚至连TC的Howto文件也未能详细的介绍参数的使用区别。结果使初步接触者看的头晕脑胀,不知道那些参数究竟要用在哪些位置。结果实际操作起来还是糊里糊涂。当然,本人当初也经历这个过程。
下面我将通过一个案例来尽可能详细的讲解一下linux TC命令的参数应用,希望能对大家有所帮助。

TC介绍

  在linux中,TC有二种控制方法CBQ和HTB。而HTB是设计用来替换CBQ的。它是一个层次式的过滤框架。设置起来比较直观简单。

  TC包括三个基本的构成块: 队列规定qdisc(queueing discipline )、类(class)和分类器(Classifiers)

队列(queueing discipline):

用来实现控制网络的收发速度。通过队列,linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(如 TCP)的前提下来平滑网络流量。需要注意的是,linux对接收队列的控制不够好,所以我们一般只用发送队列,即“控发不控收”。它封装了其他两个主要TC组件(类和分类器)。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。

  最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。

  队列规则包括:FIFO(先进先出),RED(随机早期探测),SFQ(随机公平队列)和令牌桶(Token Bucket),类基基础队列(CBQ),CBQ 是一种超级队列,这好比一棵树,CBQ是树干,而且可以嫁接其他新的树枝或树干,当然也可以直接生长出树叶(最终的规则)来。而FIFO只能充当树叶的较色,在它下面不能再添加分类了。

  class用来表示控制策略。很显然,很多时候,我们很可能要对不同的IP实行不同的流量控制策略,这时候我们就得用不同的class来表示不同的控制策略了。

  filter用来将用户划入到具体的控制策略中(即不同的class中)。比如,现在,我们想对192.168.1.33,192.168.1.34两个IP实行不同的控制策略(A,B),这时,我们可用filter将33划入到控制策略A,将44划入到控制策略B,filter划分的标志位可用u32打标功能或IPtables的 set-mark功能来实现。(大多使用iptables来做标记,因为比较有效,这在以后你会慢慢体会到,呵呵)

  目前,TC可以使用的过滤器有:fwmark分类器,u32分类器,基于路由的分类器和RSVP分类器(分别用于IPV6、IPV4)等;其中,fwmark分类器允许我们使用 Linux netfilter 代码选择流量,而u32分类器允许我们选择基于 ANY 头的流量 .需要注意的是,filter(过滤器)是在QDisc内部,它们不能作为主体。

  数据包->iptables(在通过iptables时,iptables根据不同的ip来设置不同的mark)->TC root qdisc->

TC(class)->TC(queue)

应用

假设eth0位是服务器的外网网络接口。

首先在eth0的qdiscA,qdiscA控制通过本机到外网的速度,因此是用来控制服务器流出速度的

#tc qdisc add dev eth1 root handle 1:htb default 1

tc 队列 添加 设置接口 root为最上层 句柄(做标记用): 标记类型 默认使用1的class

解释如下:无论是队列,还是class和filter都有ID之类的标志符,一般都有parent(父,上层的),注意ID具有接口本地性,不同的网络接口可以有相同的ID.对于这里因为qdisc在顶部,所以parent无,用‘root’字样来标识,ID用1:来标志

default 1表示当某个ip流不满足任何已设定的filter规则时,将自动归入class 1中。

然后在qdisc下建立两个class,来指定eth0控制通过本机到外网的速度

#tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2

(注:以上就是我们控制输出的规则:为eth0 下的root队列1:0 添加分类并命名为 1:30 类型为htb 速度为2M,最大可以到4M, 优先级为2)

rate: 是一个类保证得到的带宽值。如果有不只一个类,请保证所有子类总和是小于或等于父类。

prio:用来指示借用带宽时的竞争力,prio越小,优先级越高,竞争力越强。

ceil: ceil是一个类最大能得到的带宽值。

 

接着针对不同的应用在各root class下设置不同的类,如下。

#tc class add dev eth0 parent 1:30 classid 1:31 htb rate 0.5mbit ceil 2mbit prio 3

(在1:30分类下面 创建更细的分类1:31 类型为htb 规定速度0.5mbit  最高2mbit 优先级为3)

为了不使一个大的数据包传递过程(会话)永占带宽,在1:31下面添加 随即公平队列sfq.用于均衡排队的所有数据

#tc qdisc add dev eth0 parent 1:31 handle 31:sfq perturb 10

(以上是在子分类1:30下面继续添加名称为31:的队列。模式为sfq,这是一个循环均衡排队数据包的队列,它不偏向任何数据队列,循环抓取各个队列的数据包。这个循环的时间间隔是10秒钟一次,我们可以任意调节这个时间参数,比如2、4、5、6、8秒......只要不过与频繁与迟钝就好)

接着添加过滤器

#tc filter add dev eth0 parent 1:protocol ip prio 31 handle 31 fw flowid 1:31

添加“过滤分类规则”到root qdisc处(也就是1:0),协议类型为ip 优先级为31。给这个队列起名31 采用的是fw(防火墙筛选)规则,一旦符合筛选,则进入1:31分类。(还记得1:31分类么?就是刚刚在上面添加的,限速0.5M的那个)

用iptable打标,也可以使用u32之类

#iptables -t mangle -I FORWARD -i !eth1 -p tcp –sport 80 -s 192.168.1.33 –j MARK –set-mark 31

(使用iptables命令,对于传递过程中不是来自eth1的ip 且来源地址为192.168.1.33 来源ip为80 的数据全部做上31标记。用以实现此数据经过以上过滤器时被分配到1:31这个0.5m的限速中)

TC对最对高速度的控制

 

ceil 限速

指定了一个类可以用的最大带宽, 用来限制类可以借用多少带宽。缺省的ceil是和速率一样

  这个特性对于ISP是很有用的, 因为他们一般限制被服务的用户的总量即使其他用户没有请求服务。(ISPS 很想用户付更多的钱得到更好的服务) ,注根类是不允许被借用的, 所以没有指定ceil。 ceil的数值应该至少和它所在的类的速率一样高, 也就是说ceil应该至少和它的任何一个子类一样高

Burst 突发

  网络硬件只能在一个时间发送一个包这仅仅取决于一个硬件的速率。链路共享软件可以利用这个能力动态产生多个连接运行在不同的速度。所以速率和ceil不是一个即时度量只是一个在一个时间里发送包的平均值。实际的情况是怎样使一个流量很小的类在某个时间类以最大的速率提供给其他类。 burst 和cburst 参数控制多少数据可以以硬件最大的速度不费力的发送给需要的其他类。

  如果cburst 小于一个理论上的数据包1514b,他形成的突发不会超过ceil 速率, 同样的方法TBF的最高速率也是这样。

  你可能会问, 为什么需要burst . 因为它可以很容易的提高响应速度在一个很拥挤的链路上。 比如WWW 流量是突发的。你访问主页。 突发的获得并阅读。 在空闲的时间burst将再"charge"一次。

  注: burst 和cburst至少要和其子类的值一样大。

TC命令格式:

  加入

  tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]

  tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]

  tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific parameters ] flowid flow-id

  显示

  tc [-s | -d ] qdisc show [ dev DEV ]

  tc [-s | -d ] class show dev DEV tc filter show dev DEV

  查看TC的状态

  tc -s -d qdisc ls dev eth0

  tc -s -d class ls dev eth0

  删除tc规则

  tc qdisc del dev eth0 root(此命令将tc全部清零,即还原到未设tc状态)

实例

  下载

  下载限制单个IP

  tc qdisc add dev eth0 root handle 1: htb r2q 1  (r2q,是指没有default的root,使整个网络的带宽没有限制)

  tc class add dev eth0 parent 1: classid 1:1 htb rate 30mbit ceil 60mbit

  tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.2 flowid 1:1

  就可以限制192.168.1.2的下载速度为30Mbit最高可以60Mbit

限制整段IP

  tc qdisc add dev eth0 root handle 1: htb r2q 1

  tc class add dev eth0 parent 1: classid 1:1 htb rate 50mbit ceil 1000mbit

  tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.0/24 flowid 1:1

  就可以限制192.168.111.0 到255 的带宽为3000k了,实际下载速度为200k左右。

  这种情况下,这个网段所有机器共享这200k的带宽。

  还可以加入一个sfq(随机公平队列)

  tc qdisc add dev eth0 root handle 1: htb r2q 1

  tc class add dev eth0 parent 1: classid 1:1 htb rate 3000kbit burst 10k

  tc qdisc add dev eth0 parent 1:1 handle 10: sfq perturb 10

  tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.168 flowid 1:1

  sfq,他可以防止一个段内的一个ip占用整个带宽。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有