Linux

使用 tc 限制鏈路頻寬

  • July 29, 2019

我是新手網路工程師。

我正在嘗試理解 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但我無法理解。

你能給我一點提示嗎?

提示和故障排除。

  1. 您應該了解排隊、整形和監管之間的區別。
  2. 您應該了解入口和出口方向之間的區別。
  3. 檢查分類器 ( tc -p filter show dev <iface>)
  4. 檢查分類器統計資訊 ( tc -s -s -d f ls dev <iface>) - 故障排除的第一步。
  5. 檢查隊列規則統計資訊 (tc -s -s -d qdisc list dev <iface>tc -s -s -d c ls dev <iface>) - 故障排除的第二步。
  6. 使用估算器從 qdisc 的角度監控實際速率。您應該在 qdisc 附件中指定它。當核心模組載入了相應的選項(請參閱 參考資料)時,一些調度程序可以創建預設的估計器modinfo sch_htb
  7. 您已經指定了預設類1:12,但沒有定義它。
  8. 閱讀有關 HTB 的傳奇故事和配置範例。
  9. QoS 不是一件簡單的事情。
  10. 您還可以使用wireshark 擷取流量並對其進行分析。研究 tcp 連接的視窗大小變化以跟踪 shaper 的工作。但對於 UDP,這種方式不太適合。

引用自:https://serverfault.com/questions/977148