Проблема: когда tc HTB или CQB используются для формирования трафика, первые два пакета, которые отправляются после некоторого промежутка времени, отправляются друг за другом, как записано в журнале pcap.
У меня есть промежуточный компьютер с Ubuntu 18.4 с включенной переадресацией по сети. Я запускаю tc с HTB, чтобы формировать трафик, чтобы иметь постоянный битрейт на выходном порту.
Клиент запрашивает фрагменты с переменными размерами с сервера. Сервер отправляет закодированные данные передачи фрагмента с промежутком 200 мс между каждым фрагментом клиенту. В моей установке с промежуточным компьютером эти пакеты проходят через формирователь трафика на промежуточном компьютере для получения фиксированной скорости передачи 500 кбит/с.
Поскольку я отключаю разгрузку (TSO и GRO), каждые n байтов разбиваются на кадры с помощью pcap.
Большинство пакетов 1448B имеют временной интервал, близкий к 24,224 мс, что ожидается при скорости 500 кбит/с.
Проблема: несмотря на то, что кадры поступают в последовательности, временной интервал их поступления не соответствует.
Второй большой пакет (1448B) после промежутка в 200 мс всегда идет почти впритык к первому пакету.
Последний пакет в чанке (654B) приходит с задержкой (24,224 мс вместо 10,464 мс в примере на прикрепленном рисунке)
Скрин тайминга
Временные промежутки между пакетами.
Команда TC с HTB:
tc qdisc del dev enx00e04c080ecf root 2> /dev/null > /dev/null
tc qdisc add dev enx00e04c080ecf root handle 1:0 htb по умолчанию 2
tc class add dev enx00e04c080ecf parent 1:1 classid 1:2 htb rate 500kbit ceil 500kbit Burst 10 cburst 10 prio 2
tc filter добавить dev enx00e04c080ecf протокол ip parent 1:0 u32 match ip dst 192.168.2.103 flowid 1:2
Если я не ошибаюсь в расчетах, я думаю, что проблема может быть связана с обработкой токенов в tc, которую я использую для формирования трафика.
Я думаю, что токены накапливаются во время простоя, и когда следующий пакет получен, он отправляет два пакета подряд.
с третьего пакета скорость потребления токена стабилизируется.
Если это то, что происходит, я хотел бы знать, есть ли способ избежать использования накопленных токенов для второго пакета в чанке.
Я пробовал разные варианты в команде tc
Я также пытался использовать CQB - команда ниже
Справка : https://lartc.org/lartc.html#AEN2233
Наблюдение:
уменьшение Burst = 10 немного увеличивает разрыв между первым и вторым пакетом.
тк с CQB:
tc qdisc del dev enx00e04c080ecf root 2> /dev/null > /dev/null
tc qdisc add dev enx00e04c080ecf root handle 1: cbq avpkt 5000 пропускная способность 10 Мбит
tc class add dev enx00e04c080ecf parent 1: classid 1:1 cbq rate 500kbit выделение 5000 prio 5 ограниченный изолированный
tc class add dev enx00e04c080ecf parent 1:1 classid 1:10 cbq rate 500kbit allot 5000 prio 1 avpkt 5000bounded
tc class add dev enx00e04c080ecf parent 1:1 classid 1:20 cbq rate 500kbit allot 5000 avpkt 5000 prio 2
tc filter добавить dev enx00e04c080ecf протокол ip parent 1:0 u32 match ip dst 192.168.2.103 flowid 1:10
tc filter add dev enx00e04c080ecf parent 1: протокол ip prio 13 u32 match ip dst 0.0.0.0/0 flowid 1:20