Linux tc htb + prio = 非常慢的链接

Linux tc htb + prio = 非常慢的链接

我正在尝试使用 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,这38次比我应该得到的速度(950 kbit/s)慢,即使链接未使用。

有趣的是,如果我删除 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

答案1

安迪·弗尼斯找到罪魁祸首当我问拉拉训练中心邮件列表。我没有提到的是,我正在对带标签的 VLAN 接口的流量进行整形。问题是,Linux 没有为 VLAN 接口设置队列(即txqueuelen0,而是倾向于使用物理接口队列。

因此,我的bfifoqdiscs 默认为 1514 字节队列(如输出所示tc qdisc ls),这太低了,从而造成了瓶颈。

解决方案是确保接口有自己的队列:

ifconfig dsl txqueuelen 20

bfifo然后默认使用 30 KB(txqueuelen * MTU)队列,这样就解决了问题。

相关内容