這個隊(duì)列有3個所謂的"頻道"。FIFO規(guī)則應(yīng)用于每一個頻道.并且:如果在0頻道有數(shù)據(jù)包等待發(fā)送,1頻道的包就不會被處理, 1頻道和2頻道之間的關(guān)系也是如此。pfifo_fast只起到調(diào)度的作用,對數(shù)據(jù)流量不進(jìn)行控制。pfifo_fast是系統(tǒng)默認(rèn)的隊(duì)列類型,你可以使用ip命令來查看當(dāng)前的網(wǎng)絡(luò)隊(duì)列設(shè)置:
# ip link list
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
2.令牌桶過濾器(TBF)
令牌桶過濾器(TBF)是一個簡單的隊(duì)列規(guī)定:按照事先設(shè)定的速率來處理數(shù)據(jù)包通過,但允許短暫突發(fā)流量朝過設(shè)定的速率。TBF很精確,對于網(wǎng)絡(luò)和處理器的影響都很小.TBF的實(shí)現(xiàn)在于一個緩沖器(桶),里面是一些叫做"令牌"的數(shù)據(jù)。它以特定的速率處理網(wǎng)絡(luò)數(shù)據(jù)包。桶最重要的參數(shù)就是它的大小,也就是它能夠存儲令牌數(shù)據(jù)的數(shù)量。每個令牌從數(shù)據(jù)隊(duì)列中收集一個數(shù)據(jù)包,然后從桶中被刪除.這個算法關(guān)聯(lián)到兩個流上–令牌流和數(shù)據(jù)流,于是我們得到3種情景:
a.數(shù)據(jù)流以等于令牌流的速率到達(dá)TBF.這種情況下,每個到來的數(shù)據(jù)包都能對應(yīng)一個令牌,然后無延遲地通過隊(duì)列。
b.數(shù)據(jù)流以小于令牌流的速度到達(dá)TBF.通過隊(duì)列的數(shù)據(jù)包只消耗了一部分令牌,剩下的令牌會在桶里積累下來,直到桶被裝滿。剩下的令牌可以在需要以高于令牌流速率發(fā)送數(shù)據(jù)流的時候消耗掉,這種情況下會發(fā)生突發(fā)傳輸。
c.數(shù)據(jù)流以大于令牌流的速率到達(dá)TBF。這意味著桶里的令牌很快就會被耗盡.導(dǎo)致TBF中斷一段時間,稱為"越限"。如果數(shù)據(jù)包持續(xù)到來,將發(fā)生丟包。
最后一種情景非常重要,因?yàn)樗梢杂脕韺?shù)據(jù)通過過濾器的速率進(jìn)行整形。
令牌的積累可以導(dǎo)致越限的數(shù)據(jù)進(jìn)行短時間的突發(fā)傳輸而不必丟包,但是持續(xù)越限的話會導(dǎo)致傳輸延遲直至丟包。
limit/latency
limit確定最多有多少數(shù)據(jù)(字節(jié)數(shù))在隊(duì)列中等待可用令牌.你也可以通過設(shè)置latency參數(shù)來指定這個參數(shù),latency參數(shù)確定了一個包在TBF中等待傳輸?shù)淖铋L等待時間。后者計(jì)算決定桶的大小,速率和峰值速率。這兩個參數(shù)是相互獨(dú)立的。
burst/buffer/maxburst
桶的大小,以字節(jié)計(jì).這個參數(shù)指定了最多可以有多少個令牌能夠即刻被使用。通常,管理的帶寬越大,需要的緩沖器就越大。如果你的緩沖區(qū)太小,就會導(dǎo)致到達(dá)的令牌沒有地方放(桶滿了),這會導(dǎo)致潛在的丟包。
mpu
一個零長度的包并不是不耗費(fèi)帶寬.比如以太網(wǎng),數(shù)據(jù)幀不會小于64字節(jié)。Mpu(Minimum Packet Unit,最小分組單位)決定了令牌的最低消耗.默認(rèn)值是0。
rate
速度操縱桿。參見上面的limits
如果希望設(shè)置峰值速率,使用下面的參數(shù):
peakrate
令牌桶的最大的速率。
mtu/minburst
設(shè)置了peakrate后,為了提高精確度,也要設(shè)置接口的MTU值.如果需要設(shè)置peakrate,而又允許突發(fā)的大數(shù)據(jù)傳輸這個值可以設(shè)置的大一些.minburst設(shè)置為3000字節(jié),則可提供3Mbit/s的peakrate。
令牌桶過濾器適用于需要精確設(shè)置速率的網(wǎng)絡(luò),它并不對數(shù)據(jù)包進(jìn)行調(diào)度,只進(jìn)行流量控制。
3. SFQ隨機(jī)公平隊(duì)列
SFQ(Stochastic Fairness Queueing,隨機(jī)公平隊(duì)列)是公平隊(duì)列算法家族中的一個簡單實(shí)現(xiàn)。它的沒有其它的方法那么精確,它在實(shí)現(xiàn)高度公平的同時,需要的計(jì)算量卻很少.SFQ的關(guān)鍵詞是"會話"(或稱作"流") ,主要針對一個TCP會話或者UDP流。流量被分成相當(dāng)多數(shù)量的FIFO隊(duì)列中,每個隊(duì)列對應(yīng)一個會話。數(shù)據(jù)按照簡單輪轉(zhuǎn)的方式發(fā)送, 每個會話都按順序得到發(fā)送機(jī)會。這種方式非常公平,保證了每一個會話都不會沒其它會話所淹沒。SFQ之所以被稱為"隨機(jī)",是因?yàn)樗⒉皇钦娴臑槊恳粋€會話創(chuàng)建一個隊(duì)列,而是使用一個散列算法,把所有的會話映射到有限的幾個隊(duì)列中去。
因?yàn)槭褂昧松⒘?所以可能多個會話分配在同一個隊(duì)列里,從而需要共享發(fā)包的機(jī)會,也就是共享帶寬。為了不讓這種效應(yīng)太明顯,SFQ會頻繁地改變散列算法,以便把這種效應(yīng)控制在幾秒鐘之內(nèi)。只有當(dāng)你的出口網(wǎng)卡確實(shí)已經(jīng)擠滿了的時候,SFQ才會起作用!否則在你的Linux機(jī)器中根本就不會有隊(duì)列,SFQ也就不會起作用。SFQ不會重新調(diào)整流量的速率,只是進(jìn)行數(shù)據(jù)包的調(diào)度。
perturb
多少秒后重新配置一次散列算法。如果取消設(shè)置,散列算法將永遠(yuǎn)不會重新配置(不建議這樣做)。10秒應(yīng)該是一個合適的值。
quantum
一個流至少要傳輸多少字節(jié)后才切換到下一個隊(duì)列。卻省設(shè)置為一個最大包的長度(MTU的大小)。不要設(shè)置這個數(shù)值低于MTU。
4 tc配置實(shí)例
1.在eth0上設(shè)置一個tbf(令牌桶過濾器)隊(duì)列, 網(wǎng)絡(luò)帶寬220kbit,延遲50ms,緩沖區(qū)為1540個字節(jié)。
# tc qdisc add dev eth0 root tbf rate 200kbit latency 50ms burst 1540
查看eth0接口上的隊(duì)列設(shè)置
# ip link list
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc tbf qlen 1000
link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
# tc qdisc ls dev eth0 # 查看eth0上的隊(duì)列規(guī)則
qdisc tbf 8001: rate 200Kbit burst 1539b lat 48.8ms
此時,另一臺機(jī)器從這臺服務(wù)器上下載文件的速率則只有20K左右。
刪除此隊(duì)列規(guī)則:
# tc qdisc del dev eth0 root tbf rate 220kbit latency 50ms burst 1540
2.在eth0上設(shè)置一個sfq(隨機(jī)公平隊(duì)列)。每10秒鐘重新設(shè)置一次算法。
# tc qdisc add dev eth0 root sfq perturb 10
查看eth0接口上的隊(duì)列設(shè)置:
# ip link list
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc sfq qlen 1000
link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
# tc qdisc ls dev eth0
qdisc sfq 8002: limit 128p quantum 1514b perturb 10sec
此時,另一臺機(jī)器從這臺服務(wù)器上下載文件的速率沒有變化。因?yàn)閟fq只進(jìn)行調(diào)度,而不進(jìn)行流量控制。