Linux環境使用TC進行服務器流量控製方法
公司目前(qián)有一台服務(wù)器,網絡環境太(tài)高(gāo),那台服務(wù)器和源服務器連接下載,就跑到400M-500M,為了控製一下,所以研(yán)究了一下TC,來(lái)做流量控製。給他控製到小點,不(bú)要讓這一台占(zhàn)了所有的網絡。TC很強大(dà),很多所謂的硬件路由器,都是基(jī)於這個做(zuò)的(de)。
一、Linux下(xià)使用TC進行服務器流量控製方法
1)假設eth0位是服務器的外網網絡接口(kǒu),首先在eth0的qdiscA,qdiscA控製通(tōng)過本(běn)機到(dào)外網的速度,因此可用來控製服務器對外數據傳輸速度。
#tc qdisc add dev eth1 root handle 1:htb default 1
添加 設置接(jiē)口 最上層 句(jù)柄(做標記用) 標記 默認使用1的class
解釋如下:無論是隊(duì)列(liè),還是class和filter都有ID之類(lèi)的標誌(zhì)符,一般都有parent(父,上層的),注意ID具有(yǒu)接口本地性,不同的網絡接口可以有相同的ID.對於這裏因為qdisc在頂部,所以parent無,用‘root’字樣(yàng)來標識,ID用1:來標誌(zhì)
‘default 91′表示當某個ip流不滿足任何已設定的filter規則時,將自動歸入class 1中。更詳細的指令(lìng)規則說(shuō)明請參考手冊。
2)然後在(zài)qdisc下建立兩個class,來指定eth0控製通過本機到外網的速度
#tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2
注:以上就是我們控製輸出服務器的速度,為2M,最大可以到4M
rate: 是一個類保證得到的帶寬(kuān)值。如果有不隻一個類,請保證所(suǒ)有子類總和是小於或(huò)等於父類。
prio:用來指示(shì)借用帶寬時的(de)競爭(zhēng)力,prio越小,優先級越(yuè)高,競爭力越強。
ceil: ceil是一個類最大(dà)能(néng)得到的帶寬值。
3)接著針(zhēn)對不同的應用在各root class下設置不(bú)同的類,示例如下。(如果隻有一個類,這個就沒有必要了)
#tc class add dev eth0 parent 1:30 classid 1:31 htbrate 0.5mbit ceil 2mbit prio 3
同時為了不使一個會話永占帶寬,在節點(即本文的各(gè)應用結點)添加隨即公(gōng)平隊列sfq.(多(duō)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
5)用iptable打(dǎ)標,也可以使用(yòng)u32之類
#iptables -t mangle -I FORWARD -i !eth1 -p tcp –sport 80 -s xxx.xxx.xxx.xxx –j MARK –set-mark 31
二、TC對最對高速度的控(kòng)製 | Rate ceiling 速率限度
參數ceil指定了一個類可(kě)以用的最大帶寬, 用來限製類(lèi)可以借(jiè)用多少帶寬。缺省的(de)ceil是和速率一樣,這(zhè)個特(tè)性對於ISP是很有用(yòng)的, 因為他們一般限製被服務的用(yòng)戶的總量即使其他(tā)用(yòng)戶(hù)沒有(yǒu)請求服務。(ISPS 很想用戶付(fù)更多的錢得到更好的服務) ,注根類是不允許被借用的, 所以沒有指定ceil。
(注: ceil的數值應該至少和它所在的(de)類的速(sù)率一樣高, 也(yě)就是說ceil應該(gāi)至少和它的(de)任何一個子類一樣高。)
Burst 突發
網絡硬(yìng)件隻能在一個時間發送一個包這僅僅取決於一(yī)個硬件的速率。 鏈路共(gòng)享軟件可以利用(yòng)這個能力動(dòng)態產生多個(gè)連接運行在不(bú)同的(de)速度(dù)。所以速率和ceil不是一個(gè)即時度量隻是(shì)一個在一個時(shí)間裏發送包(bāo)的平均值。實際的(de)情況是怎樣使一個流量很(hěn)小的類在(zài)某個時間類以最大的速率提供給(gěi)其他(tā)類。 burst 和cburst 參數控製多少數據可以以硬件最大的速度不費力的發送給需要的其他(tā)類。
如果cburst 小於一個理論上的數據包他形成的突發不會超過ceil 速率(lǜ), 同樣的方法TBF的最高速率也(yě)是這樣。
你可能會問, 為什麽需要bursts . 因為它可以很容易的提高向應速度在一個很擁擠的(de)鏈路上。 比如WWW 流量是(shì)突發的。 你訪問主頁。 突發的獲得(dé)並閱讀。 在空閑的(de)時間burst將再(zài)”charge”一次。
(注: burst 和cburst至少(shǎo)要和其(qí)子類的值一樣大。)
三、TC命(mìng)令格式:
加入(rù)
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的下載(zǎi)速度(dù)為30Mbit最高可以60Mbit
r2q,是指沒(méi)有default的root,使整個網絡的帶寬沒有限製(zhì)
下載整段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了,實際下載速(sù)度為200k左右。
這種情(qíng)況下,這個網段所有機器共享這200k的帶(dài)寬。
還可以加入一(yī)個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,他可以防止一個段內的一個(gè)ip占(zhàn)用整(zhěng)個帶寬。
TC簡介
在Linux中,TC有二種控製(zhì)方法CBQ和HTB.HTB是設計用來替換CBQ的。它是一個層次式的過濾框架。TC包括(kuò)三個基本的構成塊(kuài): 隊列規定qdisc(queueing discipline )、類(class)和分類器(Classifiers)。
隊列(queueing discipline):用來實現控(kòng)製網絡的收發速度(dù)。通過隊列,Linux可以將網絡數據包緩存起來(lái),然後根據用戶的設置,在盡量不中斷連接(如 TCP)的前提下來平滑網絡流量。需要注意(yì)的是(shì),linux對接收隊列的控製不夠好,所以我們一般隻用發送隊列,即“控發不(bú)控收”。它封裝了其他兩個主要 TC組件(類和分類器(qì))。內核如果需(xū)要通(tōng)過某個網絡接(jiē)口發送數(shù)據包,它都需要按照為這個接口配置的qdisc(排隊規則)把數據包加入隊列。然後,內核會 盡可能(néng)多地從qdisc裏麵取出(chū)數據包(bāo),把它們交(jiāo)給網絡適配器驅動模塊。
最簡單的QDisc是pfifo它不對進入的數據包做任何的處理,數據包采用先入先(xiān)出的方式(shì)通過隊列。不過(guò),它會保存(cún)網絡接口(kǒu)一時無法處理的數(shù)據包。
隊列規則包括FIFO(先進先出),RED(隨機早期探測),SFQ(隨機公平隊列(liè))和令(lìng)牌桶(Token Bucket),類基隊列(CBQ),CBQ 是(shì)一種超級隊列,即它能夠(gòu)包含其它隊列(甚至其它CBQ)。
class用來表示控製(zhì)策略。很顯然,很多時(shí)候,我們很可能要(yào)對不同(tóng)的IP實行不同(tóng)的流量控製策略,這時候(hòu)我們(men)就得用不同的class來表示不同的控(kòng)製策略(luè)了。
filter用來將用戶劃入到具體(tǐ)的(de)控製策略中(即不同的class中)。比如,現在,我們想對xxa,xxb兩個IP實行不(bú)同的控製策略(luè) (A,B),這時,我們可用filter將xxa劃入到控製策略A,將xxb劃入到控製策略(luè)B,filter劃分的標誌位可用u32打標(biāo)功能(néng)或 IPtables的 set-mark(大多使用iptables來做標記)功能來實現。
目前,TC可以使用的過濾器有:fwmark分類(lèi)器,u32分類器(qì),基於路由的分(fèn)類器和RSVP分類器(分別用於IPV6、IPV4)等;其 中,fwmark分類器允許我們使用 Linux netfilter 代碼選擇流量(liàng),而u32分(fèn)類(lèi)器允許我們選擇基於 ANY 頭的流量 .需(xū)要注意的是(shì),filter(過濾器)是在QDisc內部(bù),它們不能作為主體。
數據包->iptables(在(zài)通過iptables時,iptables根(gēn)據不同的ip來設置不同(tóng)的mark)->TC(class)->TC(queue)。
關鍵詞:Linux,服務器
閱(yuè)讀本文(wén)後(hòu)您有(yǒu)什麽感想? 已有 人給出評價!
- 1
- 1
- 1
- 1
- 1
- 1