tc命令是linux自帶的流控工具,不僅可以控制發包的速度,還可以借助其中的netem工具模擬網絡故障,非常實用
tc的包iproute2-4.9.0 下載路徑wget https://mirrors.edge.kernel.org/pub/linux/utils/net/iproute2/iproute2-4.9.0.tar.xz
docker里無法使用的bug 可以參考 https://bugzilla.redhat.com/show_bug.cgi?id=1152231,解決方法就是升級tc版本,tc qdisc add 時加上direct_qlen參數
如何使用TC參考http://www.tldp.org/HOWTO/html_single/Traffic-Control-HOWTO/
man文件: http://man7.org/linux/man-pages/man8/tc-netem.8.html
比較詳細的用例參考: https://www.cs.unm.edu/~crandall/netsfall13/TCtutorial.pdf
tc的細節直接參考上文的鏈接,講的比較詳細,本文介紹下如何使用
場景:
故障注入的docker: 10.183.60.149
中控機:11.136.106.200
10.183.60.149上會模擬各種網絡故障,但是中控機到該docker的連接需要不受影響
登陸中控機:
ssh 10.183.60.149 (從宿主機進入docker,否則玩失敗就連不上了)
docker exec -it ddf110b6fca9 bash
DEVICE_NAME=eth0
# 根規則,direct_qlen 1000必須加,否則在docker的虛擬網絡跑不了
tc qdisc add dev ${DEVICE_NAME} root handle 1: htb default 1024 direct_qlen 1000
# 建立兩個類繼承root
tc class add dev ${DEVICE_NAME} parent 1:0 classid 1:1 htb rate 10000mbit
tc class add dev ${DEVICE_NAME} parent 1:0 classid 1:2 htb rate 10000mbit
#新版本的tc在filter設置完后,所有網絡都會斷,類似黑名單,需要加qdisc才能恢復, 所以先讓兩個通道都能跑
# 隊列采用公平的調度算法,保證網絡通暢,perturb參數是每隔10秒換一次hash,進一步保障平均
tc qdisc add dev ${DEVICE_NAME} parent 1:1 sfq perturb 10
tc qdisc add dev ${DEVICE_NAME} parent 1:2 sfq perturb 10
# 加過濾規則
#1.隊列1是和跳板機交互的網絡,需要保持通暢
tc filter add dev ${DEVICE_NAME} protocol ip parent 1: prio 10 u32 match ip dst 11.136.106.200/32 flowid 1:1
#2.其他所有主機走隊列2,實現網絡模擬
tc filter add dev ${DEVICE_NAME} protocol ip parent 1: prio 10 u32 match ip dst 0.0.0.0/0 flowid 1:2
#隊列2 開始網絡模擬
#該命令將${DEVICE_NAME}網卡的耗時隨機delay 100ms,延遲的尖刺在標准值的正負30ms, 最后的百分比數字是尖刺的相關系數
# 這邊用replace是因為之前已經用add加過規則了
tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem delay 100ms 30ms 25%
#該命令將 ${DEVICE_NAME} 網卡的傳輸設置為隨機丟掉10%的數據包, 成功率為50%
tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem loss 10% 50%
#該命令將 ${DEVICE_NAME} 網卡的傳輸設置為隨機產生10%的重復數據包。
tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem duplicate 10%
#該命令將 ${DEVICE_NAME} 網卡的傳輸設置為:有25%的數據包會被立即發送,其他的延遲10ms,相關性是10%,產生亂序
tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem delay 10ms reorder 25% 10%
#該命令將 ${DEVICE_NAME} 網卡的傳輸設置為隨機產生9%的損壞的數據包。
tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem corrupt 9%
#讓網絡恢復正常
tc qdisc replace dev ${DEVICE_NAME} parent 1:2 sfq perturb 10
# =================== 查看規則 ======================
tc filter show dev ${DEVICE_NAME}
tc class show dev ${DEVICE_NAME}
tc qdisc show dev ${DEVICE_NAME}
#====================== 清理 ======================
tc filter delete dev ${DEVICE_NAME} parent 1:0 protocol ip pref 10
tc qdisc del dev ${DEVICE_NAME} parent 1:2 netem
tc class del dev ${DEVICE_NAME} parent 1:0 classid 1:2
tc class del dev ${DEVICE_NAME} parent 1:0 classid 1:1
tc qdisc del dev ${DEVICE_NAME} root handle 1
tc還可以進行速度控制,可以參考上文的鏈接
