Linux 上的TC 流量控制几个例子(80端口流量限制)

转载 2013年12月04日 17:25:04

http://www.cyberciti.biz/faq/linux-traffic-shaping-using-tc-to-control-http-traffic/

不少中小企业服务器接入带宽往往只有10Mbps 通常服务器也运行了其它服务,比如DNS服务,当网站访问量较大并且有多人同时下载时,带宽很容易耗尽,导致服务器延迟增加或丢包。如何对80端口进行速度限制,而保障其它服务能正常运行?

你可以使用tc 命令,对服务器上指定的端口和服务器进行调整限制。

令牌桶 (TB)

令牌桶是一个常见的算法,用于控制进入到网络的数据量,允许将发送数据突发。它是用于网络流量控制或速率限制。随着令牌桶中,您可以定义一个接口上允许的最大速率在给定时间的交通。

                                      tokens/sec
                                   | 		|
                                   |		| Bucket to
                                   |		| to hold b tokens
  	                      	   +======+=====+
                                          |
                                          |
        |                                \|/
Packets |      +============+
stream  | ---> | token wait | --->  Remove token  --->  eth0
        |      +============+
  1. The TB filter puts tokens into the bucket at a certain rate.
  2. Each token is permission for the source to send a specific number of bits into the network.
  3. Bucket can hold b tokens as per shaping rules.
  4. Kernel can send packet if you’ve a token else traffic need to wait.

我如何使用TC命令?

警告!这些例子,需要很好地理解TCP/ IP和其它网络概念。所有新的用户,应尽量在测试环境中的例子。
TC命令是默认安装在我的Linux发行版。要列出现有规则,请输入:

# tc -s qdisc ls dev eth0
样本输出:

qdisc pfifo_fast 0: root bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 2732108 bytes 10732 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0

你首先流量整形规则
首先,发送ping请求cyberciti.biz你本地的Linux工作站,并注意下ping的时间,输入:

# ping cyberciti.biz
样本输出:

PING cyberciti.biz (74.86.48.99) 56(84) bytes of data.
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=1 ttl=47 time=304 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=2 ttl=47 time=304 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=3 ttl=47 time=304 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=4 ttl=47 time=304 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=5 ttl=47 time=304 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=6 ttl=47 time=304 ms

键入下面的TC命令减慢200毫秒

# tc qdisc add dev eth0 root netem delay 200ms
现在,再次运行ping 请求
# ping cyberciti.biz
输出样本:

PING cyberciti.biz (74.86.48.99) 56(84) bytes of data.
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=1 ttl=47 time=505 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=2 ttl=47 time=505 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=3 ttl=47 time=505 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=4 ttl=47 time=505 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=5 ttl=47 time=505 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=6 ttl=47 time=505 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=7 ttl=47 time=505 ms
64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=8 ttl=47 time=505 ms
^C
--- cyberciti.biz ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7006ms
rtt min/avg/max/mdev = 504.464/505.303/506.308/0.949 ms

要列出当前规则,请输入
# tc -s qdisc ls dev eth0
输出样本:

qdisc netem 8001: root limit 1000 delay 200.0ms
 Sent 175545 bytes 540 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0

想删除全部规则,请输入
# tc qdisc del dev eth0 root
# tc -s qdisc ls dev eth0

TBF的范例

要附加一个持续的最大速率1Mbit / s的,peakrate2.0mbit/ S,10kilobyte缓冲区一个TBF的计算,使TBF的原因最多70ms的延迟,与完美的peakrate行为,与前斗队列大小限制,,输入:

 

# tc qdisc add dev eth0 root tbf rate 1mbit burst 10kb latency 70ms peakrate 2mbit minburst 1540

HTB – 层次令牌桶

要控制在一个给定的链接使用HTB的出口带宽的使用:
1.rate – 您可以设置允许的带宽。
2.ceil – 您可以设置的突发带宽时,允许桶。
3.prio – 您可以设置额外的带宽优先级。 prios较低的类所提供的带宽。例如,您可以给DNS流量和HTTP下载PRIO较低。
4.iptables和TC:你需要使用iptables和TC如下:控制出站HTTP流量。

示例: HTTP 出站流量整形

首先,删除eth1 网卡上已存在的规则:
# /sbin/tc qdisc del dev eth1 root
打开队列规则,输入:
# /sbin/tc qdisc add dev eth1 root handle 1:0 htb default 10
定义类的限制,即允许的带宽为512千字节到640千字节的端口80和突发带宽:

