時(shí)間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)
公司一臺(tái)服務(wù)器,網(wǎng)絡(luò)環(huán)境太高,那臺(tái)服務(wù)器和源服務(wù)器連接下載,就跑到400M-500M,為了控制一下,所以研究了一下TC.來做流量控制。給他控制到小點(diǎn),不要讓這一臺(tái)占了所有的網(wǎng)絡(luò)。TC很是強(qiáng)大啊,很多所謂的硬件路由器,都是基于這個(gè)做的。
TC介紹
在linux中,TC有二種控制方法CBQ和HTB.HTB是設(shè)計(jì)用來替換CBQ的。它是一個(gè)層次式的過濾框架。
TC包括三個(gè)基本的構(gòu)成塊: 隊(duì)列規(guī)定qdisc(queueing discipline )、類(class)和分類器(Classifiers)
隊(duì)列(queueing discipline):用來實(shí)現(xiàn)控制網(wǎng)絡(luò)的收發(fā)速度。通過隊(duì)列,linux可以將網(wǎng)絡(luò)數(shù)據(jù)包緩存起來,然后根據(jù)用戶的設(shè)置,在盡量不中斷連接(如 TCP)的前提下來平滑網(wǎng)絡(luò)流量。需要注意的是,linux對(duì)接收隊(duì)列的控制不夠好,所以我們一般只用發(fā)送隊(duì)列,即"控發(fā)不控收"。它封裝了其他兩個(gè)主要 TC組件(類和分類器)。內(nèi)核如果需要通過某個(gè)網(wǎng)絡(luò)接口發(fā)送數(shù)據(jù)包,它都需要按照為這個(gè)接口配置的qdisc(排隊(duì)規(guī)則)把數(shù)據(jù)包加入隊(duì)列。然后,內(nèi)核會(huì)盡可能多地從qdisc里面取出數(shù)據(jù)包,把它們交給網(wǎng)絡(luò)適配器驅(qū)動(dòng)模塊。
最簡(jiǎn)單的QDisc是pfifo它不對(duì)進(jìn)入的數(shù)據(jù)包做任何的處理,數(shù)據(jù)包采用先入先出的方式通過隊(duì)列。不過,它會(huì)保存網(wǎng)絡(luò)接口一時(shí)無法處理的數(shù)據(jù)包。
隊(duì)列規(guī)則包括FIFO(先進(jìn)先出),RED(隨機(jī)早期探測(cè)),SFQ(隨機(jī)公平隊(duì)列)和令牌桶(Token Bucket),類基隊(duì)列(CBQ),CBQ 是一種超級(jí)隊(duì)列,即它能夠包含其它隊(duì)列(甚至其它CBQ)。
class用來表示控制策略。很顯然,很多時(shí)候,我們很可能要對(duì)不同的IP實(shí)行不同的流量控制策略,這時(shí)候我們就得用不同的class來表示不同的控制策略了。
filter用來將用戶劃入到具體的控制策略中(即不同的class中)。比如,現(xiàn)在,我們想對(duì)xxa,xxb兩個(gè)IP實(shí)行不同的控制策略(A,B),這時(shí),我們可用filter將xxa劃入到控制策略A,將xxb劃入到控制策略B,filter劃分的標(biāo)志位可用u32打標(biāo)功能或IPtables的 set-mark(大多使用iptables來做標(biāo)記)功能來實(shí)現(xiàn)。
目前,TC可以使用的過濾器有:fwmark分類器,u32分類器,基于路由的分類器和RSVP分類器(分別用于IPV6、IPV4)等;其中,fwmark分類器允許我們使用 Linux netfilter 代碼選擇流量,而u32分類器允許我們選擇基于 ANY 頭的流量 .需要注意的是,filter(過濾器)是在QDisc內(nèi)部,它們不能作為主體。
數(shù)據(jù)包->iptables(在通過iptables時(shí),iptables根據(jù)不同的ip來設(shè)置不同的mark)->TC(class)->TC(queue)
應(yīng)用
假設(shè)eth0位是服務(wù)器的外網(wǎng)網(wǎng)絡(luò)接口。
1)首先在eth0的qdiscA,qdiscA控制通過本機(jī)到外網(wǎng)的速度,因此是用來控制服務(wù)器流出速度的
#tc qdisc add dev eth1 root handle 1:htb default 1
添加 設(shè)置接口 最上層 句柄(做標(biāo)記用) 標(biāo)記 默認(rèn)使用1的class
解釋如下:無論是隊(duì)列,還是class和filter都有ID之類的標(biāo)志符,一般都有parent(父,上層的),注意ID具有接口本地性,不同的網(wǎng)絡(luò)接口可以有相同的ID.對(duì)于這里因?yàn)閝disc在頂部,所以parent無,用‘root’字樣來標(biāo)識(shí),ID用1:來標(biāo)志
‘default 91′表示當(dāng)某個(gè)ip流不滿足任何已設(shè)定的filter規(guī)則時(shí),將自動(dòng)歸入class 1中。更詳細(xì)的指令規(guī)則說明請(qǐng)參考手冊(cè)。
2)然后在qdisc下建立兩個(gè)class,來指定eth0控制通過本機(jī)到外網(wǎng)的速度
#tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2
注:以上就是我們控制輸出服務(wù)器的速度,為2M,最大可以到4M
rate: 是一個(gè)類保證得到的帶寬值。如果有不只一個(gè)類,請(qǐng)保證所有子類總和是小于或等于父類。
prio:用來指示借用帶寬時(shí)的競(jìng)爭(zhēng)力,prio越小,優(yōu)先級(jí)越高,競(jìng)爭(zhēng)力越強(qiáng)。
ceil: ceil是一個(gè)類最大能得到的帶寬值。
3)接著針對(duì)不同的應(yīng)用在各root class下設(shè)置不同的類,。示例如下。(如果只有一個(gè)類,這個(gè)就沒有必要了)
#tc class add dev eth0 parent 1:30 classid 1:31 htbrate 0.5mbit ceil 2mbit prio 3
同時(shí)為了不使一個(gè)會(huì)話永占帶寬,在節(jié)點(diǎn)(即本文的各應(yīng)用結(jié)點(diǎn))添加隨即公平隊(duì)列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打標(biāo),也可以使用u32之類
#iptables -t mangle -I FORWARD -i !eth1 -p tcp –sport 80 -s xxx.xxx.xxx.xxx –j MARK –set-mark 31
TC對(duì)最對(duì)高速度的控制
Rate ceiling 速率限度
參數(shù)ceil指定了一個(gè)類可以用的最大帶寬, 用來限制類可以借用多少帶寬。缺省的ceil是和速率一樣
這個(gè)特性對(duì)于ISP是很有用的, 因?yàn)樗麄円话阆拗票环⻊?wù)的用戶的總量即使其他用戶沒有請(qǐng)求服務(wù)。(ISPS 很想用戶付更多的錢得到更好的服務(wù)) ,注根類是不允許被借用的, 所以沒有指定ceil
注: ceil的數(shù)值應(yīng)該至少和它所在的類的速率一樣高, 也就是說ceil應(yīng)該至少和它的任何一個(gè)子類一樣高
Burst 突發(fā)
網(wǎng)絡(luò)硬件只能在一個(gè)時(shí)間發(fā)送一個(gè)包這僅僅取決于一個(gè)硬件的速率。 鏈路共享軟件可以利用這個(gè)能力動(dòng)態(tài)產(chǎn)生多個(gè)連接運(yùn)行在不同的速度。 所以速率和ceil不是一個(gè)即時(shí)度量只是一個(gè)在一個(gè)時(shí)間里發(fā)送包的平均值。 實(shí)際的情況是怎樣使一個(gè)流量很小的類在某個(gè)時(shí)間類以最大的速率提供給其他類。 burst 和cburst 參數(shù)控制多少數(shù)據(jù)可以以硬件最大的速度不費(fèi)力的發(fā)送給需要的其他類。
如果cburst 小于一個(gè)理論上的數(shù)據(jù)包他形成的突發(fā)不會(huì)超過ceil 速率, 同樣的方法TBF的最高速率也是這樣。
你可能會(huì)問, 為什么需要bursts . 因?yàn)樗梢院苋菀椎奶岣呦驊?yīng)速度在一個(gè)很擁擠的鏈路上。 比如WWW 流量是突發(fā)的。 你訪問主頁。 突發(fā)的獲得并閱讀。 在空閑的時(shí)間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的狀態(tài)
tc -s -d qdisc show dev eth0
tc -s -d class show dev eth0
刪除tc規(guī)則
tc qdisc del dev eth0 root
實(shí)例
一、下載
下載限制單個(gè)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,使整個(gè)網(wǎng)絡(luò)的帶寬沒有限制
下載整段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了,實(shí)際下載速度為200k左右。
這種情況下,這個(gè)網(wǎng)段所有機(jī)器共享這200k的帶寬。
還可以加入一個(gè)sfq(隨機(jī)公平隊(duì)列)
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è)段內(nèi)的一個(gè)ip占用整個(gè)帶寬。
關(guān)鍵詞標(biāo)簽:linux,服務(wù)器流量控制
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程使用screen管理你的遠(yuǎn)程會(huì)話GNU/Linux安裝vmware如何登錄linux vps圖形界面 Linux遠(yuǎn)程桌面連
人氣排行 Linux下獲取CPUID、硬盤序列號(hào)與MAC地址linux tc實(shí)現(xiàn)ip流量限制dmidecode命令查看內(nèi)存型號(hào)linux下解壓rar文件安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令lcx.exe、nc.exe、sc.exe入侵中的使用方法查看linux服務(wù)器硬盤IO讀寫負(fù)載