Наша почта:
В Москве:
РФ (звонок бесплатный):
Аппаратный QoS в MikroTik RouterOS
{ Основатель и технический директор Integrasky }
Роман Козлов

Видео доклада

Презентация спикера

Аппаратный QoS в RouterOS
Реализация аппаратного QoS появилась несколько раньше, но в основную фазу вступила примерно с версии RouterOS 7.15. Естественно, не на всех коммутаторах — модельный ряд большой, и до сих пор продаются устройства первых серий (например, CRS1xx) и коммутаторы на SwitchOS, к которым это не относится. Сейчас есть возможность сопоставления QoS-профилей по заголовкам входящих пакетов, и инструмент стал похож на что-то вполне вменяемое.

Где закопана проблема

Ситуация из реальной жизни. Есть клиент, у него какое-то количество коммутаторов, они как-то подключены друг к другу — какими-то портами, зачастую гигабитными. Никакой сети Клоза и трёхуровневой модели. От пользователей поступают заявки: «тормозит».
  • Первый шаг
    Посмотреть на роутере, есть ли загруженная полоса пропускания. И оказывается, что там ничего нет. Почему? Да потому что трафик пользователя до роутера не доходит: где-то в сети появился затор, и с этим затором надо что-то делать.
  • Дальше ситуация скатывается
    В необходимость настроить мониторинг, чтобы не лазить по всем железкам в поисках конкретного интерфейса, на котором произошёл затор. Строится карта, которая мониторит всё это дело, и уже по визуальному представлению можно быстро определить проблемный интерфейс.
  • Идеальное решение
    Воткнуть десятку вместо гигабита или гигабит вместо ста мегабит. Но подходит оно не всегда: технически это бывает невозможно — либо только гигабитные линки, либо длинная трасса, либо вообще нет оптики. Тогда приходится лезть в аппаратный QoS — и переходить от шейпера к построению аппаратных очередей.

Аппаратные ограничения

MikroTik не был бы MikroTik, если бы не имел ограничений — скорее всего, он бы тогда стоил других денег. Используемые чипы имеют определённые аппаратные ограничения, и именно на них построена вся история с распределением разного трафика по разным очередям. Буферы не бесконечные, при переполнении буфера получается дроп. В основном в железе используются простые FIFO-очереди, которые при переполнении начинают дропать пакеты.

На сайте вендора есть таблица коммутаторов, которые умеют всё это великолепие. Ключевые нюансы:
  • Количество QoS-профилей
    Сильно различается. На небольших коммутаторах доступа — например, CRS328-24P, 24-портовом PoE-коммутаторе, очень активно используемом в малом бизнесе, — их всего 128.
  • Количество QoS map:
    на многих девайсах она одна, на других их больше.
  • Статус интерфейсов
    То есть возможность мониторить, что происходит на аппаратном QoS, — реализован по-разному. На маленьких коммутаторах доступа наблюдать за всем этим более-менее можно, на других есть ограничения.

Алгоритм настройки

Чёткого алгоритма в стиле «делай раз, два, три, иначе не получится» нет — как обычно в MikroTik. Но за основу можно взять такую последовательность:
Заполнить QoS profile, помня об аппаратных ограничениях конкретной железки.
Сопоставить DSCP- и PCP-метки с полями в QoS map.
Установить соответствие QoS-профилей на нужных интерфейсах.
Включить hardware QoS
Из нюансов: в документации сказана простая, но интересная фраза — при выключении аппаратного QoS желательно перезагрузить коммутатор. То же самое стоит делать и при включении, на всякий случай — не повредит. Здесь есть программная часть (RouterOS) и аппаратная (чип Marvell), который, по сути, программируется через эти команды. Чтобы ничего не произошло, лучше перезагрузиться.

Метки: PCP и DSCP

Существуют определённые поля как в заголовке VLAN, так и в IP-пакете, на основе которых можно определять тип трафика.
  • PCP (Priority Code Point)
    трёхбитовое поле в заголовке VLAN, значения от 0 до 7. Очень простое поле, выставить его можно на телефонных аппаратах, коммутаторах, роутерах — на всех устройствах, которые умеют работать с VLAN. Зачем: чтобы обозначить, что это телефонный трафик, а это — какой-то иной.
  • DSCP
    шестибитовое поле в заголовке IP-пакета, диапазон от 0 до 63. Выставить его можно на IP-телефонах, в операционной системе (например, групповыми политиками), в самих приложениях, на коммутаторах и роутерах.
Самое важное:
поле может быть изменено в процессе передачи. Метка выставлена в телефоне — а кто-то по пути взял её и поменял. Это один из ключевых поинтов при настройке аппаратного QoS.

Доверенные и недоверенные порты

