Linux

Linux tc htb + prio = 非常慢的連結

  • June 2, 2012

我正在嘗試使用 Linux (3.2) tc、HTB 和 PRIO 來調整流出我的 DSL 連結(已驗證的 1 mbit 上傳)的流量。我的 Linux 機器通過千兆乙太網鏈路連接到 ADSL 調製解調器。我想使用 HTB 限制上傳速率,以便我的數據包在 Linux 機器而不是調製解調器上排隊,然後使用 PRIO 將數據包放入優先級帶。

所以,我這樣做了:

tc qdisc add dev dsl root handle 1: htb default 1
tc class add dev dsl parent 1: classid 1:1 htb rate 950kbit
tc qdisc add dev dsl parent 1:1 handle 2: prio bands 6
tc qdisc add dev dsl parent 2:1 bfifo
tc qdisc add dev dsl parent 2:2 bfifo
tc qdisc add dev dsl parent 2:3 bfifo
tc qdisc add dev dsl parent 2:4 bfifo
tc qdisc add dev dsl parent 2:5 bfifo
tc qdisc add dev dsl parent 2:6 bfifo

問題是,一旦我這樣做,我的上傳連結就會非常緩慢地變慢。我得到大約。25 kbit/s,比我應該得到的 (950 kbit/s) 慢38 倍,即使連結未使用。

有趣的是,如果我刪除 PRIO qdisc 但保留 HTB qdisc,那麼吞吐量會上升到大約。550 kbit/s,這更好,但仍然不是我應該得到的。同樣,該連結未使用,因此優先級不考慮此行為。

知道我在做什麼有什麼問題嗎?多年來,我一直在使用完全相同的命令將乙太網鏈路調整為 50 mbit/s,沒有任何問題,所以我真的不知道為什麼它在這種情況下不起作用。

附加資訊:

# tc -s -d qdisc ls dev dsl
qdisc htb 1: root refcnt 2 r2q 10 default 1 direct_packets_stat 0 ver 3.17
Sent 447262 bytes 1168 pkt (dropped 90, overlimits 38 requeues 0)
backlog 0b 0p requeues 0
qdisc prio 2: parent 1:1 bands 6 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 447262 bytes 1168 pkt (dropped 90, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc bfifo 8043: parent 2:1 limit 1514b
Sent 84138 bytes 928 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc bfifo 8044: parent 2:2 limit 1514b
Sent 363124 bytes 240 pkt (dropped 90, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc bfifo 8045: parent 2:3 limit 1514b
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc bfifo 8046: parent 2:4 limit 1514b
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc bfifo 8047: parent 2:5 limit 1514b
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc bfifo 8048: parent 2:6 limit 1514b
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0

# tc -s -d class show dev dsl
class htb 1:1 root leaf 2: prio 0 quantum 11875 rate 950000bit ceil 950000bit burst 1599b/8 mpu 0b overhead 0b cburst 1599b/8 mpu 0b overhead 0b level 0
Sent 478804 bytes 1316 pkt (dropped 90, overlimits 0 requeues 0)
rate 42232bit 17pps backlog 0b 0p requeues 0
lended: 1316 borrowed: 0 giants: 0
tokens: 195781 ctokens: 195781
class prio 2:1 parent 2: leaf 8043:
Sent 97560 bytes 1064 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
class prio 2:2 parent 2: leaf 8044:
Sent 381244 bytes 252 pkt (dropped 90, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
class prio 2:3 parent 2: leaf 8045:
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
class prio 2:4 parent 2: leaf 8046:
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
class prio 2:5 parent 2: leaf 8047:
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
class prio 2:6 parent 2: leaf 8048:
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0

當我在LARTC郵件列表中詢問時, Andy Furniss找到了罪魁禍首。我沒有提到的是我正在從一個標記的 VLAN 介面中調整流量。問題是,Linux 沒有為 VLAN 介面(即is )設置隊列,而是更喜歡使用物理介面隊列。txqueuelen``0

因此,我的bfifoqdisc 預設為 1514 字節隊列(如tc qdisc ls輸出所示),這太低了,從而造成了瓶頸。

解決方案是確保介面有自己的隊列:

ifconfig dsl txqueuelen 20

bfifo然後預設為 30 KB ( txqueuelen * MTU) 隊列,這樣就解決了問題。

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