1 模拟延遲傳輸簡介
netem 與 tc: netem 是 Linux 2.6 及以上核心版本提供的一個網絡模拟功能子產品。該功能子產品可以用來在性能良好的區域網路中,模拟出複雜的網際網路傳輸性能,諸如低帶寬、傳輸延遲、丢包等等情況。使用 Linux 2.6 (或以上) 版本核心的很多發行版 Linux 都開啟了該核心功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系統中的一個工具,全名為 traffic control(流量控制)。tc 可以用來控制 netem 的工作模式,也就是說,如果想使用 netem ,需要至少兩個條件,一個是核心中的 netem 功能被包含,另一個是要有 tc 。
需要注意的是:本文介紹的流控隻能控制發包動作,不能控制收包動作,同時,它直接對實體接口生效,如果控制了實體的 eth0,那麼邏輯網卡(比如 eth0:1)也會受到影響,反之,如果您在邏輯網卡上做控制,該控制可能是無效的。(注:虛拟機中的多個網卡可以在虛拟機中視為多個實體網卡)。
# tc qdisc add dev eth0 root netem delay 100ms
該指令将 eth0 網卡的傳輸設定為延遲 100 毫秒發送。易寶支付有限公司
更真實的情況下,延遲值不會這麼精确,會有一定的波動,我們可以用下面的情況來模拟出
帶有波動性的延遲值:
# tc qdisc add dev eth0 root netem delay 100ms 10ms
該指令将 eth0 網卡的傳輸設定為延遲 100ms ± 10ms (90 ~ 110 ms 之間的任意值)發送。
# tc qdisc add dev eth0 root netem delay 100ms 10ms 30%
該指令将 eth0 網卡的傳輸設定為 100ms ,同時,大約有 30% 的包會延遲 ± 10ms 發送。示例:現在 ping 一下 216 機器:
易寶支付有限公司
3 模拟網絡丢包:
# tc qdisc add dev eth0 root netem loss 1%
該指令将 eth0 網卡的傳輸設定為随機丢掉 1% 的資料包。示例:在 216 上執行
#tc qdisc add dev eth0 root netem loss 10%
顯示 16 個包隻有 13 個收到了。也可以設定丢包的成功率:
# tc qdisc add dev eth0 root netem loss 1% 30%
該指令将 eth0 網卡的傳輸設定為随機丢掉 1% 的資料包,成功率為 30% 。
4.删除網卡上面的相關配置:将之前指令中的 add 改為 del 即可删除配置:
# tc qdisc del dev eth0 XXXXXXXXXXX(自己加的配置)該指令将 删除 eth0 網卡的相關傳輸配置
至此,我們已經可以通過 TC 在測試環境中模拟一定的網絡延時和丢包的情況。下面是關于tc 更多的應用和介紹
5 模拟包重複:
# tc qdisc add dev eth0 root netem duplicate 1%
該指令将 eth0 網卡的傳輸設定為随機産生 1% 的重複資料包 。6 模拟資料包損壞:
# tc qdisc add dev eth0 root netem corrupt 0.2%
該指令将 eth0 網卡的傳輸設定為随機産生 0.2% 的損壞的資料包 。 (核心版本需在 2.6.16 以上)
7 模拟資料包亂序:
# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
該指令将 eth0 網卡的傳輸設定為:有 25% 的資料包(50%相關)會被立即發送,其他的延遲10 秒。
新版本中,如下指令也會在一定程度上打亂發包的次序:# tc qdisc add dev eth0 root netem delay 100ms 10ms
8 檢視已經配置的網絡條件:# tc qdisc show dev eth0
該指令将 檢視并顯示 eth0 網卡的相關傳輸配置9 附錄:TC 流量控制
TC 是一個流量控制的工具,下面轉了一篇關于 TC 流量控制的文章。TC 介紹
在 linux 中,TC 有二種控制方法 CBQ 和 HTB.HTB 是設計用來替換 CBQ 的。它是一個層次式的過濾架構.
TC 包括三個基本的構成塊:
隊列規定 qdisc(queueing discipline )、類(class)和分類器(Classifiers)
TC 中的隊列(queueing discipline):
用來實作控制網絡的收發速度.通過隊列,linux 可以将網絡資料包緩存起來,然後根據使用者的
設定,在盡量不中斷連接配接(如 TCP)的前提下來平滑網絡流量.需要注意的是,linux 對接收隊列的控制不夠好,是以我們一般隻用發送隊列,即“控發不控收”.它封裝了其他兩個主要 TC 元件(類和分類器)。核心如果需要通過某個網絡接口發送資料包,它都需要按照為這個接口配置的 qdisc(排隊規則)把資料包加入隊列。然後,核心會 盡可能多地從 qdisc 裡面取出資料包,把它們交給網絡擴充卡驅動子產品。
最簡單的 QDisc 是 pfifo 它不對進入的資料包做任何的處理,資料包采用先入先出的方式通過隊列。不過,它會儲存網絡接口一時無法處理的資料包。
隊列規則包括 FIFO(先進先出),RED(随機早期探測),SFQ(随機公平隊列)和令牌桶(Token Bucket),類基隊列(CBQ),CBQ 是一種超級隊列,即它能夠包含其它隊列(甚至其它 CBQ)。
TC 中的 Class 類
class 用來表示控制政策.很顯然,很多時候,我們很可能要對不同的 IP 實行不同的流量控制政策,這時候我們就得用不同的 class 來表示不同的控制政策了.
TC 中的 Filter 規則
filter 用來将使用者劃入到具體的控制政策中(即不同的 class 中).比如,現在,我們想對 xxa,xxb兩個 IP 實行不同的控制政策(A,B),這時,我們可用 filter 将 xxa 劃入到控制政策 A,将 xxb 劃入到控制政策 B,filter 劃分的标志位可用 u32 打标功能或 IPtables的 set-mark (大多使用iptables 來做标記)功能來實作。
目前,TC 可以使用的過濾器有:fwmark 分類器,u32 分類器,基于路由的分類器和 RSVP分類器(分别用于 IPV6、IPV4)等;其中,fwmark分類器允許我們使用 Linux netfilter 代碼選擇流量,而 u32 分類器允許我們選擇基于 ANY 頭的流量 .需要注意的是,filter (過濾器)是在 QDisc 内部,它們不能作為主體。
TC 的應用流程
資料包->iptables(在通過 iptables 時,iptables 根據不同的 ip 來設定不同的 mark)->TC(class)-
>TC(queue)
應用
假設 eth0 位是伺服器的外網網絡接口。開始之前,先要清除 eth0 所有隊列規則
tc qdisc del dev eth0 root 2> /dev/null > /dev/null1) 定義最頂層(根)隊列規則,并指定 default 類别編号
tc qdisc add dev eth0 root handle 1: htb default 2易寶支付有限公司
2) 定義第一層的 1:1 類别 (速度)本來是要多定義第二層葉類别,但目前來看,這個應用中就可以了.
注:以上就是我們控制輸出伺服器的速度,一個為 98M,一個為 2M.
rate: 是一個類保證得到的帶寬值.如果有不隻一個類,請保證所有子類總和是小于或等于父類.prio:用來訓示借用帶寬時的競争力,prio 越小,優先級越高,競争力越強.
ceil: ceil 是一個類最大能得到的帶寬值.
同時為了不使一個會話永占帶寬,添加随即公平隊列 sfq.
tc qdisc add dev eth0 parent 1:2 handle 2: sfq perturb 10 tc qdisc
3) 設定過濾器
過濾器可以使用本身的 u32 也可以使用 iptables 來打上标記
指定在 root 類 1:0 中,對 192..168.0.2 的過濾,使用 1:2 的規則,來給他 98M 的速度,寫法就如下
如果是所有 ip 寫法就如
tc filter add dev eth0 protocol ip parent 1: prio 50 u32 match ip
dst 0.0.0.0/0 flowid 1:10使用 Iptables 來配合過濾器
還可以使用這個方法,但需要借助下面的 iptables 的指令來做标記了
iptables 隻要打上記号就行了
TC 對最對高速度的控制
Rate ceiling 速率限度
參數 ceil 指定了一個類可以用的最大帶寬, 用來限制類可以借用多少帶寬.預設的 ceil 是和速率一樣
這個特性對于 ISP 是很有用的, 因為他們一般限制被服務的使用者的總量即使其他使用者沒有請求服務.(ISPS 很想使用者付更多的錢得到更好的服務) ,注根類是不允許被借用的, 是以沒有指定 ceil
注: ceil 的數值應該至少和它所在的類的速率一樣高, 也就是說 ceil 應該至少和它的任何一個子類一樣高
Burst 突發
網絡硬體隻能在一個時間發送一個包這僅僅取決于一個硬體的速率. 鍊路共享軟體可以利用這個能力動态産生多個連接配接運作在不同的速度. 是以速率和 ceil 不是一個即時度量隻是一個在一個時間裡發送包的平均值. 實際的情況是怎樣使一個流量很小的類在某個時間類以最大的速率提供給其他類. burst 和 cburst 參數控制多少資料可以以硬體最大的速度不費力的發送給需要的其他類.
如果 cburst 小于一個理論上的資料包他形成的突發不會超過 ceil 速率, 同樣的方法 TBF 的最高速率也是這樣.
你可能會問, 為什麼需要 bursts . 因為它可以很容易的提高向應速度在一個很擁擠的鍊路上.比如 WWW 流量是突發的. 你通路首頁.突發的獲得并閱讀. 在空閑的時間 burst 将再"charge"一次.
注: burst 和 cburst 至少要和其子類的值一樣大.
TC 指令格式:
加入
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 specificparameters ]
tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priorityfiltertype [ 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
檢視 TC 的狀态
tc -s -d qdisc show dev eth0tc -s -d class show dev eth0
删除tc規則
tc qdisc del dev eth0 root
執行個體
使用 TC 下載下傳限制單個 IP 進行速度控制
就可以限制 192.168.1.2 的下載下傳速度為 30Mbit 最高可以 60Mbit ,其中 r2q,是指沒有 default 的root,使整個網絡的帶寬沒有限制
使用 TC 對整段 IP 進行速度控制
tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev
就可以限制 192.168.111.0 到 255 的帶寬為 3000k 了,實際下載下傳速度為 200k 左右。這種情況下,這個網段所有機器共享這 200k 的帶寬。
還可以加入一個 sfq(随機公平隊列)
sfq,他可以防止一個段内的一個 ip 占用整個帶寬。使用 TC 控制伺服器對外的速度為 10M
如下,我要管理一台伺服器,隻能向外發 10M 的資料
tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1:htb tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbitceil 100mbit tc class add dev eth0 parent 1:1 classid 1:10 htbrate 10mbit ceil 10mbit tc qdisc add dev eth0 parent 1:10 sfqperturb 10 tc filter add dev eth0 protocol ip parent 1: prio 2u32 match ip dst 220.181.xxx.xx/32flowid 1:1 # 上面這台,讓220.181.xxx.xx/32 這台跑預設的,主要是為了讓這個 ip 連接配接進來不被控制 tcfilter add dev eth0 protocol ip parent 1: prio 50 u32 match ip dst0.0.0.0/0 flowid 1:10 # 預設讓所有的流量都從這個通過
本文轉自灬落魄灬 51CTO部落格,原文連結:http://blog.51cto.com/smoke520/1844034,如需轉載請自行聯系原作者