tc流量管理簡介

http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=traffic-control:tc%E6%B5%81%E9%87%8F%E7%AE%A1%E7%90%86%E7%AE%80%E4%BB%8B

 

一.tc的簡介

tc,即traffic control,顧名思義,tc是linux進行流量控制的工具.通過tc,你可以控制網絡接口發送數據的速率.
每個網絡接口(如:eth0,ppp0)都有一個隊列,用於管理和調度待發的數據.tc的工作原理就是,通過設置不同類型
的網絡接口隊列,從而改變數據包發送的速率和優先級,達到流量控制的目的.

二.啓用tc功能

如果你想使用tc功能,請確認你的內核配置中帶有 “IP: advanced router” 和”IP: policy routing” 兩項,
並添加了相關的子選項.重新編譯內核後,就可以使用tc命令對內核網絡隊列進行配置了.

三.tc中的隊列類型

tc是通過設置不同的隊列類型和屬性來控制網絡接口的流量.
Linux內核中支持的隊列有:
TBF(Token Bucket Flow令牌桶過濾器), pfifo_fast(Third Band First In First Out Queue先進先出隊列),
SFQ(Stochastic Fairness Queueing隨機公平隊列), HTB(Hierarchy Token Bucket分層令牌桶)等.

每個隊列有不同的用途和屬性值:

1.pfifo_fast(先進先出隊列)


這個隊列有3個所謂的”頻道”.FIFO規則應用於每一個頻道.並且:如果在0頻道有數據包等待發送,1頻道的包就不會被處理,
1頻道和2頻道之間的關係也是如此.
pfifo_fast只起到調度的作用,對數據流量不進行控制.
pfifo_fast是系統默認的隊列類型,你可以使用ip命令來查看當前的網絡隊列設置:

# ip link list

1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0

 

2.令牌桶過濾器(TBF)

令牌桶過濾器(TBF)是一個簡單的隊列規定:按照事先設定的速率來處理數據包通過,但允許短暫突發流量
朝過設定的速率.
TBF很精確,對於網絡和處理器的影響都很小.TBF的實現在於一個緩衝器(桶),裏面是一些叫做”令牌”的數據.
它以特定的速率處理網絡數據包.桶最重要的參數就是它的大小,也就是它能夠存儲令牌數據的數量.
每個令牌從數據隊列中收集一個數據包,然後從桶中被刪除.這個算法關聯到兩個流上——令牌流和數據流,
於是我們得到3種情景:
數據流以等於令牌流的速率到達TBF.這種情況下,每個到來的數據包都能對應一個令牌,然後無延遲地通過隊列.
數據流以小於令牌流的速度到達TBF.通過隊列的數據包只消耗了一部分令牌,剩下的令牌會在桶裏積累下來,直到桶被裝滿.
剩下的令牌可以在需要以高於令牌流速率發送數據流的時候消耗掉,這種情況下會發生突發傳輸.
數據流以大於令牌流的速率到達TBF.這意味着桶裏的令牌很快就會被耗盡.導致TBF中斷一段時間,稱爲”越限”.
如果數據包持續到來,將發生丟包.
最後一種情景非常重要,因爲它可以用來對數據通過過濾器的速率進行整形.
令牌的積累可以導致越限的數據進行短時間的突發傳輸而不必丟包,但是持續越限的話會導致傳輸延遲直至丟包.
<TBF參數說明>

limit/latency
limit確定最多有多少數據(字節數)在隊列中等待可用令牌.你也可以通過設置latency參數來指定這個參數,
latency參數確定了一個包在TBF中等待傳輸的最長等待時間.後者計算決定桶的大小,速率和峯值速率.
這兩個參數是相互獨立的.

burst/buffer/maxburst
桶的大小,以字節計.這個參數指定了最多可以有多少個令牌能夠即刻被使用.通常,管理的帶寬越大,需要的緩衝器就越大.
在Intel體系上,10Mbit/s的速率需要至少10k字節的緩衝區才能達到期望的速率.
如果你的緩衝區太小,就會導致到達的令牌沒有地方放(桶滿了),這會導致潛在的丟包.

mpu
一個零長度的包並不是不耗費帶寬.比如以太網,數據幀不會小於64字節.Mpu(Minimum Packet Unit,最小分組單位)
決定了令牌的最低消耗.默認值是0.

rate
速度操縱桿.參見上面的limits!
如果希望設置峯值速率,使用下面的參數:

peakrate
令牌桶的最大的速率.

mtu/minburst
設置了peakrate後,爲了提高精確度,也要設置接口的MTU值.如果需要設置peakrate,而又允許突發的大數據傳輸
這個值可以設置的大一些.minburst設置爲3000字節,則可提供3Mbit/s的peakrate.
令牌桶過濾器適用於需要精確設置速率的網絡,它並不對數據包進行調度,只進行流量控制.

3. SFQ隨機公平隊列

SFQ(Stochastic Fairness Queueing,隨機公平隊列)是公平隊列算法家族中的一個簡單實現.它的沒有其它的方法那麼精確,
它在實現高度公平的同時,需要的計算量卻很少.SFQ的關鍵詞是”會話”(或稱作”流”) ,主要針對一個TCP會話或者UDP
流.流量被分成相當多數量的FIFO隊列中,每個隊列對應一個會話.數據按照簡單輪轉的方式發送, 每個會話都按順序得到發送
機會.
這種方式非常公平,保證了每一個會話都不會沒其它會話所淹沒.SFQ之所以被稱爲”隨機”,是因爲它並不是真的爲每一個會話
創建一個隊列,而是使用一個散列算法,把所有的會話映射到有限的幾個隊列中去.
因爲使用了散列,所以可能多個會話分配在同一個隊列裏,從而需要共享發包的機會,也就是共享帶寬.爲了不讓這種效應太明顯,
SFQ會頻繁地改變散列算法,以便把這種效應控制在幾秒鐘之內.
只有當你的出口網卡確實已經擠滿了的時候,SFQ纔會起作用!否則在你的Linux機器中根本就不會有隊列,SFQ也就不會起作用.
SFQ不會重新調整流量的速率,只是進行數據包的調度.

<SFQ參數說明>
perturb
多少秒後重新配置一次散列算法.如果取消設置,散列算法將永遠不會重新配置(不建議這樣做).10秒應該是一個合適的值.
quantum
一個流至少要傳輸多少字節後才切換到下一個隊列.卻省設置爲一個最大包的長度(MTU的大小).不要設置這個數值低於MTU!

四. tc配置實例

1.單一隊列的配置.

(1).在eth0上設置一個tbf(令牌桶過濾器)隊列, 網絡帶寬220kbit,延遲50ms,緩衝區爲1540個字節.

# tc qdisc add dev eth0 root tbf rate 200kbit latency 50ms burst 1540

查看eth0接口上的隊列設置

# ip link list
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc tbf qlen 1000
    link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0

# tc qdisc ls dev eth0 # 查看eth0上的隊列規則
qdisc tbf 8001: rate 200Kbit burst 1539b lat 48.8ms


此時,另一臺機器從這臺服務器上下載文件的速率則只有20K左右.
刪除此隊列規則

# 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: <LOOPBACK,UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc sfq qlen 1000
    link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: <NOARP> 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只進行調度,而不進行流量控制.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章