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