這個(gè)隊(duì)列有3個(gè)所謂的"頻道"。FIFO規(guī)則應(yīng)用于每一個(gè)頻道.并且:如果在0頻道有數(shù)據(jù)包等待發(fā)送,1頻道的包就不會(huì)被處理, 1頻道和2頻道之間的關(guān)系也是如此。pfifo_fast只起到調(diào)度的作用,對(duì)數(shù)據(jù)流量不進(jìn)行控制。pfifo_fast是系統(tǒng)默認(rèn)的隊(duì)列類型,你可以使用ip命令來(lái)查看當(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.令牌桶過(guò)濾器(TBF)

令牌桶過(guò)濾器(TBF)是一個(gè)簡(jiǎn)單的隊(duì)列規(guī)定:按照事先設(shè)定的速率來(lái)處理數(shù)據(jù)包通過(guò),但允許短暫突發(fā)流量朝過(guò)設(shè)定的速率。TBF很精確,對(duì)于網(wǎng)絡(luò)和處理器的影響都很小.TBF的實(shí)現(xiàn)在于一個(gè)緩沖器(桶),里面是一些叫做"令牌"的數(shù)據(jù)。它以特定的速率處理網(wǎng)絡(luò)數(shù)據(jù)包。桶最重要的參數(shù)就是它的大小,也就是它能夠存儲(chǔ)令牌數(shù)據(jù)的數(shù)量。每個(gè)令牌從數(shù)據(jù)隊(duì)列中收集一個(gè)數(shù)據(jù)包,然后從桶中被刪除.這個(gè)算法關(guān)聯(lián)到兩個(gè)流上–令牌流和數(shù)據(jù)流,于是我們得到3種情景:

a.數(shù)據(jù)流以等于令牌流的速率到達(dá)TBF.這種情況下,每個(gè)到來(lái)的數(shù)據(jù)包都能對(duì)應(yīng)一個(gè)令牌,然后無(wú)延遲地通過(guò)隊(duì)列。

b.數(shù)據(jù)流以小于令牌流的速度到達(dá)TBF.通過(guò)隊(duì)列的數(shù)據(jù)包只消耗了一部分令牌,剩下的令牌會(huì)在桶里積累下來(lái),直到桶被裝滿。剩下的令牌可以在需要以高于令牌流速率發(fā)送數(shù)據(jù)流的時(shí)候消耗掉,這種情況下會(huì)發(fā)生突發(fā)傳輸。

c.數(shù)據(jù)流以大于令牌流的速率到達(dá)TBF。這意味著桶里的令牌很快就會(huì)被耗盡.導(dǎo)致TBF中斷一段時(shí)間,稱為"越限"。如果數(shù)據(jù)包持續(xù)到來(lái),將發(fā)生丟包。

最后一種情景非常重要,因?yàn)樗梢杂脕?lái)對(duì)數(shù)據(jù)通過(guò)過(guò)濾器的速率進(jìn)行整形。

令牌的積累可以導(dǎo)致越限的數(shù)據(jù)進(jìn)行短時(shí)間的突發(fā)傳輸而不必丟包,但是持續(xù)越限的話會(huì)導(dǎo)致傳輸延遲直至丟包。

limit/latency

limit確定最多有多少數(shù)據(jù)(字節(jié)數(shù))在隊(duì)列中等待可用令牌.你也可以通過(guò)設(shè)置latency參數(shù)來(lái)指定這個(gè)參數(shù),latency參數(shù)確定了一個(gè)包在TBF中等待傳輸?shù)淖铋L(zhǎng)等待時(shí)間。后者計(jì)算決定桶的大小,速率和峰值速率。這兩個(gè)參數(shù)是相互獨(dú)立的。

burst/buffer/maxburst

桶的大小,以字節(jié)計(jì).這個(gè)參數(shù)指定了最多可以有多少個(gè)令牌能夠即刻被使用。通常,管理的帶寬越大,需要的緩沖器就越大。如果你的緩沖區(qū)太小,就會(huì)導(dǎo)致到達(dá)的令牌沒(méi)有地方放(桶滿了),這會(huì)導(dǎo)致潛在的丟包。

mpu

一個(gè)零長(zhǎng)度的包并不是不耗費(fèi)帶寬.比如以太網(wǎng),數(shù)據(jù)幀不會(huì)小于64字節(jié)。Mpu(Minimum Packet Unit,最小分組單位)決定了令牌的最低消耗.默認(rèn)值是0。

