Рейтинг:0

Параметр HTB «скорость» ограничивает доступную полосу пропускания

флаг jp

Добрый день,

У меня следующая ситуация: 4 TCP потока данных с одной машины на другую. Каждый поток имеет свой собственный TCP-порт назначения. 4 потока имеют разные приоритеты: высокий, средний, низкий, объемный. High, Medium, Low генерируют 1,67 Мбит/с, а массовые генерируют 10 Мбит/с. (iperf3 используется для генерации трафика). Пакеты каждого потока помечаются соответствующей меткой DiffServ (DSCP), и эта метка используется для классификации трафика в qdisc HTB.

Цель: HTB qdisc должен быть настроен таким образом, чтобы в любое время поток с высоким приоритетом получал свои требуемые 1,67 Мбит/с, средний приоритет также гарантировал 1,67 Мбит/с, но с чуть более низким приоритетом, а остальной трафик должен был гарантировать 50 кбит/с. с. Каждый поток должен иметь возможность использовать весь канал, если он простаивает, и поток генерирует большую пропускную способность, чем указано изначально.

Генерация трафика:

Высокий приоритет:
iperf3 -c 192.168.88.254 -p 5150 -t 62 -b 1.67M -l 128 -S 224 
Средний приоритет:
iperf3 -c 192.168.88.254 -p 5160 -t 62 -b 1.67M -l 4K -S 160 
Низкий приоритет:
iperf3 -c 192.168.88.254 -p 5170 -t 62 -b 1.67M -l 4K -S 96 
Масса:
iperf3 -c 192.168.88.254 -p 5180 -t 62 -b 10M -l 4K -S 0 

Конфигурация HTB qdisc

НИ="эт2"
AC="sudo /sbin/tc class add dev "

# Удалить предыдущие qdisc
sudo /sbin/tc qdisc del dev $NI root

# Добавить HTB от имени root с классом 40 по умолчанию для некатегоризированного трафика
sudo /sbin/tc qdisc add dev $NI корневой дескриптор 1: htb по умолчанию 40
sudo /sbin/tc class add dev $NI parent 1: classid 1:1 скорость htb 3,5 Мбит ceil 1000 Мбит

# поток с высоким приоритетом DSCP 224 - 1110 0000 - 0xE0
$AC $NI родительский 1:1 classid 1:10 скорость htb 1,7 Мбит ceil 1000 Мбит prio 1
# поток со средним приоритетом 
$AC $NI родительский 1:1 classid 1:20 скорость htb 1,7 Мбит ceil 1000 Мбит prio 2
# поток с низким приоритетом
$AC $NI родительский 1:1 classid 1:30 скорость htb 50kbit ceil 1000mbit prio 3
# массовый поток
$AC $NI родительский 1:1 classid 1:40 скорость htb 50kbit ceil 1000mbit prio 4 

# Добавляем фильтры для классификации пакетов на основе метки dscp

# высокий приоритет DSCP 224 - 1110 0000 - 0xE0
sudo /sbin/tc filter add dev $NI протокол ip parent 1: prio 1 u32 match ip tos 0xE0 0xff flowid 1:10
# средний приоритет DSCP 160 - 1010 0000 - 0xA0
sudo /sbin/tc filter add dev $NI протокол ip parent 1: prio 2 u32 match ip tos 0xA0 0xff flowid 1:20
# низкий приоритет DSCP 96 - 1100 0000 - 0x60
sudo /sbin/tc filter add dev $NI протокол ip parent 1: prio 3 u32 match ip tos 0x60 0xff flowid 1:30
# массовый DSCP 0 - 0000 0000 - 0x00
sudo /sbin/tc filter add dev $NI протокол ip parent 1: prio 4 u32 match ip tos 0x00 0xff flowid 1:40

Трафик классифицируется правильно. Я вижу, что соответствующие счетчики в статистике класса tc растут. Я перепроверял это несколько раз.

Проблема: Эта конфигурация правильно распределяет пропускную способность для потоков с высоким и средним приоритетом. Low prio и bulk тоже получают свои 50кбит. Однако, Я не могу протолкнуть ссылку больше, чем значение, указанное в корне класс1:1 как ставка то есть 3.5мбит.

В каждой статье и мануале по HTB, которые я читал, указывалось, что параметр «рейт» — это минимальный гарантированный курс к классу, а «кейл» — максимальная сумма, которую он может получить. В моем случае кажется, что «скорость» ограничивает ссылку указанным значением. Это определенно не желаемое и ожидаемое поведение.

Если я установлю для параметра «скорость» корневого класса то же значение, что и для «ceil», то есть 1000 Мбит, приоритизации не будет, и доступная пропускная способность будет разделена поровну между всеми потоками. Это нежелательное поведение, так как в случае колебаний доступной полосы пропускания первоначальный трафик станет менее 1,67 Мбит/с.

Я неправильно понял значение параметра «скорость» в корневом классе? Эта проблема как-то связана с другими параметрами HTB, такими как «квантовый»? Я также заметил, что каждый класс имеет отрицательное количество токенов при передаче данных. Это плохо? Если да, то какие параметры я должен настроить и как?

Заранее спасибо!

Рейтинг:0
флаг us

Параметр ceil не влияет на корневой класс, вы должны установить только скорость один.

Если ваша цель состоит в том, чтобы сделать предельную часть дочерних классов масштабируемой, вы можете использовать hfsc вместо HTB, но это не помешает запрашивать максимальную скорость, даже если у вас недостаточно пропускной способности.

Если ваша цель — иметь дело с непостоянным интернет-соединением, это не сработает таким образом, потому что вы ограничиваете часть загрузки, а загрузка по-прежнему не будет приоритетной. Вы можете выполнить поиск ifb, чтобы ограничить пропускную способность загрузки.

В любом случае, tc не сможет определить вашу реальную доступную пропускную способность. Обязательно используйте fq_codel для лучшего управления очередями, bbr для TCP и новейшее ядро ​​Linux, чтобы ограничить влияние возможности запрашивать большую пропускную способность, которая у вас есть.

флаг jp
Спасибо за подсказки о HFSC и BBR! Пояснение к первому предложению: значит, для корневого класса параметр «скорость» берет на себя роль «ceil», жестко ограничивая доступную пропускную способность для qdisc?
setenforce 1 avatar
флаг us
Да, в корневом классе значение rate используется для rate и ceil.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.