再会,
我有以下情况:从一台机器到另一台机器的 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 内核,这样您就可以限制请求更多带宽的影响。