rate
速度操縱桿。參見(jiàn)上面的limits
如果希望設(shè)置峰值速率,使用下面的參數(shù):

peakrate
令牌桶的最大的速率。

mtu/minburst
設(shè)置了peakrate后,為了提高精確度,也要設(shè)置接口的MTU值.如果需要設(shè)置peakrate,而又允許突發(fā)的大數(shù)據(jù)傳輸這個(gè)值可以設(shè)置的大一些.minburst設(shè)置為3000字節(jié),則可提供3Mbit/s的peakrate。

令牌桶過(guò)濾器適用于需要精確設(shè)置速率的網(wǎng)絡(luò),它并不對(duì)數(shù)據(jù)包進(jìn)行調(diào)度,只進(jìn)行流量控制。

3. SFQ隨機(jī)公平隊(duì)列

SFQ(Stochastic Fairness Queueing,隨機(jī)公平隊(duì)列)是公平隊(duì)列算法家族中的一個(gè)簡(jiǎn)單實(shí)現(xiàn)。它的沒(méi)有其它的方法那么精確,它在實(shí)現(xiàn)高度公平的同時(shí),需要的計(jì)算量卻很少.SFQ的關(guān)鍵詞是"會(huì)話"(或稱作"流") ,主要針對(duì)一個(gè)TCP會(huì)話或者UDP流。流量被分成相當(dāng)多數(shù)量的FIFO隊(duì)列中,每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)會(huì)話。數(shù)據(jù)按照簡(jiǎn)單輪轉(zhuǎn)的方式發(fā)送, 每個(gè)會(huì)話都按順序得到發(fā)送機(jī)會(huì)。這種方式非常公平,保證了每一個(gè)會(huì)話都不會(huì)沒(méi)其它會(huì)話所淹沒(méi)。SFQ之所以被稱為"隨機(jī)",是因?yàn)樗⒉皇钦娴臑槊恳粋€(gè)會(huì)話創(chuàng)建一個(gè)隊(duì)列,而是使用一個(gè)散列算法,把所有的會(huì)話映射到有限的幾個(gè)隊(duì)列中去。

因?yàn)槭褂昧松⒘?所以可能多個(gè)會(huì)話分配在同一個(gè)隊(duì)列里,從而需要共享發(fā)包的機(jī)會(huì),也就是共享帶寬。為了不讓這種效應(yīng)太明顯,SFQ會(huì)頻繁地改變散列算法,以便把這種效應(yīng)控制在幾秒鐘之內(nèi)。只有當(dāng)你的出口網(wǎng)卡確實(shí)已經(jīng)擠滿了的時(shí)候,SFQ才會(huì)起作用!否則在你的Linux機(jī)器中根本就不會(huì)有隊(duì)列,SFQ也就不會(huì)起作用。SFQ不會(huì)重新調(diào)整流量的速率,只是進(jìn)行數(shù)據(jù)包的調(diào)度。

perturb

多少秒后重新配置一次散列算法。如果取消設(shè)置,散列算法將永遠(yuǎn)不會(huì)重新配置(不建議這樣做)。10秒應(yīng)該是一個(gè)合適的值。

quantum

一個(gè)流至少要傳輸多少字節(jié)后才切換到下一個(gè)隊(duì)列。卻省設(shè)置為一個(gè)最大包的長(zhǎng)度(MTU的大小)。不要設(shè)置這個(gè)數(shù)值低于MTU。

4 tc配置實(shí)例

1.在eth0上設(shè)置一個(gè)tbf(令牌桶過(guò)濾器)隊(duì)列, 網(wǎng)絡(luò)帶寬220kbit,延遲50ms,緩沖區(qū)為1540個(gè)字節(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

此時(shí),另一臺(tái)機(jī)器從這臺(tái)服務(wù)器上下載文件的速率則只有20K左右。
刪除此隊(duì)列規(guī)則:

# tc qdisc del dev eth0 root tbf rate 220kbit latency 50ms burst 1540

2.在eth0上設(shè)置一個(gè)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

此時(shí),另一臺(tái)機(jī)器從這臺(tái)服務(wù)器上下載文件的速率沒(méi)有變化。因?yàn)閟fq只進(jìn)行調(diào)度,而不進(jìn)行流量控制。

分享到

多易

相關(guān)推薦