Linux 下TC 以及netem队列的使用
一:綜述:
linux系統中的流量控制器(TC)主要是在輸出端口處建立一個隊列進行流量控制。
TC是一個可以根據數據包的任何一個部分的特征對其進行分類的工具,并且可以為各類數據提供不同帶寬,從而控制他們的傳輸速度。TC是iproute2的一部分,集成在2.2.及以上版本的內核中,還可以與linux內核里的各種架構(如Netfilter netem)協同工作。
二:TC的組件
TC主要由隊列規定(qdisc),類(class)和過濾器(filter)這3個組件組成,繪圖中一般用圓形表示隊列規定,用矩形表示類:
1:qdisc:TC的核心組件,也被稱為隊列,是管理網卡輸入,輸出數據的一個算法,用于確定數據包的發送方式。
隊列規定可分為兩類:
(1) 不分類的qdisc:內部不包含可配置的子類,對進入隊列的數據包不進行區分對待,而只是對數據包進行重新編排,延遲發送或者丟棄,主要有:pfifo-fast.TBF.SFQ等
(2) 分類隊列規定:內部可包含一個或多個子類,使用過濾器對數據包進行分類,然后交給相應的子類處理,分類隊列規定有CBQ,HTB等
2:類:
就是數據的類別,各種數據通過過濾器進行分類,最后被放入類的隊列規定里面進行排隊。
如果一個類沒有子類,那么這個類被稱為葉子類,否則就被成為內部類。1:1和1:12是內部類,其他均為葉子類,葉子類有一個負責為這個類發送數據的隊列規定,而且這個qdisc可以是分類的,如1:10有一個分類的隊列規定。TC中通常把類的隊列規定稱為葉子qdisc(只有葉子類才有隊列規定)
3:過濾器
就是一些規則,根據這些規則對數據包進行分類,過濾器可以屬于隊列規定,也可以屬于內部類,若需要在葉子類上再實現分類,那就必須將過濾器與葉子類的分類隊列規定關聯起來,而不能與葉子類相關聯。
最常用的是U32過濾器,由一個過濾器和一個動作組成,選擇器用來對數據包進行匹配,一旦匹配成功就執行該動作。
三:TC的結構
都是以一個根qdisc開始的,若根qdisc是不分類的隊列規定,那它就沒有子類,因此不可能包含其他的子對象,也不會有過濾器與之關聯,發送數據時,數據包進入這個隊列里面排隊,然后根據該隊列規定的處理方式將數據包發送出去。
分類的qdisc內部包含一個或多個類,而每個類可以包含一個隊列規定或者包含若干個子類,這些子類友可以包含分類或者不分類的隊列規定,如此遞歸,形成了一個樹。
句柄號:qdisc和類都使用一個句柄進行標識,且在一棵樹中必須是唯一的,每個句柄由主號碼和次號碼組成qdisc的次號碼必須為0(0通常可以省略不寫)
根qdisc的句柄為1:,也就是1:0。類的句柄的主號碼與它的父輩相同(父類或者父qdisc),如類1:1的主號碼與包含他的隊列規定1:的主號碼相同,1:10和1:11與他們的父類1:1的主號碼相同,也為1。
新建一個類時,默認帶有一個pfifo_fast類型的不分類隊列規定,當添加一個子類時,這個類型的qdisc就會被刪除,所以,非葉子類是沒有隊列規定的,數據包最后只能到葉子類的隊列規定里面排隊。
若一個類有子類,那么允許這些子類競爭父類的帶寬,但是,以隊列規定為父輩的類之間是不允許相互競爭帶寬的。
四:TC的工作原理:
對互聯網而言,一切都是數據包,操控網絡實際上是在操控數據包,操控它如何產生,路由,傳輸,分片等等。TC在數據包離開系統的時候進行控制,在IP層與網卡之間做手腳,實際上,負責將數據包傳遞到物理層的正是TC模塊,這意味著在系統內核中,TC作為數據包的調度者是一直運作的,甚至在你不想用他的時候,一般情況下,TC維持 一個先進先出的數據隊列。
數據包入隊的時候首先調用根隊列規定的過濾器,根據過濾器定義的規則將數據包交給某個類,如果該類不是葉子類,將會調用該類定義的過濾器進一步分類,若該類沒有定義過濾器,就會交給包含他的隊列規定的默認類來處理,若接收到數據包的類是葉子類,數據包將進入到葉子類的隊列規定里面排隊,需要注意的是:過濾器只能將數據包交給某個類,類再將數據包放入自己的隊列規定進行排隊,而不能直接交給某個隊列規定。
接受包從數據接口進來后,經過流量限制,丟棄不合規定的數據包,然后輸入多路分配器判斷:若接受包的目的地是本主機,那么將該包送給上冊處理,否則需轉發,將接受包交到轉發塊處理。轉發塊同時也接收本主機上層產生的包。轉發塊通過查看路由表,決定所處理包的下一跳,然后對包排序以便將他們傳送到輸出接口。
Linux的TC主要是在輸出接口排列時進行處理和實現的。
五:TC命令
1:add命令:在一個節點里加入一個qdisc,類或者過濾器。添加時,需要傳遞一個祖先作為參數,傳遞參數時既可以使用ID也可以直接傳遞設備的根,若建一個qdisc或者filter,可以使用句柄來命名,若建一個類,使用類識別符來命名。
2:remove:刪除由某個句柄指定的qdisc,根qdisc也可以被刪除,被刪除的qdisc上的所有子類以及附屬于各個類的過濾器都會被自動刪除。
3:change:以替代方式修改某些項目,句柄和祖先不能修改,change和add語法相同。
4:replace:對一個現有節點進行近于原子操作的刪除/添加,如果節點不存在,這個命令就會建立節點。
5:link:只適用于qdisc,替代一個現有的節點
tc qdisc [add|change|replace|link] dev DEV [parent qdisc-id |root] [handle qdisc-id ] qdisc [qdisc specific parameters]
tc class [add|change|replace] dev DEV parent qdisc-id [classid class-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
六:TBF隊列:(令牌桶隊列)
tc qdisc add tbf limit BYTES burst BYTES rate KBPS [mtu BYTES] [peakrate KBPS] [latency TIME] [overhead BYTES] [linklayer TYPE]
rate是第一個令牌桶的填充速率
peakrate是第二個令牌桶的填充速率
peakrate>rate
burst是第一個令牌桶的大小
mtu是第二個令牌桶的大小
burst>mtu
若令牌桶中令牌不夠,數據包就需要等待一定時間,這個時間由latency參數控制,如果等待時間超過latency,那么這個包就會被丟棄
limit參數是設置最多允許多少數據可以在隊列中等待
latency=max((limit-burst)/rate,(limit-mtu)/peakrate);
?
burst應該大于mtu和rate
overhead表示ADSL網絡對數據包的封裝開銷
linklayer指定了鏈路的類型,可以是以太網或者ATM或ADSL
ATM和ADSL報頭開銷均為5個字節。
七:netem模塊
netem提供網絡方針的功能,可以方針廣域網的可變時延,丟包,數據包副本和重排序等性質。
netem被包含在內核中的iproute2中,netem模塊被TC控制調用。
netem包含兩部分:
(1) qdisc的內核模塊:被整合到內核中
(2) 配置該模塊的命令行功能:iproute2的一部分
兩者通過netlink套接字練習,命令行將其請求編成一種格式,而內核進行解碼。
1:模擬時延:
例:#tc qdisc add dev eth0 root netem delay 100ms
所有經過eth設備輸出的數據包均延遲100ms
#tc qdisc change dev eth0 root netem delay 100ms 10ms
表示延遲具有隨機性,延時范圍是100+_10ms
#tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
表示延時范圍是:100+_10ms*25%
2:延時的分布:
在實際網絡中,延時并不是均勻分布的,更像正態分布
#tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
注意:分配(如normal,pareto,paretonormal)是iproute2編譯出放在/usr/lib/tc下的,所以可以編譯出自己的分布
3:丟包
可設置的最小丟包率為 232=0.000 000 0232%
#tc qdisc change dev eth0 root netem loss 0.1%
表示0.1%的隨機性丟包
#tc qdisc change dev eth0 root netem loss 0.3% 25%
引起0.3%的丟包率
25%指的是相關性,相關性可以用來模擬突發造成的丟包
4:數據包副本
#tc qdisc change dev eth0 root netem duplicate 1%
5:數據包沖突錯誤:
實際網絡中的隨即噪聲會導致包出錯,可以用corrupt option模塊模擬
#tc qdisc change dev eth0 root netem corrupt 0.1%
會引起0.1%的出錯
6:數據包重排序
#tc qdisc change dev eth0 root netem gap 5 delay 10ms
只有5的倍數的數據包不被延遲,其他均延遲10ms
#tc qdisc change dev eth0 root netem delay 10ms recorder 25% 50%
25%的數據包被立即發送,其他包被延遲10ms
這里50%指的是25%的數據包具有的相關性
另外隨機延遲的不同也會導致重排序
在構造丟包時,線性相關系數用來設定丟包的分布情況,若為0,表示丟包隨機:從0-1,表示丟包的分布趨于集中。比如設定丟包率為10%,線性相關系數為1,則表示每100個數據包丟10個,但是這十個包非常集中(有可能20個連續包就丟了10個),需要特別說明的是,實際的丟包效果絕不是一個精確的數字,更多的是一個統計數。
轉載于:https://blog.51cto.com/professor/1570778
總結
以上是生活随笔為你收集整理的Linux 下TC 以及netem队列的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《狂飙》中风靡全国的“小灵通” 为何突然
- 下一篇: 搜狐 2022 年全年营收 7.34 亿