目前公司有服务器,网络环境要求太高。当那个服务器连接到源服务器下载时,运行到400M-500M m,为了控制它,我们研究了TC来控制流量。保持小规模,不要让这个占满整个网络。TC很厉害,很多所谓的硬件路由器都是基于这个做的。
首先,在Linux下使用TC控制服务器流量的方法
1)假设eth0位是服务器的外网接口。第一,eth0的qdiscA控制本地电脑到外网的速度,所以可以用来控制服务器的外部数据传输速度。
#tc qdisc add dev eth1根句柄1:htb默认值1
设置接口的顶级句柄(用于标记)。默认情况下,标签使用1的类。
解释如下:队列、类和过滤器都有ID等标识符,一般都有parent(父级,上层)。注意ID有接口局部性,不同的网络接口可以有相同的ID。对于这里,因为qdisc在顶部,所以没有父级,用‘根’字标识,ID用1来标记:
“默认91”意味着当ip流不符合任何设置的过滤规则时,它将被自动分类到类别1。更详细的指令规则请参考手册。
2)然后,在qdisc下建立两个类来指定eth0来控制本地计算机到外部网络的速度。
# TC class add dev eth 0 parent 1:0 classid 1:30 htb rate 2mb ceil 4m bit prio 2
注意:以上是我们控制输出服务器的速度,是2M,最大可达4M。
Rate:是一个类保证的带宽值。如果有多个类别,请确保所有子类的总和小于或等于父类别。
o:用于表示借用带宽时的竞争力。prio越小,优先级越高,竞争力越强。
Ceil: ceil是一个类的最大可用带宽值。
3)然后,针对不同的应用,在每个根类下设置不同的类。例子如下。(如果只有一个类,这是不必要的)
# TC class add dev eth 0 parent 1:30 classid 1:31 htb rate 0.5兆位ceil 2mbit prio 3
同时,为了不让一个会话永远占用带宽,随机公平队列sfq。(多IP)添加到节点(即本文中的应用节点)。
# TC q disc add dev eth 0 parent 1:31 handle 31:sfq扰动10
4)然后添加一个过滤器。
# TC filter add dev eth 0 parent 1:protocol IPP Rio 31 handle 31 fw flowid 1:31
5)用iptable,u32之类的做标记也可以。
#iptables -t mangle -I FORWARD -i!et h1-p TCPsport 80-s XXX . XXX . XXX . XXXj MARKset-MARK 31
二。TC对最高速度|速率上限速率限制的控制
参数ceil指定了一个类可以使用的最大带宽,用来限制一个类可以借用多少带宽。默认上限与费率相同。这项功能对ISP非常有用,因为即使其他用户没有请求服务,他们通常也会限制服务的用户总数。(ISP确实希望用户支付更多的费用来获得更好的服务)。注意,不允许借用根类,所以没有指定ceil。
(注意:ceil的值应该至少和它的类的速度一样高,也就是说ceil应该至少和它的任何子类一样高。)
突发脉冲
网络一次只能发送一个包,这只取决于硬件的速度。Link软件可以利用这种能力动态生成以不同速度运行的多个连接。因此,速率和上限不是一个即时的度量,而是一段时间内发送的数据包的平均值。实际情况是如何让一个流量小的班级在某个时间以最大速率提供给其他班级。Burst和cburst参数控制以硬件的最大速度可以毫不费力地将多少数据发送到其他所需的类。
如果cburst小于理论数据包,则由cburst形成的突发不会超过最高速率,同样,TBF的最高速率也不会超过最高速率。
你可能会问,为什么需要连发?因为它可以在非常拥挤的链路上轻松提高响应速度。比如WWW流量突发。你访问主页。突然获得和阅读。在空闲时间,burst会再次“充电”。
(注意:burst和cburst应该至少和其子类的值一样大。)
三。TC命令格式:
加入
TC q disc[add | change | replace | link]DEV DEV[parent q disc-id | root][handle q disc-id]q disc[q disc特定参数]
TC class[add | change | replace]DEV DEV parent qdisc-id[classid class-id]qdisc[qdisc特定参数]
TC filter[add | change | replace]DEV DEV[parent qdisc-id | root]protocol protocol prio priority filter type[filter type specific parameters]flowid flow-id
显示
tc [-s | -d ] qdisc show [ dev DEV ]
tc [-s | -d ]类显示开发开发tc过滤器显示开发开发
检查TC的状态
tc -s -d光盘显示开发eth0
tc -s -d级显示开发eth0
删除tc规则
tc qdisc del dev eth0根
例子
一.下载
下载单个IP
tc qdisc添加开发eth0根句柄1: htb r2q 1
tc类add dev eth 0 parent 1:classid 1:1 htb rate 30m bit ceil 60m bit
tc过滤器添加开发eth0父1:协议ip优先级16 u32匹配ip dst 192.168.1.2流id 1:1
可以将192.168.1.2的下载速度限制在30Mbit,最高60Mbit。
R2q指root无默认,使得全网带宽无限。
下载整个IP
tc qdisc添加开发eth0根句柄1: htb r2q 1
tc类add dev eth 0 parent 1:classid 1:1 htb rate 50m bit ceil 1000 mbit
tc过滤器添加开发eth0父1:协议ip优先级16 u32匹配ip dst 192.168.111.0/24流id 1:1
可以把192.168.111.0的带宽限制在255到3000k,实际下载速度在200k左右。
在这种情况下,该网段中的所有机器共享这200k带宽。
你也可以加入一个sfq(随机公平队列)
tc qdisc添加开发eth0根句柄1: htb r2q 1
tc类添加开发eth0父1: classid 1:1 htb速率3000kbit突发10k
TC qdisc add dev eth 0 parent 1:1 handle 10:sfq扰动10
tc filter add dev eth0 parent 1:协议ip prio 16 u32匹配ip dst 192.168.111.168 flowid 1:1
Sfq,可以防止一个网段中的一个ip占用整个带宽。
TC简介
在Linux中,TC有两种控制方法CBQ和HTB。HTB旨在取代CBQ。这是一个分层过滤框架。TC由三个基本构件组成:qdisc(排队规则)、类和分类器。
排队规则:用于控制网络的发送和接收速度。通过队列,Linux可以缓存网络数据包,然后根据用户的设置,在尽可能不中断连接(比如TCP)的情况下平滑网络流量。需要注意的是,linux对接收队列的控制不够好,所以我们一般只用发送队列,也就是“控制发送不接收”。它封装了其他两个主要的TC组件(类和分类器)。如果内核需要通过网络接口发送数据包,它需要根据为该接口配置的qdisc(排队规则)对数据包进行排队。然后,内核会从qdisc中取出尽可能多的数据包,交给网卡驱动模块。
最简单的QDisc是pfifo,它对传入的数据包不做任何处理,数据包以先入先出的方式通过队列。但是,它会保存网络接口暂时无法处理的数据包。
队列规则包括FIFO(先进先出)、RED(随机早期检测)、SFQ(随机公平队列)和令牌桶,以及基于类别的队列(CBQ)。CBQ是一个超级队列,也就是说,它可以包含其他队列(甚至其他cbq)。
类用于指示控制策略。很明显,很多情况下,我们很可能会对不同的IP实施不同的流量控制策略,然后不得不用不同的类来表示不同的控制策略。
过滤器用于将用户分类到特定的控制策略中(即不同的类别)。比如现在,我们想对xxa和xxb IP实现不同的控制策略(A,B)。这时我们可以使用filter将xxa划分为控制策略A,将xxb划分为控制策略b,filter划分的标志位可以通过iptables的u32标记函数或者set-mark函数来实现(大部分用IPtables标记)。
目前TC可以使用的过滤器有fwmark分类器、u32分类器、基于路由的分类器、RSVP分类器(分别针对IPV6和IPV4)。其中,fwmark分类器允许我们使用Linux netfilter代码来选择流量,而u32分类器允许我们基于任何报头来选择流量。需要注意的是,filter在QDisc里面,不能作为主语。
Packet -iptables (iptables在传递iptables时根据不同的ip设置不同的标志)-TC(类)-TC(队列)。