Раз поля и в заголовке пакета, и в VLAN можно поменять, порты должны различаться по степени доверия.
  • Недоверенный интерфейс
    классический пример — порт провайдера: это провайдерский сегмент, в котором поля выставляются на его стороне.
  • Доверенный интерфейс
    например, собственный сервер, который настроен своими руками и про который всё известно. От такого устройства поля принимаются полностью.
  • Пограничная ситуация
    ноутбук, подключённый через IP-телефон. Здесь можно доверять полю PCP в заголовке тегированного VLAN от телефона, а полям L3 из нетегированного трафика — не доверять. Так решается ситуация «50 на 50».
Для этого в RouterOS есть соответствующие настройки доверия L2 и L3 — то есть доверять ли DSCP-полям и доверять ли PCP-полям:
  • 1.
    ignore — все поля полностью игнорируются, работа с ними начинается с чистого листа, в зависимости от профиля, настроенного на интерфейсе;
  • 2.
    keep — поле сохраняется и передаётся дальше без изменений;
  • 3.
    trust — поле переписывается на то, что настроено в профиле.

QoS profile и QoS map

By default в аппаратном QoS не настроено ничего — полная пустота, даже в 802.1p. Поэтому создаётся несколько трафик-классов, которым сопоставляются DSCP и PCP.

Здесь есть нюанс, на который стоит обратить внимание: дефолтный трафик-класс находится в единице, а трафик-класс с номером один — в нуле.

Каждому пакету назначается соответствие трафик-классу. На интерфейс навешивается тот или иной профиль, в котором указывается соответствие DSCP-меток. Но DSCP-меток гораздо больше — шесть бит, от 0 до 63. Для этого и существуют map — карты, которые описывают, какие DSCP- и PCP-метки соответствуют друг другу и как они распределяются по разным классам. Разумно ориентироваться на стандартные значения, принятые у других вендоров (Cisco и других), — так конфигурация будет ближе к общепринятой.

Priority-based Flow Control

  • Базовый flow control работает так:
    При переполнении буфера на принимающей стороне коммутатора в обратную сторону на определённый мультикастный MAC-адрес посылается pause frame — по сути, со словами «прекрати передавать мне трафик». В этом фрейме передаётся и время, на которое передачу надо прекратить. Отправляющая сторона на это время замолкает, буфер коммутатора освобождается, и всё становится хорошо.
  • Но есть проблема:
    Если в сети есть сервисы, которые ни в коем случае не должны прерываться — например, связанные с хранением данных: iSCSI, SAN-сети, — то при достаточно большой задержке хранилку может просто выкинуть. Система решит, что связь с ней потеряна, и отстрелит ноду целиком. И произошло это всего лишь потому, что, условно, отъехали какие-нибудь диски, пошла синхронизация данных ради сохранения консистентности — и связь с хранилкой потерялась. Великолепный сценарий, которого priority-based flow control как раз и позволяет избежать.
  • Каким образом:
    Пауза устанавливается не на порт целиком, а на конкретный класс трафика. Паузится то, что не нужно, и остаётся то, что необходимо. Похожим образом настраивается и RDMA — так, чтобы pause frame на RDMA не отправлялся.
  • Настройка:
    Создаётся flow control, на интерфейсе указывается скорость — это важно, поскольку от неё рассчитывается время паузы. Время паузы задаётся не напрямую: если выставлено, допустим, 3 миллисекунды, это ещё не значит 3 миллисекунды — значение рассчитывается в зависимости от скорости. Дальше профиль устанавливается на интерфейс в разделе QoS-портов коммутатора, там же выставляется PCP.
В большинстве случаев это не требуется, если нет сверхзагруженных линков. Но если в сети есть хранилки, сверхчувствительные к подобным проблемам, лучше пойти в эту сторону.

TX manager и буферы

При создании каждого TX manager создаётся 8 очередей. TX manager привязывается к интерфейсу, и автоматом к нему привязываются эти самые 8 очередей. Чем больше TX manager, тем больше очередей — по 8 на каждый.

Зачем создавать отдельный TX manager?

Дело в том, что у MikroTik используется шареный буфер между всеми интерфейсами — определённый объём (порядка десятков мегабайт в зависимости от модели), в который складываются пакеты. Если портов, скажем, 16, то в момент активной передачи трафика этот объём делится на 16 — и получается размер буфера на интерфейс. Соответственно, часть портов можно объединить в отдельные буферы, а на части портов буфер вообще выключить, если он там не нужен.

Также важно понимать

Есть дефолтный TX manager, который выкидывает отключенные интерфейсы из общего буфера. Автоматически это пока не реализовано, настраивать придётся руками: на портах, на которых никогда не будет линка, нужно включить TX manager, исключающий их из общего буфера.

Очереди и шедулер

