1

显然 NETEM 使用 tfifo,它根据发送时间对数据包进行排队。这会导致抖动导致数据包重新排序。例如以下行将导致数据包重新排序*:

tc qdisc add dev eth0 root handle 1: netem delay 10ms 100ms

NETEM 手册建议如果您不想重新排序,则将内部队列规则 tfifo 替换为纯数据包 fifo (pfifo),并给出以下示例也添加大量抖动而不重新排序:

tc qdisc add dev eth0 root handle 1: netem delay 10ms 100ms
tc qdisc add dev eth0 parent 1:1 pfifo limit 1000

但它不起作用!数据包仍然会重新排序!(根据this看起来它依赖于内核)

那么,有谁知道如何在不重新排序数据包的情况下添加抖动?

4

2 回答 2

1

一个 hacky 选项是使用恒定延迟(无抖动)并有一个循环并更改循环中的延迟值。

假设您想要 50 毫秒的延迟和 5 毫秒的差异。您首先添加基本延迟:

tc qdisc add dev eth0 root handle 1: netem delay 50ms

并且可以有一个在 45ms 和 55ms 之间选择随机延迟的循环,并将延迟更改如下:

tc qdisc change dev eth0 root handle 1: netem delay 53ms

不过有两点要记住:

1-改变延迟需要一些滴答声。我发现循环中 0.1 秒的睡眠是合理的。所以这意味着你受到抖动频率的限制。

2-当您减少延迟时,新数据包以比已经在队列中的数据包更小的延迟(即更早的发送时间)排队,这可能导致重新排序!如果延迟显着减少,您可以通过几个步骤减少延迟来缓解这种情况。

于 2016-05-11T19:50:58.907 回答
0

就我而言(Linux 4.17),如果方差 > 均值,我会遇到相同的 ofo 问题。通过设置方差 < 均值,ofo 不再发生。当然你仍然需要使用 pfifo qdisc:

tc qdisc add dev ethBr2   root handle 1:0    netem delay 50ms 40ms 25%
tc qdisc add dev ethBr2   parent 1:1         pfifo limit 1000
于 2019-05-09T14:27:20.080 回答