Шейпер, HTB, локальный трафик и интернет-трафик

Автор gardarea51, 24 сентября 2014, 21:38:49

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

gardarea51

Здравствуйте!
Уже давно я писал, что при использовании HTB могут быть тонкости: https://debianforum.ru/index.php?topic=6971.0 Часто приходится в одной дисциплине обрабатывать локальный трафик от хоста к клиентам и транзитный интернет-трафик. Локальный трафик может быть и гигабит, а транзит с интернета - в пару мегабит. Смешение таких скоростей в HTB дает побочные эффекты и вообще видимо нежелательно.

Натолкнулся на интересный способ решения этой проблемы. Можно использовать дисциплину PRIO. К примеру так:
$qdisc_add dev $lan_if root handle 1: prio bands 2 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$qdisc_add dev $lan_if parent 1:1 handle 10: htb
$qdisc_add dev $lan_if parent 1:2 handle 20: pfifo_fast
Мы можем загнать весь транзитный трафик в класс 1:1:, а остальной просто не классифицировать и тогда он пойдет в класс 1:2 (туда же попадает и локальный трафик на больших скоростях до клиентов от хоста). К дисциплине htb мы дальше можем подключить корневой класс и подклассы, к примеру так:
#htb для транзита
$class_add dev $lan_if parent 10: classid 10:1 htb rate ${rate}kbit
$class_add dev $lan_if parent 10:1 classid 10:10 htb rate $[6*${rate}/10]kbit ceil ${rate}kbit
$class_add dev $lan_if parent 10:1 classid 10:20 htb rate $[3*${rate}/10]kbit ceil ${rate}kbit
$class_add dev $lan_if parent 10:1 classid 10:30 htb rate $[1*${rate}/10]kbit ceil ${rate}kbit


А что делать, если какой-то трафик нужно приоритезировать? Опять же использовать PRIO, только уже на подклассах htb (10:10, 10:20, 10:30) или "до" htb (см. следующий листинг), или и там и там.

С PRIO есть одна тонкость: https://debianforum.ru/index.php?topic=6982.0 Однако, все обходится использованием pfifo_fast, к примеру так:
$qdisc_add dev $lan_if root handle 1: prio bands 3 priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
$qdisc_add dev $lan_if parent 1:1 handle 10: pfifo_fast
$qdisc_add dev $lan_if parent 1:2 handle 20: htb
$qdisc_add dev $lan_if parent 1:3 handle 30: pfifo_fast

Здесь PRIO является корневой, весь трафик с метками TOS умолчально кидается в класс 1:3, а нужный нам трафик будет идти в классы 1:1, 1:2, 1:3. Для классификации трафика конечно нужны еще фильтры. Использование pfifo_fast дает то, что трафик, попавший в данный класс все-таки будет обрабатываться по приоритетам в зависимости от метки TOS.

Надеюсь это кому-нибудь пригодится, я пока не тестировал в реальных условиях, но думаю это должно работать. Такая комбинация PRIO-HTB-PRIO кажется мне очень вкусной для задачи "приоритезировать трафик + раздать его порционно". Буду рад, если кому-то данная информация поможет.