Linux

HTB“速率”參數限制可用頻寬

  • February 6, 2022

再會,

我有以下情況:從一台機器到另一台機器的 4 個 TCP 數據流。每個流都有自己的目標 TCP 埠。4 個流有不同的優先級:高、中、低、大容量。高、中、低產生 1.67Mbit/s,批量產生 10Mbit/s。(iperf3 用於生成流量)。每個流的數據包都標有適當的 DiffServ 標記 (DSCP),該標記用於 HTB qdisc 中的流量分類。

目標:HTB qdisc 應該以這樣的方式配置,即在任何時候高優先級流獲得所需的 1.67Mbit/s,中等優先級也保證 1.67Mbit/s,但優先級略低,其餘流量應保證 50kbit /秒。如果每個流空閒並且流生成的頻寬比最初指定的多,則每個流必須能夠使用整個鏈路。

流量的產生:

High priority:
iperf3 -c 192.168.88.254 -p 5150 -t 62 -b 1.67M -l 128 -S 224 
Medium priority:
iperf3 -c 192.168.88.254 -p 5160 -t 62 -b 1.67M -l 4K -S 160 
Low priority:
iperf3 -c 192.168.88.254 -p 5170 -t 62 -b 1.67M -l 4K -S 96 
Bulk:
iperf3 -c 192.168.88.254 -p 5180 -t 62 -b 10M -l 4K -S 0 

HTB qdisc的配置

NI="eth2"
AC="sudo /sbin/tc class add dev "

# Delete previous qdiscs
sudo /sbin/tc qdisc del dev $NI root

# Add HTB as root with default class 40 for uncategorized traffic
sudo /sbin/tc qdisc add dev $NI root handle 1: htb default 40
sudo /sbin/tc class add dev $NI parent 1: classid 1:1 htb rate 3.5mbit ceil 1000mbit

# high priority stream DSCP 224 - 1110 0000 - 0xE0
$AC $NI parent 1:1 classid 1:10 htb rate 1.7mbit ceil 1000mbit prio 1
# medium priority stream 
$AC $NI parent 1:1 classid 1:20 htb rate 1.7mbit ceil 1000mbit prio 2
# low priority stream
$AC $NI parent 1:1 classid 1:30 htb rate 50kbit ceil 1000mbit prio 3
# bulk stream
$AC $NI parent 1:1 classid 1:40 htb rate 50kbit ceil 1000mbit prio 4 

# Add filters to classify packets based on dscp mark

# high priority DSCP 224 - 1110 0000 - 0xE0
sudo /sbin/tc filter add dev $NI protocol ip parent 1: prio 1 u32 match ip tos 0xE0 0xff flowid 1:10
# medium priority DSCP 160 - 1010 0000 - 0xA0
sudo /sbin/tc filter add dev $NI protocol ip parent 1: prio 2 u32 match ip tos 0xA0 0xff flowid 1:20
# low priority DSCP 96 - 1100 0000 - 0x60
sudo /sbin/tc filter add dev $NI protocol ip parent 1: prio 3 u32 match ip tos 0x60 0xff flowid 1:30
# bulk DSCP 0 - 0000 0000 - 0x00
sudo /sbin/tc filter add dev $NI protocol ip parent 1: prio 4 u32 match ip tos 0x00 0xff flowid 1:40

流量分類正確。我可以看到 tc 類統計中的相關計數器在上升。我重新檢查了很多次。

問題: 此配置正確地將頻寬分配給高優先級和中等優先級流。Low prio 和 bulk 也獲得了 50kbit。**但是,**我無法通過連結超過根類1:1中指定的值作為速率,即 3.5mbit。

在我閱讀的每篇關於 HTB 的文章和手冊中都指出,“rate”參數是該類的最低保證速率,“ceil”是它可以獲得的最大數量。在我的情況下,“速率”似乎將連結限制在指定值。這絕對不是期望和預期的行為。

如果我將根類的“rate”參數設置為與“ceil”相同的值,即 1000mbit,則不會發生優先級,並且可用頻寬在所有流之間平均分配。這不是所需的行為,因為在可用頻寬波動的情況下,prio 流量將低於 1.67Mbit/s

我是否誤解了根類中“rate”參數的含義?這個問題是否與“量子”等其他 HTB 參數有關?我還觀察到,在數據傳輸過程中,每個類都有負數的令牌。這很糟糕嗎?如果是這樣,我應該調整哪些參數以及如何調整?

先感謝您!

ceil 參數在根類中沒有影響,您應該只設置速率 1。

如果您的目標是使子類的上限部分擴展,您可以使用 hfsc 代替 HTB,但即使您沒有足夠的頻寬,它也不會阻止要求最大速率。

如果您的目標是處理不穩定的網際網路連接,那麼它不會以這種方式工作,因為您限制了上傳部分,並且下載部分仍然不會被優先考慮。您可以搜尋 ifb 來限制下載頻寬。

在任何情況下,tc 都無法檢測到您的實際可用頻寬。不過,一定要使用 fq_codel,以獲得更好的隊列管理、用於 TCP 的 bbr 和最近的 Linux 核心,這樣您就可以限制請求更多頻寬的影響。

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