不少中小企业服务器接入带宽往往只有10Mbps 通常服务器也运行了其它服务,比如DNS服务,当网站访问量较大并且有多人同时下载时,带宽很容易耗尽,导致服务器延迟增加或丢包。如何对80端口进行速度限制,而保障其它服务能正常运行?
你可以使用tc 命令,对服务器上指定的端口和服务器进行调整限制。
令牌桶 (TB)
令牌桶是一个常见的算法,用于控制进入到网络的数据量,允许将发送数据突发。它是用于网络流量控制或速率限制。随着令牌桶中,您可以定义一个接口上允许的最大速率在给定时间的交通。
tokens/sec
| |
|| Bucket to
|| to hold b tokens
+======+=====+
|
|
| \|/
Packets | +============+
stream | ---> | token wait | ---> Remove token ---> eth0
| +============+
The TB filter puts tokens into the bucket at a certain rate.
Each token is permission for the source to send a specific number of bits into the network.
Bucket can hold b tokens as per shaping rules.
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命令行工具。