Linux
使用 tc 限制鏈路頻寬
我是新手網路工程師。
我正在嘗試理解 Linux 命令
tc
。我製作了一個簡單的網路,由兩台主機 H1、H2 和一個使用 Mininet 連接它們的交換機 S1 組成。
然後,我讓 H1 通過交換機 S1 向 H2 發送 UDP 數據包,使用
iPerf2
.#H1 iperf -s -p 1212 -f m -i 1 #H2 iperf -c 10.0.0.1 -p 1212 -t 10000 -f m -b 70M -u
為了限制連結頻寬,我在下面做了一個簡單的 bash 腳本。
#!/bin/bash #s1-eth1 is outgoing port from H1 to H2 #its orginal bandwidth 100Mbit/s sudo tc qdisc del dev s1-eth1 root sudo tc qdisc add dev s1-eth1 root handle 1:0 htb default 12 sudo tc qdisc add dev s1-eth1 parent 1:0 classid 1:1 htb rate 50Mbit sudo tc filter add deb s1-eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 1212 0xffff flowid 1:1
我預計 S1 的 rx 速率會變為 50Mbit/s,但事實並非如此。
它顯示大約 40Mbit/s。
當我更改此實驗的設置時,它顯示的值小於我使用
tc
命令設置的值。為什麼會這樣?我查看了 Linux 的核心程式碼,
tc
但我無法理解。你能給我一點提示嗎?
提示和故障排除。
- 您應該了解排隊、整形和監管之間的區別。
- 您應該了解入口和出口方向之間的區別。
- 檢查分類器 (
tc -p filter show dev <iface>
)- 檢查分類器統計資訊 (
tc -s -s -d f ls dev <iface>
) - 故障排除的第一步。- 檢查隊列規則統計資訊 (
tc -s -s -d qdisc list dev <iface>
和tc -s -s -d c ls dev <iface>
) - 故障排除的第二步。- 使用估算器從 qdisc 的角度監控實際速率。您應該在 qdisc 附件中指定它。當核心模組載入了相應的選項(請參閱 參考資料)時,一些調度程序可以創建預設的估計器
modinfo sch_htb
。- 您已經指定了預設類
1:12
,但沒有定義它。- 閱讀有關 HTB 的傳奇故事和配置範例。
- QoS 不是一件簡單的事情。
- 您還可以使用wireshark 擷取流量並對其進行分析。研究 tcp 連接的視窗大小變化以跟踪 shaper 的工作。但對於 UDP,這種方式不太適合。