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 類別 (速度)本來是要多定義第二層葉類別,但目前來看,這個應用中就可以了.
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 98mbit ceil 100mbit prio 2 tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1mbit ceil 2mbit prio 2
注:以上就是我們控制輸出服務器的速度,一個為 98M,一個為 2M.
rate: 是一個類保證得到的帶寬值.如果有不只一個類,請保證所有子類總和是小於或等於父類.prio:用來指示借用帶寬時的競爭力,prio 越小,優先級越高,競爭力越強.
ceil: ceil 是一個類最大能得到的帶寬值.
同時為了不使一個會話永占帶寬,添加隨即公平隊列 sfq.
tc qdisc add dev eth0 parent 1:2 handle 2: sfq perturb 10 tc qdisc
add dev eth0 parent 1:3 handle 3: sfq perturb 10
3) 設定過濾器
過濾器可以使用本身的 u32 也可以使用 iptables 來打上標記
指定在 root 類 1:0 中,對 192..168.0.2 的過濾,使用 1:2 的規則,來給他 98M 的速度,寫法就如下
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.2 flowid 1:2 tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.1 flowid 1:3
如果是所有 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 的命令來做標記了
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:2 tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:3
iptables 只要打上記號就行了
iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j MARK --set- mark 10 iptables -t mangle -A POSTROUTING -d 192.168.0.3 -j MARK --set-mark 20
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 進行速度控制
tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev eth0 parent 1: classid 1:1 htb rate 30mbit ceil 60mbit tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.2 flowid 1:1
就可以限制 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
易寶支付有限公司
eth0 parent 1: classid 1:1 htb rate 50mbit ceil 1000mbit tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.0/24 flowid 1:1
就可以限制 192.168.111.0 到 255 的帶寬為 3000k 了,實際下載速度為 200k 左右。這種情況下,這個網段所有機器共享這 200k 的帶寬。
還可以加入一個 sfq(隨機公平隊列)
tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev eth0 parent 1: classid 1:1 htb rate 3000kbit burst 10k tc qdisc add dev eth0 parent 1:1 handle 10: sfq perturb 10 tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.168 flowid 1:1
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/32 flowid 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 # 默認讓所有的流量都從這個通過
轉自: http://blog.csdn.net/weiweicao0429/article/details/17578011