linux qos 软件,linux下QOS:应用篇 - 博客 - 伯乐在线
原文出處: linuxDOS???歡迎分享原創(chuàng)到伯樂頭條
上一篇我們講了QOS的理論知識(shí),了解了它是做什么用的,以及設(shè)計(jì)模式,下面就以tc的應(yīng)用的更深入的理解qos.
Linux采用了基于對(duì)象的實(shí)現(xiàn)方法,qos還能保證對(duì)不同接口采用不同的策略,TC QOS有很多擁塞控制的機(jī)制默認(rèn)的是FIFo還有其他PQ、CQ、WFQ等.
策略類 用結(jié)構(gòu)體:Qdisc_ops表示。每個(gè)設(shè)備可以采用不同的策略對(duì)象,在設(shè)備和對(duì)象的關(guān)聯(lián)需要到Qdisc結(jié)構(gòu)體
通過上面的描述,整個(gè)TC的架構(gòu)也就出來了,發(fā)送數(shù)據(jù)包的流程應(yīng)該是這樣的:
(1) 上層協(xié)議開始發(fā)送數(shù)據(jù)包
(2) 獲得當(dāng)前設(shè)備所采用的策略對(duì)象
(3) 調(diào)用此對(duì)象的enqueue方法把數(shù)據(jù)包壓入隊(duì)列
(4) 調(diào)用此對(duì)象的dequeue方法從隊(duì)列中取出數(shù)據(jù)包
(5) 調(diào)用網(wǎng)卡驅(qū)動(dòng)的發(fā)送函數(shù)發(fā)送
并且在上一節(jié)我們已經(jīng)講了tc的三級(jí)樹型組織.這里不再貼圖. 還有一點(diǎn)注意的就是tc控發(fā)不空收.
下面就從tc的命令說起:
命令格式:
1
2
3
4
5
6
7
8
9tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]
tcclass [ add | change | replace ] dev DEV parent qdisc-id [ classidclass-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
具體的配置流程如下:
Linux流量控制主要分為建立隊(duì)列、建立分類和建立過濾器三個(gè)方面。
基本實(shí)現(xiàn)步驟
(1) 針對(duì)網(wǎng)絡(luò)物理設(shè)備(如以太網(wǎng)卡eth0)綁定一個(gè)隊(duì)列QDisc;
(2) 在該隊(duì)列上建立分類class;
(3) 為每一分類建立一個(gè)基于路由的過濾器filter;
(4) 最后與過濾器相配合,建立特定的路由表等
1. tc 命令的基本用法
查看tc help 或者man tc
2. 針對(duì)不同算法的不同配置 (為什么這說,不同的策略算法,它的參數(shù)不一樣需要根據(jù)實(shí)際情況實(shí)際分析)
3. 無分類qdisc 和分類qdisc
(1) 無分類:
[p|b]fifo
使用最簡(jiǎn)單的qdisc,純粹的先進(jìn)先出。只有一個(gè)參數(shù):limit,用來設(shè)置隊(duì)列的長(zhǎng)度,pfifo是以數(shù)據(jù)包的個(gè)數(shù)為單位;bfifo是以字節(jié)數(shù)為單位。
pfifo_fast
在 編譯內(nèi)核時(shí),如果打開了高級(jí)路由器(AdvancedRouter)編譯選項(xiàng),pfifo_fast就是系統(tǒng)的標(biāo)準(zhǔn)QDISC。它的隊(duì)列包括三個(gè)波段(band)。在每個(gè)波段里面,使用先進(jìn)先出規(guī)則。而三個(gè)波段(band)的優(yōu)先級(jí)也不相同,band 0的優(yōu)先級(jí)最高,band 2的最低。如果band里面有數(shù)據(jù)包,系統(tǒng)就不會(huì)處理band1里面的數(shù)據(jù)包,band 1和band 2之間也是一樣。數(shù)據(jù)包是按照服務(wù)類型(Type ofService,TOS)被分配多三個(gè)波段(band)里面的
red
red是Random Early Detection(隨機(jī)早期探測(cè))的簡(jiǎn)寫。如果使用這種QDISC,當(dāng)帶寬的占用接近于規(guī)定的帶寬時(shí),系統(tǒng)會(huì)隨機(jī)地丟棄一些數(shù)據(jù)包。它非常適合高帶寬應(yīng)用。
sfq
sfq是Stochastic Fairness Queueing的簡(jiǎn)寫。它按照會(huì)話(session–對(duì)應(yīng)于每個(gè)TCP連接或者UDP流)為流量進(jìn)行排序,然后循環(huán)發(fā)送每個(gè)會(huì)話的數(shù)據(jù)包
tbf
tbf是Token Bucket Filter的簡(jiǎn)寫,適合于把流速降低到某個(gè)值 。
如果沒有可分類QDisc,不可分類QDisc只能附屬于設(shè)備的根。它們的用法如下:
tc qdisc add dev DEV root QDISC QDISC-PARAMETERS
要?jiǎng)h除一個(gè)不可分類QDisc,需要使用如下命令:
tc qdisc del dev DEV root
一個(gè)網(wǎng)絡(luò)接口上如果沒有設(shè)置QDisc,pfifo_fast就作為缺省的QDisc。
(2) 分類:
CBQ
CBQ 是Class Based
Queueing(基于類別排隊(duì))的縮寫。它實(shí)現(xiàn)了一個(gè)豐富的連接共享類別結(jié)構(gòu),既有限制(shaping)帶寬的能力,也具有帶寬優(yōu)先級(jí)管理的能力。帶
寬限制是通過計(jì)算連接的空閑時(shí)間完成的。空閑時(shí)間的計(jì)算標(biāo)準(zhǔn)是數(shù)據(jù)包離隊(duì)事件的頻率和下層連接(數(shù)據(jù)鏈路層)的帶寬
HTB
HTB是 Hierarchy Token
Bucket的縮寫。通過在實(shí)踐基礎(chǔ)上的改進(jìn),它實(shí)現(xiàn)了一個(gè)豐富的連接共享類別體系。使用HTB可以很容易地保證每個(gè)類別的帶寬,雖然它也允許特定的類可
以突破帶寬上限,占用別的類的帶寬。HTB可以通過TBF(Token Bucket Filter)實(shí)現(xiàn)帶寬限制,也能夠劃分類別的優(yōu)先級(jí)。
PRIO
PRIO QDisc不能限制帶寬,因?yàn)閷儆诓煌悇e的數(shù)據(jù)包是順序離隊(duì)的。使用PRIO
QDisc可以很容易對(duì)流量進(jìn)行優(yōu)先級(jí)管理,只有屬于高優(yōu)先級(jí)類別的數(shù)據(jù)包全部發(fā)送完畢,才會(huì)發(fā)送屬于低優(yōu)先級(jí)類別的數(shù)據(jù)包。為了方便管理,需要使用
iptables或者ipchains處理數(shù)據(jù)包的服務(wù)類型(Type Of Service,ToS)
class的操作原理:
類(Class)組成一個(gè)樹,每個(gè)類都只有一個(gè)父類,而一個(gè)類可以有多個(gè)子類。某些QDisc(例如:CBQ和HTB)允許在運(yùn)行時(shí)動(dòng)態(tài)添加類,而其它的QDisc(例如:PRIO)不允許動(dòng)態(tài)建立類。
允許動(dòng)態(tài)添加類的QDisc可以有零個(gè)或者多個(gè)子類,由它們?yōu)閿?shù)據(jù)包排隊(duì)。
此外,每個(gè)類都有一個(gè)葉子QDisc,默認(rèn)情況下,這個(gè)葉子QDisc使用pfifo的方式排隊(duì),我們也可以使用其它類型的QDisc代
替這個(gè)默認(rèn)的QDisc。而且,這個(gè)葉子葉子QDisc有可以分類,不過每個(gè)子類只能有一個(gè)葉子QDisc。
當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入一個(gè)分類QDisc,它會(huì)被歸入某個(gè)子類。我們可以使用以下三種方式為數(shù)據(jù)包歸類,不過不是所有的QDisc都能夠使用這三種方式。
其他:
顯示隊(duì)列情況 :
Tc qdisc ls dev eth0
顯示分類狀況
Tc class ls dev eth0更詳細(xì)的可以加 –s參數(shù)
顯示過濾器的狀況
Tc –s filter ls dev eth0
顯示路由的情況
Ip route
Qdisc的參數(shù):
parent major:minor 或者 root。 一個(gè)qdisc是根節(jié)點(diǎn)就是root,否則其他的情況指定parent。其中major:minor是class的handle id,每個(gè)class都要指定一個(gè)id用于標(biāo)識(shí)。
handle major: ,這個(gè)語法有點(diǎn)奇怪,是可選的,如果qdisc下面還要分類(多個(gè)class),則需要指定這個(gè)hanlde。對(duì)于root,通常是”1:”。
注意:對(duì)于tc命令中的qdiscs和classes,標(biāo)識(shí)handle(classid)的語法都是x:y,其中x是一個(gè)整數(shù)用來標(biāo)識(shí)一個(gè) qdisc,y是一個(gè)整數(shù),用來標(biāo)識(shí)屬于該qdisc的class。qdisc的handle的y值必須是0,class的handle的y值必須是非 0。通常”1:0″簡(jiǎn)寫為”1:”,也就是上面看到的寫法。
default minor-id,未分類(不能和filter匹配)的流量(默認(rèn)的)會(huì)被送到這個(gè)minor所指定的類(class id為major:minor-id)。
tc class … dev dev parent major:[minor] [ classid major:minor ] htb rate rate [ ceil rate ] burst bytes [ cburst bytes ] [ prio priority ]
Class的參數(shù):
parent major:minor,指定這個(gè)類的父節(jié)點(diǎn),父節(jié)點(diǎn)可以是Qdisc,也可以是Class,如果是Qdisc,那么就不用指定minor,這個(gè)是必須的參數(shù)。
classid major:minor,classid作為class的標(biāo)識(shí),這個(gè)是可選的。如果這個(gè)class沒有子節(jié)點(diǎn),就可以不指定。major是父qdisc的handle。
參數(shù)說明:
rate: 是一個(gè)類保證得到的帶寬值.如果有不只一個(gè)類,請(qǐng)保證所有子類總和是小于或等于父類.
prio:用來指示借用帶寬時(shí)的競(jìng)爭(zhēng)力,prio越小,優(yōu)先級(jí)越高,競(jìng)爭(zhēng)力越強(qiáng). 低優(yōu)先級(jí)的class會(huì)優(yōu)先匹配
ceil: ceil是一個(gè)類最大能得到的帶寬值。即可以借用的帶寬(默認(rèn)ceil=rate),根類是不允許被借用的. 這個(gè)借用在什么時(shí)候生效呢?如果父類有空余帶寬,最高可以分配給當(dāng)前class的值,默認(rèn)是和rate一樣。
Burst 突發(fā),突發(fā)的流量,即大于限制帶寬的時(shí)候 > rate < ceil ;允許以ceil的速率發(fā)送的字節(jié)數(shù),應(yīng)該至少和子類的burst最大值一樣。
cburst 允許以網(wǎng)口的最高速率發(fā)送的字節(jié)數(shù),應(yīng)該至少和子類的cburst最大值一樣。功能類似tbf中的peakrate,當(dāng)這個(gè)值限制很小時(shí),可以避免突發(fā)的流量,以避免瞬間速率超過ceil。
quantum 每輪當(dāng)前的class能發(fā)送的字節(jié)數(shù),默認(rèn)的計(jì)算quantum = rate / r2q. Quantum必須大于1500 小于 60000。
quantum只在class的流量超過了rate但是沒超過ceil時(shí)使用。quantum越小,帶寬共享的效果就越好。 r2q 用來計(jì)算quantum,r2q默認(rèn)是10。
我們先看一個(gè)實(shí)際class的分類圖:
下面我們就實(shí)際看幾個(gè)應(yīng)用的例子:
1. 多用戶ip帶寬平均分配問題
實(shí)際應(yīng)用場(chǎng)景為小區(qū)里,共享一根帶寬上網(wǎng)問題。假如實(shí)際帶寬為20m ;用戶數(shù)量為100,都在一個(gè)vlan里;
限制用戶下載帶寬200kbps ;gw;先看實(shí)際環(huán)境的布局:
我們把小區(qū)的部分放大:
1
2
3
4
5Tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: htb r2q 1
tcclass add dev eth0 parent 1: classid 1:1 htb rate 20mbitceil 100mbit
tcclass add dev eth0 parent 1:1 classid 1:10 htb rate 200kbitceil 250kbit
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.0/24 flowid 1:10
關(guān)于filter匹配策略,也可以用iptables的MARK,在tc里為fw,用法如下:
1
2tc filter add dev eth0 parent 1: protocol ip prio 10 handle 1 fw classid 10:10
iptables -t mangle -A POSTROUTING -d 192.168.1.0/24 -j MARK --set-mark 1
有時(shí)候?qū)τ谧臃诸惱镔Y源有可能被某一個(gè)會(huì)話一直占有而其他得不到分配,所以需要添加子隊(duì)列來實(shí)現(xiàn)資源公平分配:
1tc qdisc add dev eth1 parent 1:10 handle 101: sfq perturb 10
假如有兩個(gè)子網(wǎng)呢?平均分配這20M帶寬:
1
2
3
4
5
6
7
8
9
10
11Tc qdisc add dev eth0 root handle 1: htb r2q 1
Tcclass add dev eth0 parent 1: classid 1:1 htb rate 20mbitceil 100mbit
Tcclass add dev eth0 parent 1:1 classid 1:10 htb rate 10mbitceil 20mbit
Tcclass add dev eth0 parent 1:1 classid 1:20 htb rate 10mbitceil 20mbit
Tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
Tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
Tc filter add dev eth0 protocol ip parent 1: prio 10 u32 match ip dst 192.168.1.0/24 flowid 1:10
Tc filter add dev eth0 protocol ip parent 1: prio 20 u32 match ip dst 192.168.2.0/24 flowid 1:20
2. 單獨(dú)限制某一個(gè)應(yīng)用的速率問題
這個(gè)問題主要在于filter上,是匹配端口還是什么,可以通過iptables來實(shí)現(xiàn).這里不詳細(xì)列舉配置了.
3.多應(yīng)用優(yōu)先級(jí)問題 (voip 視頻 vpn、其他)
同樣我們還使用htb 算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Tc qdisc add dev eth0 root handle 1: htb
Tcclass add dev eth0 parent 1: classid 1:1 htb rate 100mbitceil 100mbit prio 0
1>Tcclass add dev eth0 parent 1:1 classid 1:10 htb rate 100mbitceil 100mbit prio 1
2>Tcclass add dev eth0 parent 1:1 classid 1:11 htb rate 100mbitceil 100mbit prio 2
3>Tcclass add dev eth0 parent 1:1 classid 1:12 htb rate 50mbitceil 50mbit prio 3
4>Tcclass add dev eth0 parent 1:1 classid 1:13 htb rate 50mbitceil 50mbit prio 4
Tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
Tc qdisc add dev eth0 parent 1:11 handle 11: sfq perturb 10
Tc qdisc add dev eth0 parent 1:12 handle 12: sfq perturb 10
Tc qdisc add dev eth0 parent 1:13 handle 13: sfq perturb 10
Tc filter add dev eth0 prarent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
Tc filter add dev eth0 prarent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
Tc filter add dev eth0 prarent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
Tc filter add dev eth0 prarent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
Set-mark:
1.??? voip
2.??? vpn
3.??? 視頻
4.??? 其他
上面我們簡(jiǎn)單介紹了實(shí)際應(yīng)用的三個(gè)例子。至少我們明白了tc應(yīng)用的基本流程和簡(jiǎn)單配置,更復(fù)雜的用法需要自己去深入學(xué)習(xí).
我們需要注意的是上傳與下載雖然相對(duì)獨(dú)立,但是他們也會(huì)相互影響,比如tcp的性能問題,每傳輸一個(gè)報(bào)文同時(shí)都需要得到一個(gè)響應(yīng)報(bào)文.還有關(guān)于報(bào)文大小的問題,
也需要注意,有時(shí)候配置tc的時(shí)候,需要我們把mtu的值調(diào)大,不然就會(huì)造成丟包.例:
1tc qdisc add dev eth0 handle 2 root tbf burst 200kb rate 200kbps mtu 8000 latency 10
在我們具體配置隊(duì)列的時(shí)候,會(huì)被一大堆參數(shù)繞暈,其實(shí)我們只需要針對(duì)具體的策略算法,查看幫助即可,本身命令的幫助已經(jīng)很清晰,然后我們?cè)籴槍?duì)具體算法查詢資料即可
這里講的也僅僅是linux系統(tǒng)自帶的功能,對(duì)于更復(fù)雜的則需要我們自己去實(shí)現(xiàn)一些特殊的功能,比如cos和dscp等.
1 贊 收藏 評(píng)論
總結(jié)
以上是生活随笔為你收集整理的linux qos 软件,linux下QOS:应用篇 - 博客 - 伯乐在线的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菜鸟裹裹寄件码怎么查
- 下一篇: windows编辑linux系统文件格式