使用 HTB 和 CQB 进行 tc 流量整形会导致数据包传输间隙不一致

使用 HTB 和 CQB 进行 tc 流量整形会导致数据包传输间隙不一致

如果这是重复的,我很抱歉https://serverfault.com/q/1076769/822163。我首先创建了它,然后意识到 Linux 和 Unix 堆栈交换是正确的地方。问题:当使用 tc HTB 或 CQB 进行流量整形时,在一段时间间隔后发送的前两个数据包将被背靠背发送,如 pcap 日志中记录的那样。我有一台启用了网络转发的 ubuntu 18.4 中级计算机。我使用 HTB 运行 tc 来调整流量,以便在出口端口上具有恒定的比特率输出。客户端向服务器请求可变大小的块。服务器将块传输编码数据发送到客户端,每个块之间的间隔为 200ms。在我的设置具有中间计算机的情况下,这些数据包通过中间计算机上的流量整形器传递以获得 500kbps 的固定比特率。当我禁用卸载(TSO 和 GRO)时,每个 n 字节都会被 pcap 分成帧。大多数 1448B 数据包的时间间隙接近 24.224ms,预计在 500kbps 时

问题:虽然帧按顺序到达,但它们到达的时间间隔不一致。 200 毫秒间隙后的第二个大数据包 (1448B) 总是几乎与第一个数据包背靠背。块中的最后一个数据包 (654B) 有延迟到达(24.224 毫秒,而不是附图中示例中的 10.464 毫秒)时间的屏幕截图 数据包之间的时间间隔。

带 HTB 的 TC 命令:

tc qdisc del dev eno1 root 2> /dev/null > /dev/null
tc qdisc add dev eno1 root handle 1:0 htb default 2
tc class add dev eno1 parent 1:1 classid 1:2 htb rate 500kbit ceil 500kbit burst 10 cburst 10 prio 2
tc filter add dev eno1 protocol ip parent 1:0 u32 match ip dst 192.168.2.103 flowid 1:2

如果我在计算中没有犯任何错误,我认为问题可能是由于我用于流量整形的 tc 中的令牌处理造成的。我认为令牌是在空闲时间内累积的,当收到下一个数据包时,它会连续发送两个数据包。从第三个数据包开始,令牌消耗率稳定下来。如果发生这种情况,我想知道是否有办法避免将累积的令牌用于块中的第二个数据包。

我尝试了 tc 命令中的各种选项,我还尝试使用下面的 CQB - 命令参考:https://lartc.org/lartc.html#AEN2233

观察结果:减少突发 = 10 会稍微增加第一个和第二个数据包之间的间隙。 tc 与 CQB:

tc qdisc del dev eno1 root 2> /dev/null > /dev/null
tc qdisc add dev eno1 root handle 1: cbq avpkt 5000 bandwidth 10mbit
tc class add dev eno1 parent 1: classid 1:1 cbq rate 500kbit allot 5000 prio 5 bounded isolated
tc class add dev eno1 parent 1:1 classid 1:10 cbq rate 500kbit allot 5000 prio 1 avpkt 5000 bounded
tc class add dev eno1 parent 1:1 classid 1:20 cbq rate 500kbit allot 5000 avpkt 5000 prio 2
tc filter add dev eno1 protocol ip parent 1:0 u32 match ip dst 192.168.2.103 flowid 1:10
tc filter add dev eno1 parent 1: protocol ip prio 13 u32 match ip dst 0.0.0.0/0 flowid 1:20

进一步:根据建议http://linux-ip.net/articles/hfsc.en/我尝试过 HFSC(参考)。我需要 HFSC 方面的帮助。这是我使用的脚本

tc qdisc del dev eno1 root 2> /dev/null > /dev/null
tc qdisc add dev eno1 root handle 1: hfsc
tc class add dev eno1 parent 1: classid 1:1 hfsc sc rate 1000kbit ul rate 1000kbit
tc class add dev eno1 parent 1:1 classid 1:10 hfsc sc rate 1000kbit ul rate 1000kbit
tc class add dev eno1 parent 1:1 classid 1:20 hfsc sc rate 10000kbit ul rate 10000kbit
tc class add dev eno1 parent 1:10 classid 1:11 hfsc sc umax 1480b dmax 53ms rate 400kbit ul rate 1000kbit
tc class add dev eno1 parent 1:10 classid 1:12 hfsc sc umax 1480b dmax 30ms rate 100kbit ul rate 1000kbit
tc filter add dev eno1 protocol ip parent 1:0 u32 match ip dst 192.168.2.103 flowid 1:11

我的输出

tc class show eno1

输出:

class hfsc 1:11 parent 1:10 sc m1 0bit d 23.4ms m2 400Kbit ul m1 0bit d 0us m2 1Mbit 
class hfsc 1: root 
class hfsc 1:1 parent 1: sc m1 0bit d 0us m2 1Mbit ul m1 0bit d 0us m2 1Mbit 
class hfsc 1:10 parent 1:1 sc m1 0bit d 0us m2 1Mbit ul m1 0bit d 0us m2 1Mbit 
class hfsc 1:20 parent 1:1 sc m1 0bit d 0us m2 10Mbit ul m1 0bit d 0us m2 10Mbit 
class hfsc 1:12 parent 1:10 sc m1 394672bit d 30.0ms m2 100Kbit ul m1 0bit d 0us m2 1Mbit

我不确定这是什么意思

ul m1 0bit d 0us

在我的 tc 命令中我有

sc umax 1480b dmax 53ms

运行此脚本后,我尝试 ping 192.168.1.102。我收到的 ping 响应很少,然后是 ARP

谁有 192.168.2.100

192.168.2.100 是我运行 tc 的 ip 转发端口的 ip 地址。

该命令大部分是从http://linux-ip.net/articles/hfsc.en/ 我刚刚添加了路线

tc 过滤器添加 dev eno1 协议 ip 父级 1:0 u32 匹配 ip dst 192.168.2.103 flowid 1:11

如果有人可以帮助解决 umax 和 dmax 问题,那就太好了。

相关内容