# /sbin/tc class add dev eth1 parent 1:0 classid 1:10 htb rate 512kbps ceil 640kbps prio 0
请注意,端口80是不是在上面的类中定义的任何地方。您将使用iptables裂伤规则如下:

# /sbin/iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 10
要保存iptables 规则,请输入下列命令,(RHEL 为例):
# /sbin/service iptables save
最后,将其分配给 qdisc:
# tc filter add dev eth1 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
下面是端口80和22的另一个例子:

/sbin/tc qdisc add dev eth0 root handle 1: htb
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbps
/sbin/tc class add dev eth0 parent 1:1 classid 1:5 htb rate 512kbps ceil 640kbps prio 1
/sbin/tc class add dev eth0 parent 1:1 classid 1:6 htb rate 100kbps ceil 160kbps prio 0
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 5 fw flowid 1:5
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 6 fw flowid 1:6
/sbin/iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 5
/sbin/iptables -A OUTPUT -t mangle -p tcp --sport 22 -j MARK --set-mark 6

我如何监控和测试速度呢?

使用一下工具

# /sbin/tc -s -d class show dev eth0
# /sbin/iptables -t mangle -n -v -L
# iptraf
# watch /sbin/tc -s -d class show dev eth0

要测试下载速度使用LFTP或者wget命令行工具。

CentOS-TC(流量控制)-单IP上传(下载)限制

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ready.blog.51cto.com/507803/965408 初次接...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年01月22日 10:34
  • 2360

Linux上的TC流量控制几个例子(80端口流量限制)

警告!这些例子,需要很好地理解TCP/ IP和其它网络概念。所有新的用户,应尽量在测试环境中的例子。 TC命令是默认安装在我的Linux发行版。 要列出现有规则,请输入:# tc ...
  • eydwyz
  • eydwyz
  • 2016年11月26日 16:38
  • 416

如何配置iptables与tc限制带宽和流量

##启用netfilter中的forward链的转发功能     # Enabling IP Forwarding......     echo "Enabling IP Forwarding.....
  • eydwyz
  • eydwyz
  • 2016年11月26日 17:08
  • 1399

tc命令——Linux基于IP进行流量限速

主要参考(所有权利归原文作者所有):       *http://www.cnblogs.com/endsock/archive/2011/12/09/2281519.html      ...
  • zhongbeida_xue
  • zhongbeida_xue
  • 2017年01月19日 11:06
  • 4254

流量控制工具TC详细说明

原理介绍 Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量...
  • wuzhimang
  • wuzhimang
  • 2017年01月17日 10:49
  • 1053

linux下使用tc做流量限速

公司一台服务器,网络环境太高,那台服务器和源服务器连接下载,就跑到400M-500M,为了控制一下,所以研究了一下tc.来做流量控制.给他控制到小点,不要让这一台占了所有的网络.tc 是非常非常强大的...
  • daniel117
  • daniel117
  • 2013年12月16日 12:15
  • 6368

嵌入式 Linux流量监控工具- iftop (最全面的iftop教程)以及TC命令内核流量控制

在类Unix系统中可以使用top查看系统资源、进程、内存占用等信息。查看网络状态可以使用netstat、nmap等工具。若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop。 一、i...
  • skdkjxy
  • skdkjxy
  • 2014年05月27日 11:09
  • 1535

tc - 输入方向的流量控制

tc - 输入方向的流量控制
  • ztguang
  • ztguang
  • 2017年07月12日 16:54
  • 351

TC(Linux下流量控制工具)详细说明及应用

TC的安装 TC是Linux自带的模块,一般情况下不需要另行安装,可以用 man tc 查看tc 相关命令细节,tc 要求内核 2.4.18 以上 ##注意:64位机器上,先执行下面命令 ...
  • u011641885
  • u011641885
  • 2015年05月11日 09:09
  • 3703

TC HTB流量控制

一.背景简介 最近几个月在参与一个软路由器的开发.该路由器的流量控制功能由TCHTB实现。下面写点总结性的文字,因水平有限,不对之处敬请各位及时指出。    TC为TrafficControl的缩...
  • ruiyiin
  • ruiyiin
  • 2014年05月07日 00:35
  • 2135
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 上的TC 流量控制几个例子(80端口流量限制)
举报原因:
原因补充:

(最多只允许输入30个字)