使用linux下的TC進行伺服器流量控制(Linux主機伺服器架設技術)
使用linux下的TC進行伺服器流量控制(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)。
class用來表示控制策略。很顯然,很多時候,我們很可能要對不同的IP實行不同的流量控制策略,這時候我們就得用不同的class來表示不同的控制策略了。
filter用來將使用者劃入到具體的控制策略中(即不同的class中)。比如,現在,我們想對xxa,xxb兩個IP實行不同的控制策略(A,B),這時,我們可用filter將xxa劃入到控制策略A,將xxb劃入到控制策略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(class)->TC(queue)
應用
假設eth0位是伺服器的外網網路介面。
1)首先在eth0的qdiscA,qdiscA控制通過本機到外網的速度,因此是用來控制伺服器流出速度的
#tc qdisc add dev eth1 root handle 1:htb default 1
加入 設定介面 最上層 控制碼(做標示用) 標示 預設使用1的class
解釋如下:無論是佇列,還是class和filter都有ID之類的標誌符,一般都有parent(父,上層的),注意ID具有介面本地性,不同的網路介面可以有相同的ID.對於這裡因為qdisc在頂部,所以parent無,用『root』字樣來標識,ID用1:來標誌
『default 91′表示當某個ip流不滿足任何已設定的filter規則時,將自動歸入class 1中。更詳細的指令規則說明請參考手冊。
2)然後在qdisc下建立兩個class,來指定eth0控制通過本機到外網的速度
#tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2
註:以上就是我們控制輸出伺服器的速度,為2M,最大可以到4M
rate: 是一個類保證得到的頻寬值。如果有不只一個類,請保證所有子類總和是小於或等於父類。
prio:用來指示借用頻寬時的競爭力,prio越小,優先級越高,競爭力越強。
ceil: ceil是一個類最大能得到的頻寬值。
3)接著針對不同的應用在各root class下設定不同的類,。示例如下。(如果只有一個類,這個就沒有必要了)
#tc class add dev eth0 parent 1:30 classid 1:31 htbrate 0.5mbit ceil 2mbit prio 3
同時為了不使一個會話永占頻寬,在節點(即本文的各應用結點)加入隨即公平佇列sfq.(多IP)
#tc qdisc add dev eth0 parent 1:31 handle 31:sfq perturb 10
4)接著加入過濾器。
#tc filter add dev eth0 parent 1: protocol ipprio 31 handle 31 fw flowid 1:31
4)用iptable打標,也可以使用u32之類
#iptables -t mangle -I FORWARD -i !eth1 -p tcp –sport 80 -s xxx.xxx.xxx.xxx –j MARK –set-mark 31
TC對最對高速度的控制
Rate ceiling 速率限度
參數ceil指定了一個類可以用的最大頻寬, 用來限制類可以借用多少頻寬。預設的ceil是和速率一樣
這個特性對於ISP是很有用的, 因為他們一般限制被服務的使用者的總量即使其他使用者沒有請求服務。(ISPS 很想使用者付更多的錢得到更好的服務) ,注根類是不容許被借用的, 所以沒有指定ceil
註: ceil的數值應該至少和它所在的類的速率一樣高, 也就是說ceil應該至少和它的任何一個子類一樣高
Burst 突發
網路硬體只能在一個時間傳送到一個包這僅僅取決於一個硬體的速率。 鏈路共享軟體可以利用這個能力動態產生多個連線運行在不同的速度。所以速率和ceil不是一個即時度量只是一個在一個時間裡傳送到包的平均值。實際的情況是怎樣使一個流量很小的類在某個時間類以最大的速率提供給其他類。 burst 和cburst 參數控制多少資料可以以硬體最大的速度不費力的傳送到給需要的其他類。
如果cburst 小於一個理論上的封包他形成的突發不會超過ceil 速率, 同樣的方法TBF的最高速率也是這樣。
你可能會問, 為什麼需要bursts . 因為它可以很容易的提高向應速度在一個很擁擠的鏈路上。 比如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 show dev eth0
tc -s -d class show dev eth0
刪除tc規則
tc qdisc del dev eth0 root
案例
一、下載
下載限制單個IP
tc qdisc add dev eth0 root handle 1: htb r2q 1
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
r2q,是指沒有default的root,使整個網路的頻寬沒有限制
下載整段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佔用整個頻寬。