歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

linux下對單服務器的一些流量整形

不少中小企業服務器接入帶寬往往只有10Mbps 通常服務器也運行了其它服務,比如FTP服務、web服務,當網站訪問量較大並且有多人同時下載時,帶寬很容易耗盡,導致服務器延遲增加或丟包。如何對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命令行工具。

Copyright © Linux教程網 All Rights Reserved