使用 tc netem 进行动态延迟变化会导致丢包

使用 tc netem 进行动态延迟变化会导致丢包

我正在尝试使用 tc netem 模拟 [0, 1500ms] 范围内短暂的 [0.5, 1.5] 秒延迟增加。

这是通过以下命令完成的:

sudo tc qdisc add dev enp37s0 root netem delay 200ms

超时后,通过删除 qdisc 重置延迟

sudo tc qdisc del dev enp37s0 root

或者将延迟更改为 0ms。

sudo tc qdisc add dev enp37s0 root netem delay 0ms

如果延迟超过 200 毫秒,重置步骤将导致数据包被丢弃。我假设这是由于某些内部缓冲区或队列溢出造成的?

例如,如果延迟为 1500 毫秒,则很大比例的数据包会以 1Mbps 的速率连续丢失,数据包大小为 80 字节。

有什么办法可以防止这种情况发生吗?

我什至不确定 netem 是否是执行此操作的正确工具,并且希望得到任何建议。

如果有帮助的话,我正在使用 iperf 来测量数据包丢失:

iperf3 -c <host> -t 1200 -u -l 80

答案1

您正在使用 UDP 来测试速度 (-u)。 UDP 是无连接的并且没有拥塞控制,因此它不会像 TCP 那样缩小到可用带宽。

所以 iperf 总是生成UDP数据报从一开始就以恒定速率(默认 1 Mbit/秒)。

然后数据报由流量控制子系统排队以应用队列规则 - qdisc。

显然,为了限制流量速率,tc 控制出队速率以匹配所需的带宽/延迟。

在最简单的情况下,当排队速率 > 出队速率时,由于队列已满,多余的数据报会在队列之前被丢弃。

       1Mb/s    0.1Mb/s
 process -> queue -> interface

此行为是预期行为,并不意味着出现问题。

尝试 TCP。

相关内容