Как эмулировать дрожание без переупорядочивания пакетов, используя TC и NETEM?

По-видимому, 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

Но это не работает! Пакеты все еще переупорядочиваются! (и похоже, что это зависит от ядра в соответствии с этим)

Итак, кто-нибудь знает, как добавить дрожание без переупорядочивания пакетов?

1 ответ

  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 s в петле разумно. Таким образом, это означает, что ваш ограничен частотой дрожания.

    2-при уменьшении задержки новые пакеты попадают в очередь с меньшей задержкой (т. е. раньше времени отправки), чем пакеты, уже находящиеся в очереди, что может привести к переупорядочиванию! Вы можете уменьшить это, уменьшив задержку в несколько шагов, если уменьшение значительно.