В очередях можно настраивать различную логику работы. Понятное дело, той гибкости, что дают деревья очередей или simple queues, здесь не получить — не стоит искать от аппаратного QoS повторения того, что делается на роутере с сотнями PPPoE-клиентов. Количество и очередей, и правил ограничено. Но развесить разные очереди на разный тип трафика и тем самым разрулить скорости — вполне можно. Для каждого трафик-класса (от 0 до 7) на интерфейсе указывается своя скорость.
За распределение трафика по очередям отвечает шедулер:
  • на трафик-классах 6 и 7 — незамедлительная передача трафика, весов там нет, они стоят в нулях;
  • если очередь с моментальной передачей не заполнена, происходит переход к очередям с высоким приоритетом, и уже внутри них начинает работать вес. By default веса — 5, 4, 3: из очереди трафик-класса 5 передаётся 5 пакетов, из очереди класса 4 — 4 пакета и так далее, пока очереди высокого приоритета не будут очищены;
  • дальше наступает очередь низкоприоритетного трафика.

WRED и ECN

Есть опции, определяющие, что делать с пакетами внутри очередей. Естественно, дропать — QoS всегда про уничтожение трафика.
  • WRED (Weighted Random Early Detection)
    начинает рандомизированно уничтожать пакеты ещё до заполнения очереди. Идея: убить часть пакетов заранее, до момента, когда станет совсем плохо. Есть большая очередь, в ней скапливается много пакетов, она ещё не заполнена, но тенденция очевидна — скоро очередь закончится, и все следующие пакеты будут дропнуты. Поэтому пакеты начинают убиваться заранее, в зависимости от процента заполнения очереди. Очень важный момент: если это TCP, то с помощью механизма скользящего окна отправитель подстроится под эффективную скорость передачи данных. Скорость снизится заранее — вместо долгих перепосылок трафика. WRED при этом ориентируется на веса и DSCP-метки, то есть позволяет дропать пакеты в зависимости от их приоритета.
  • ECN
    механизм сигнализации о перегрузках. Если flow control работает через pause frame на L2, то ECN живёт в заголовке IP-пакета — это два бита. Работает он в зависимости от поддержки со стороны приложения. Например, для веб-трафика в заголовке выставляется поле, означающее поддержку ECN. При возникновении перегрузки пакет не дропается, а летит получателю с выставленным полем 1.1. Получатель в случае TCP сообщает в обратную сторону, что есть проблемы, и размер окна снижается. Для UDP by default это, понятное дело, не работает.
Все эти опции
как и пороговые значения WRED, надо выставлять достаточно аккуратно.

А если трафик не размечен?

Резонный вопрос: неужели в сети всё так хорошо и все пакеты размечены? Ничего подобного — чаще всего половина приложений не ставит ничего. Здесь и работает деление на доверенные и недоверенные интерфейсы.

С помощью switch rules можно назначать QoS-профили на тот или иной тип трафика прямо на коммутаторе: если пакет идёт на такой-то IP-адрес по такому-то протоколу — сразу поставить QoS profile из нужного диапазона. Причём это даёт и второй эффект: коммутатор проставит из профиля DSCP-метку, и дальнейшая передача трафика по сети пойдёт уже с ней. Поле VLAN priority в switch rules больше не используется и остаётся для совместимости со старыми конфигурациями — коммутатор даже предупреждает, что трогать его не надо.

Если же раскраской пакетов для последующей приоритизации на L2 занимается роутер, для этого есть mangle. Первый шаг — очистка лишних полей из заголовков пакетов, приходящих со стороны провайдера: чужие метки лучше почистить, важны свои. Дальше — mark connection на нужные соединения и навешивание на них тех или иных DSCP-меток. Это операция на процессоре, но на роутере ресурсов обычно достаточно, и добавить ещё одно действие для того или иного трафика — не сильно затратно. Тем более что QoS на роутере, скорее всего, и так настраивается. Разумно использовать цепочки — так всё будет гораздо интереснее.
Финал
Аппаратный QoS в RouterOS сегодня даёт достаточно мощные инструменты для приоритизации трафика в сети. В документации вендора уже есть несколько интересных примеров: для RDMA, в том числе с настройкой LLDP и сигнализацией, — актуально для датацентровых сценариев, а также пример настройки приоритизации протокола Dante из мира телекоммуникационных сетей и сетей звука.
Результат — более гранулярное управление трафиком. Это достаточно важная часть инфраструктуры там, где есть дефицит линков. В идеальном варианте дефицита нет: не хватает десятки — покупается 25, не хватает 25 — 40, не хватает 40 — 100 или агрегация в несколько линков. Но идеальный вариант доступен не всегда.
Switch rules добавляют гибкости, в том числе позволяя управлять метками. Однако ни в коем случае не стоит сразу лепить всё это в прод по понятным причинам: любые подобные вещи требуют тестирования и прогона реальным трафиком. При таком подходе аппаратный QoS даст ощутимые плюсы в работе сети.
В Москве:
РФ (звонок бесплатный):
Наша почта:
GetNet
Остались вопросы?
Группа компаний VoxLink © 2011-2026