我正在尝试使用Linux(3.2)tc,HTB和PRIO来调整DSL链接(通过validation的1 mbit上传)的stream量。 我的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千比特/秒,这是更好,但仍然不是我应该得到的。 同样,这个链接没有被使用,所以优先级没有考虑到这种行为。
任何想法我在做什么错了? 多年来,我一直使用完全相同的命令来将以太网链路的速度设置为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 发现了罪魁祸首 。 我没有提到的是,我正在将stream量从标记的VLAN接口中分离出来。 问题是,Linux不为VLAN接口设置队列(即txqueuelen为0 ),而是倾向于使用物理接口队列。
因此,我的bfifo qdisc默认为1514字节的队列(如tc qdisc ls输出中所示),这太低了,从而造成瓶颈。
解决scheme是确保接口有自己的队列:
ifconfig dsl txqueuelen 20
bfifo默认为txqueuelen * MTU ( txqueuelen * MTU )队列,解决了这个问题。