MikroTik с нуля 09. Ограничение скорости: Simple Queue, PCQ и CAKE
Note
Команды сверены с официальной документацией RouterOS 7 (версия руководства 7.26). Перед работой на боевом оборудовании проверьте их на тестовом стенде или сделайте резервную копию.
Один человек запустил большую закачку, и у всех остальных «тормозит интернет»: страницы открываются по полминуты, голосовой звонок рассыпается. Это типичная проблема общего канала, и в RouterOS она решается очередями (queues). В статье разберём, как ограничить скорость отдельного устройства, как заставить клиентов делить канал поровну и как с помощью CAKE удержать задержку под нагрузкой. Отдельно остановимся на ловушке, из-за которой очереди «ничего не делают», хотя настроены правильно: это FastTrack из канонического firewall.
После прочтения у вас будет:
- понимание, как читать лимиты вида
20M/100Mи что такое target, parent, limit-at и max-limit; - очередь на весь LAN, в которой каждый клиент получает свою справедливую долю (PCQ);
- вариант с CAKE вместо PCQ и список его настроек, которые стоит знать;
- порядок проверки: счётчики очередей, torch и тест скорости.
Что понадобится
- Роутер MikroTik с RouterOS 7, настроенный по статьям «Настройка роутера: WAN, LAN, DHCP и NAT» и «Firewall для начинающих»: интерфейс
bridge(мост локальной сети) с сетью192.168.88.0/24,ether1к провайдеру, правила firewall из канона серии, в том числе правилоfasttrack. - Знание реальной скорости канала. Измерьте её с компьютера в LAN, лучше несколько раз в разное время суток. Дальше в примерах измеренная скорость канала условно равна 20 Мбит/с на отдачу и 100 Мбит/с на приём. В самих очередях мы берём чуть меньше,
18M/90M, чтобы узким местом стал роутер (почему так, объясняется ниже). Подставьте свои числа. - Для проверки задержки нужен адрес, который отвечает на ping: шлюз провайдера или публичный DNS-сервер. В примерах стоит заглушка
192.0.2.80, её нужно заменить. - Подключение к роутеру через WinBox или SSH. Если вы пока не знакомы с консолью и Safe Mode, прочитайте статью 02.
- Один-два компьютера в локальной сети для проверки.
Зачем нужны очереди
Роутер передаёт пакеты в интернет и обратно по одному. Пока канал свободен, это незаметно. Когда пакетов приходит больше, чем канал успевает пропустить, лишние ждут в очереди (буфере). Дальше возможны два исхода: если буфер заполнился, пакеты отбрасываются, а если он большой, пакеты долго ждут, и задержка растёт.
Документация MikroTik описывает это как два крайних режима: «жёсткое ограничение» (всё, что сверх лимита, сразу отбрасывается, задержки нет) и «выравнивание» (ничего не отбрасывается, всё ждёт в очереди). Реальные очереди находятся между ними, а размер буфера решает, чего будет больше: потерь или ожидания. Большая очередь лучше использует канал, но увеличивает задержку, а именно задержка делает звонки, игры и удалённые рабочие столы неприятными. Это явление называют bufferbloat (раздувание буферов).
Очереди в RouterOS решают три практические задачи:
- Ограничить скорость для адреса, подсети, протокола или порта.
- Поделить доступную скорость между клиентами поровну или в нужных пропорциях.
- Не дать буферам раздуться, чтобы под нагрузкой пинг оставался разумным.
Важная мысль, на которой строится вся статья: очередь на роутере помогает только тогда, когда узким местом становится сам роутер. Если у провайдера канал 100 Мбит/с, а вы ограничили 100 Мбит/с, очередь всё равно может образоваться у провайдера, где вы ею не управляете. Документация к CAKE говорит о том же: шейпер должен стать узким местом, поэтому начинать надо ниже стабильной измеренной скорости, а не с цифры из договора. Поэтому в наших примерах лимиты (18M/90M) чуть ниже измеренных 20 и 100 Мбит/с.
Как устроены очереди в RouterOS
Две ручки: лимит и тип очереди
Очереди в RouterOS построены на алгоритме HTB (Hierarchical Token Bucket, иерархическое ведро токенов). Для каждой очереди задаются два значения:
max-limit(в документации MIR, Maximum Information Rate, максимальная скорость) — потолок, до которого очередь может дойти, если есть свободная полоса;limit-at(CIR, Committed Information Rate, гарантированная скорость) — скорость, которую очередь получит гарантированно, даже если канал занят остальными.
Кроме лимитов у очереди есть тип (queue type) — алгоритм, который решает, какой пакет отправить следующим и что отбросить, когда очередь полна. Именно тип определяет, будет ли деление «поровну» (PCQ) и борьба с задержкой (CoDel, FQ-CoDel, CAKE). Посмотреть заводские типы можно так:
/queue type print
Должен появиться список, в котором среди прочего есть default, ethernet-default, default-small, а также готовые pcq-upload-default и pcq-download-default.
Simple Queue и Queue Tree
Для настройки есть два меню:
/queue simple— простые очереди: ограничить одного клиента, подсеть, поделить канал. Подходит для большинства домашних и офисных задач, и именно его мы используем./queue tree— очереди для сложных схем: общая политика приоритетов, ограничения по меткам пакетов из/ip firewall mangle. Каждая очередь здесь односторонняя, а порядка, как в Simple Queue, нет. В серию Queue Tree не входит, потому что для начала он не нужен.
Как читать лимиты
Скорость в очередях измеряется в битах в секунду. Суффикс k означает тысячи, M — миллионы: max-limit=20M — это 20 Мбит/с (не мегабайт!). Для оценки в привычных мегабайтах делите на 8: 100 Мбит/с — это примерно 12,5 МБ/с.
У большинства параметров очереди два значения через косую черту: ОТДАЧА/ПРИЁМ. Первое число относится к трафику от цели в интернет (upload), второе — к трафику к цели из интернета (download). Запись max-limit=20M/100M означает: отдача до 20 Мбит/с, приём до 100 Мбит/с. Так же устроены limit-at, priority и queue.
Направление считается относительно цели (target). Если адрес источника пакета попадает в target, это upload, если адрес получателя — download. Поэтому в LAN-очереди target должен быть адресом клиентов в локальной сети, а не адресом провайдера.
Основные параметры Simple Queue
| Параметр | Что делает |
|---|---|
name |
Уникальное имя очереди; на него ссылаются в parent другие очереди |
target |
К кому относится очередь: адрес или подсеть (допускается несколько через запятую) либо интерфейс |
max-limit |
Потолок скорости, отдача/приём |
limit-at |
Гарантированная скорость, отдача/приём |
parent |
Имя родительской очереди; без родителя значение none |
priority |
От 1 (высший) до 8 (низший); действует только на очереди без детей и только при заданном max-limit |
queue |
Типы очередей для отдачи и приёма: тип-отдачи/тип-приёма |
burst-limit, burst-time, burst-threshold |
Кратковременный «разгон» выше max-limit; в статье не используем |
Шаг 0. FastTrack отключает очереди
Warning
Трафик соединений, помеченных действием fasttrack-connection, идёт в обход очередей Simple Queue и Queue Tree с parent=global, а также мимо правил firewall и mangle. Очередь, созданная для такого трафика, будет выглядеть исправной, но не станет ничего ограничивать. Поэтому до создания очередей нужно решить вопрос с FastTrack.
FastTrack — режим «быстрого пути»: роутер помечает установившееся TCP- или UDP-соединение и дальше пересылает его пакеты, минуя большую часть обработки (firewall, учёт соединений, очереди).
В каноническом firewall серии первое правило цепочки forward — это именно FastTrack (comment fasttrack). Оно очень полезно: разгоняет пересылку и разгружает процессор. Но для очередей оно вредно. Правило ищем не по комментарию, а по действию action=fasttrack-connection: так команды ниже работают и в каноническом наборе, и в заводской конфигурации, где комментарии другие (например, defconf: fasttrack). Проверьте, идёт ли трафик через FastTrack:
/ip firewall connection print where fasttrack
Если список не пуст, часть соединений идёт в обход очередей. Дополнительно можно посмотреть счётчики самого правила:
/ip firewall filter print stats where action=fasttrack-connection
Если значение packets растёт, правило работает.
У вас есть три способа, они зависят от задачи.
Способ 1. Выключить правило FastTrack. Нужен, когда очередь должна покрыть всю сеть (общий лимит, PCQ, CAKE). Платой будет более высокая нагрузка на процессор: на слабых моделях следите за ней (см. статью 08).
/ip firewall filter disable [find where action=fasttrack-connection]
Следующее за ним правило accept established,related,untracked остаётся и продолжает пропускать трафик уже без FastTrack. Вернуть всё обратно можно командой /ip firewall filter enable [find where action=fasttrack-connection].
Note
Если вы применяли статью «Два провайдера», правило FastTrack там могло быть изменено относительно канона (в него добавлено условие connection-mark=no-mark). Отключение по action=fasttrack-connection подходит в обоих вариантах, а правила-исключения способа 2 по-прежнему ставятся выше этого правила. Выберите один способ: если FastTrack отключён целиком, исключения не нужны.
Important
Соединение остаётся FastTracked, пока оно не будет закрыто, не истечёт его таймаут или роутер не перезагрузится. После отключения правила уже идущие закачки по-прежнему обходят очереди. Остановите и заново запустите закачку или перезагрузите роутер в удобное время.
Способ 2. Исключить только нужные хосты. Нужен, когда лимит относится к одному-двум устройствам, а остальные пусть остаются на быстром пути. Правила-исключения принимают трафик хоста до того, как он дойдёт до FastTrack, поэтому их обязательно ставят выше правила fasttrack (параметр place-before). Здесь и далее 192.168.88.51 — условный компьютер в LAN:
/ip firewall filter add chain=forward action=accept connection-state=established,related src-address=192.168.88.51 place-before=[find where action=fasttrack-connection] comment="no fasttrack: 192.168.88.51 upload"
/ip firewall filter add chain=forward action=accept connection-state=established,related dst-address=192.168.88.51 place-before=[find where action=fasttrack-connection] comment="no fasttrack: 192.168.88.51 download"
Нужны оба правила, потому что трафик хоста идёт в обе стороны. Адрес хоста не должен меняться: закрепите его за устройством в DHCP (об аренде адресов — в статье 03).
Способ 3. Использовать Queue Tree, привязанный к интерфейсу. Документация сообщает, что такие очереди могут обрабатывать и FastTracked-трафик. Это отдельная тема, в серии она не раскрывается.
Для общего лимита и PCQ из этой статьи выбираем способ 1: выполните команду из его описания выше.
Как проверить: повторите /ip firewall connection print where fasttrack. Через некоторое время (когда старые соединения закроются) новые FastTracked-соединения появляться не должны.
Tip
Torch и Packet Sniffer тоже отключают FastTrack, пока работают, причём для всего трафика роутера, а не только на проверяемом интерфейсе. Если очередь заработала при запущенном /tool torch, а после остановки перестала, значит, причина в FastTrack.
Шаг 1. Ограничить один компьютер
Начнём с простого: компьютер 192.168.88.51 не должен брать больше 5 Мбит/с на отдачу и 20 Мбит/с на приём.
/queue simple add name=pc-51 target=192.168.88.51/32 max-limit=5M/20M
Здесь /32 означает «ровно один адрес». Очередь без queue= получает тип по умолчанию (в примерах документации это default-small).
Как проверить:
/queue simple print stats
В таблице найдите pc-51. Запустите на этом компьютере закачку: поля rate (текущая скорость) и bytes должны расти, а rate не должна подниматься выше заданных лимитов. Обратите внимание на единицы в выводе: справочник описывает rate в байтах в секунду, а лимиты заданы в битах, поэтому сверяйте единицы на своём роутере (разница в 8 раз). Если bytes остаётся нулевым, перечитайте «Шаг 0».
Порядок очередей имеет значение
В Simple Queue очереди проверяются строго по порядку сверху вниз: пакет проходит по списку, пока не встретит очередь, под которую подходит. Поэтому частное правило всегда ставят выше общего. Если очередь lan-pcq на всю подсеть окажется выше pc-51, пакеты компьютера уйдут в общую очередь, а до pc-51 не дойдут.
Новые очереди добавляются в конец списка, поэтому при последовательном выполнении статьи порядок получается правильным: pc-51 создана раньше общей lan-pcq и стоит выше неё. Проблема возникает, когда частную очередь создают позже общей: тогда она оказывается ниже. Порядок меняется командой move: первым указывается перемещаемая очередь, вторым — очередь, перед которой её нужно поставить. Пример ниже справочный, выполнять его в нашей последовательности не нужно (очереди lan-pcq на этом шаге ещё нет, и find вернёт пустой результат):
/queue simple move [find where name="pc-51"] [find where name="lan-pcq"]
Если у вас много очередей, помните: пакет, который попадает в самую последнюю очередь, проходит проверку по всем предыдущим. Лишних очередей лучше не держать.
Caution
Если и адрес источника, и адрес получателя пакета попадают в target (например, два хоста одной подсети обмениваются данными через роутер, а target — вся эта подсеть), такой пакет всегда считается как download. Документация рекомендует настраивать очереди так, чтобы пакет подходил по адресу источника или по адресу получателя, но не по обоим сразу. Для очереди на всю подсеть помните, что внутренний трафик, проходящий через роутер, тоже может под неё попасть.
Шаг 2. Делим канал поровну: PCQ
Теперь вся сеть. Ограничивать каждый компьютер вручную неудобно, к тому же число клиентов может меняться. PCQ (Per Connection Queue) — тип очереди, который сам делит поток на подпотоки по выбранному признаку и даёт каждому свою долю. Признаком (pcq-classifier) служит адрес или порт:
- для трафика от клиентов в интернет (upload) классификатор
src-address: у каждого клиента свой подпоток; - для трафика к клиентам (download) классификатор
dst-address.
Значение pcq-rate=0 означает: подпотоки делят доступную полосу поровну. Создаём два типа:
/queue type add name=pcq-up kind=pcq pcq-classifier=src-address pcq-rate=0
/queue type add name=pcq-down kind=pcq pcq-classifier=dst-address pcq-rate=0
Как проверить: /queue type print должен показать новые типы pcq-up и pcq-down с kind=pcq.
Теперь одна простая очередь на всю подсеть. Первое значение отвечает за отдачу, второе — за приём, и в queue типы идут в том же порядке:
/queue simple add name=lan-pcq target=192.168.88.0/24 max-limit=18M/90M queue=pcq-up/pcq-down
Скорости в max-limit — это общий потолок на всю сеть. Мы взяли 18M/90M при измеренных 20 и 100 Мбит/с: по документации CAKE шейпер должен стать узким местом, поэтому начинать нужно ниже стабильной измеренной скорости. Если поставить потолок, равный скорости канала, делёж поровну всё равно будет работать, но борьбы с задержкой не получится. Подбирайте значение по результатам проверки.
Note
Очереди из статьи рассчитаны на IPv4. Если в LAN включён IPv6, его трафик в них не попадёт: для него нужна отдельная очередь, у которой в target указан IPv6-префикс (target принимает и IPv4-, и IPv6-префиксы), в статье мы её не разбираем. Кроме того, подсеть 192.168.88.0/24 включает и сам роутер (192.168.88.1), поэтому обращения клиентов к самому роутеру, например DNS-запросы или копирование бэкапа через WinBox, тоже могут попадать в эту очередь. При очень малых лимитах это заметно.
Как проверить: пока два компьютера одновременно качают файлы, выполните:
/queue simple print stats where name="lan-pcq"
Поле pcq-queues показывает число подпотоков (отдельно для отдачи и приёма): оно должно соответствовать числу активных клиентов. Закачки на разных компьютерах должны идти с близкой скоростью.
Потолок для каждого клиента
Если нужно не просто поровну, а ещё и не больше определённой скорости на человека, задаётся pcq-rate: это максимальная скорость одного подпотока. Тип может выглядеть так (в документации значения для pcq-rate приведены числом в битах в секунду, мы тоже указываем число):
/queue type add name=pcq-up-cap kind=pcq pcq-classifier=src-address pcq-rate=5000000
/queue type add name=pcq-down-cap kind=pcq pcq-classifier=dst-address pcq-rate=20000000
Здесь каждому клиенту достанется не больше 5 Мбит/с на отдачу и 20 Мбит/с на приём. Чтобы применить, назначьте типы очереди:
/queue simple set [find where name="lan-pcq"] queue=pcq-up-cap/pcq-down-cap
Чтобы вернуть «просто поровну»:
/queue simple set [find where name="lan-pcq"] queue=pcq-up/pcq-down
Другие параметры PCQ (значения по умолчанию видны в /queue type print у pcq-upload-default):
| Параметр | Смысл |
|---|---|
pcq-limit |
Размер очереди одного подпотока, в КиБ |
pcq-total-limit |
Сколько данных может ждать во всех подпотоках вместе, в КиБ |
pcq-src-address-mask, pcq-dst-address-mask |
Размер IPv4-сети, которая считается одним подпотоком (по умолчанию 32, то есть один адрес) |
pcq-burst-rate, pcq-burst-threshold, pcq-burst-time |
Кратковременный разгон для подпотока |
Адресный классификатор считает клиентом один адрес: если за ним скрывается целая сеть (например, гостевой роутер за NAT, трансляцией адресов), PCQ видит её как одного клиента.
Общая очередь на весь канал (WAN)
Отдельной очереди «на WAN» мы не создаём: роль общей очереди на весь канал выполняет lan-pcq. Она захватывает весь трафик подсети клиентов, и её max-limit=18M/90M одновременно служит потолком всего канала. Преимущество такого выбора в однозначном направлении: адреса клиентов находятся в target, поэтому отдача и приём не путаются.
Привязать очередь к самому порту провайдера тоже можно:
- Simple Queue с
targetв виде интерфейса: по документации вtargetдопускаются и адрес, и интерфейс. Направление считается относительно цели, поэтому по счётчикам нужно убедиться, что отдача и приём не поменялись местами. Готового примера в руководстве нет, поэтому мы его не приводим. - Interface Queue (интерфейсная очередь, меню
/queue interface): очередь передающей стороны интерфейса. Очередь на WAN-интерфейсе обрабатывает исходящий в интернет трафик (upload), а на LAN-интерфейсе (у насbridge) — трафик к клиентам (download). Это два отдельных экземпляра, и работает она не так, как Simple Queue с иерархией иlimit-at.
Про FastTrack (шаг 0) помните и здесь: Simple Queue обходится им, даже если её цель — интерфейс. Как FastTrack ведёт себя с Interface Queue, документация прямо не говорит, поэтому проверяйте результат по счётчикам и пингу под нагрузкой. По документации, Interface HTB работает некорректно, когда выходной интерфейс аппаратно выгружен (hardware offload: пересылкой занимается чип коммутатора, а не процессор), а bridge Fast Path (ускоренная обработка пакетов в bridge) не активен. Для начала проще Simple Queue.
Если у вас VLAN из статьи 07
Очередь lan-pcq относится только к подсети 192.168.88.0/24. Если вы разделили сеть на VLAN по статье 07, трафик подсетей 192.168.10.0/24, 192.168.20.0/24 и 192.168.30.0/24 в неё не попадает и остаётся без ограничений. Исправить это можно, перечислив подсети в target через запятую (по документации target допускает несколько значений):
/queue simple set [find where name="lan-pcq"] target=192.168.88.0/24,192.168.10.0/24,192.168.20.0/24,192.168.30.0/24
Если после статьи 07 адресов из 192.168.88.0/24 у вас больше нет, оставьте в списке только нужные подсети. PCQ по-прежнему делит канал по адресам клиентов, поэтому все VLAN вместе получают общий потолок 18M/90M.
Чтобы ограничить гостей жёстче остальных (VLAN 20), создайте для них отдельную очередь и поставьте её выше общей: по правилу «первая подходящая» пакеты гостей не дойдут до lan-pcq. В нашем примере гости вместе получают не больше 5 Мбит/с на отдачу и 20 Мбит/с на приём, а внутри этой полосы делят её поровну:
/queue simple add name=guests target=192.168.20.0/24 max-limit=5M/20M queue=pcq-up/pcq-down
/queue simple move [find where name="guests"] [find where name="lan-pcq"]
Если вы создаёте guests до lan-pcq, команда move не нужна. Подсеть 192.168.20.0/24 в target очереди lan-pcq можно оставить: пакеты гостей раньше попадут в guests. Очередь guests стоит вне общего потолка lan-pcq: в сумме гости и остальные клиенты могут выбрать больше 18M/90M. Чтобы этого избежать, используйте схему шага 3 и сделайте guests дочерней очередью lan-total (parent=lan-total). О FastTrack помните: способ 1 из шага 0 отключает его для всех VLAN сразу, а способ 2 (исключения) потребует правил для каждого хоста.
Как проверить: во время загрузки с гостевого устройства /queue simple print stats where name="guests" показывает растущие bytes и rate в пределах 5M/20M, а lan-pcq не растёт от гостевого трафика.
Note
Дальше идут шаги 3 и 4 для тех, кому не хватило PCQ. Если вам нужно просто ограничить устройства и поделить канал поровну, остановитесь на шаге 2: очередей lan-pcq (и, при необходимости, guests) достаточно, а сразу после шага 2 можно перейти к проверке работы.
Шаг 3 (для продвинутых). Гарантия для важного узла
Бывает, что для одного устройства, скажем, для сервера 192.168.88.10, нужна гарантированная скорость, даже когда клиенты забивают канал. Для этого используют иерархию: родительская очередь задаёт общий потолок, дочерние делят его. Параметр limit-at у ребёнка — гарантия, max-limit — потолок.
Правила «хорошей практики» из документации: сумма limit-at детей не должна превышать max-limit родителя, а max-limit каждого ребёнка должен быть меньше max-limit родителя, чтобы остальным детям осталась часть полосы и им не приходилось бороться за неё. Поэтому в примере потолки детей чуть ниже потолка родителя.
Заменим плоскую очередь lan-pcq на такую схему. Сначала удалите прежнюю очередь, а заодно и демонстрационную pc-51 из шага 1:
/queue simple remove [find where name="lan-pcq"]
/queue simple remove [find where name="pc-51"]
Очередь для хоста, оставленная вне иерархии, обходит общий потолок: пакеты 192.168.88.51 попали бы в неё раньше, чем в lan-total, и суммарная скорость сети могла бы превысить заданную. Если pc-51 нужна и дальше, сделайте её дочерней (parent=lan-total) и поставьте выше lan-clients.
Родитель задаёт общий потолок. Дочерние очереди создаются после него, и именно в таком порядке: сначала частное (server), потом остальные клиенты:
/queue simple add name=lan-total target=192.168.88.0/24 max-limit=18M/90M
/queue simple add name=server target=192.168.88.10/32 parent=lan-total limit-at=5M/20M max-limit=15M/80M
/queue simple add name=lan-clients target=192.168.88.0/24 parent=lan-total max-limit=17M/85M queue=pcq-up/pcq-down
Сервер получает не меньше 5 Мбит/с отдачи и 20 Мбит/с приёма, все остальные устройства делят канал поровну через PCQ. Если у вас есть VLAN из статьи 07, перечислите их подсети через запятую в target у lan-total и lan-clients, как показано выше для lan-pcq.
Note
Эта схема собрана из описанных в документации правил (строгий порядок очередей, parent, limit-at), но готового примера «родитель с PCQ-ребёнком» в руководстве нет. Проверьте её на стенде: через print stats убедитесь, что трафик сервера попадает в server, а остальной — в lan-clients.
Как проверить: пока сервер и несколько клиентов качают, /queue simple print stats должен показывать, что rate у server не падает ниже гарантированного значения, а у lan-clients растёт pcq-queues.
Шаг 4 (для продвинутых). CAKE против bufferbloat
PCQ делит канал справедливо, но борьба с задержкой — отдельная задача. Для неё в RouterOS 7 есть типы очередей CoDel, FQ-CoDel и CAKE (в RouterOS 6 их нет, они появились в 7.1beta3). Документация описывает CAKE как комплексную систему управления очередями против bufferbloat, а FQ-CoDel считает в целом хорошим выбором по умолчанию.
Проще говоря, CAKE объединяет в одной очереди то, для чего иначе нужно несколько настроек: сдерживает задержку под нагрузкой, делит канал между хостами и их соединениями, учитывает накладные расходы канала (о них ниже), умеет приоритеты по DSCP (метке приоритета в IP-заголовке) и при желании отбрасывает лишние TCP-подтверждения на сильно несимметричных каналах.
Границы возможностей такие: CAKE влияет только на трафик, который проходит через его очередь. Если тормозит Wi-Fi, не хватает мощности процессора или очередь копится у провайдера, CAKE этого не исправит.
Самый простой вариант
CAKE — это тип очереди, а не отдельное правило: сам по себе он трафик не обрабатывает. Его нужно назначить Simple Queue, Queue Tree или Interface Queue. Вот базовый пример из документации, адаптированный под нашу сеть. Лимит скорости здесь выставляет HTB (max-limit), поэтому собственный шейпер CAKE оставляется безлимитным (cake-bandwidth=0):
/queue type add name=cake-default kind=cake cake-bandwidth=0 cake-nat=yes
Назначим его клиентской очереди вместо PCQ:
/queue simple set [find where name="lan-clients"] queue=cake-default/cake-default
Если вы пропустили шаг 3 и у вас плоская очередь lan-pcq, замените имя в команде на lan-pcq. Возврат к PCQ: /queue simple set [find where name="lan-clients"] queue=pcq-up/pcq-down.
Как проверить: /queue type print показывает cake-default, а /queue simple print у очереди — queue=cake-default/cake-default. Затем проведите нагрузочный тест (ниже) и сравните пинг до и после.
Как понимать настройки CAKE
Таблица ниже справочная: для первого запуска достаточно команды из предыдущего подраздела, остальные параметры понадобятся, если результат вас не устроит.
| Параметр | Что означает |
|---|---|
cake-bandwidth |
Скорость собственного шейпера CAKE. 0 оставляет шейпер безлимитным, и скоростью управляет HTB. Если задать и cake-bandwidth, и лимит HTB, трафик пройдёт через два шейпера |
cake-nat |
yes, если роутер делает NAT: тогда CAKE видит внутренние адреса и порты и может честно делить канал между хостами |
cake-flowmode |
Режим справедливости. По умолчанию triple-isolate: деление между отправителями, получателями и отдельными соединениями; для обычного шлюза это рекомендуемая точка старта |
cake-diffserv |
Приоритеты по DSCP (метке приоритета в IP-заголовке). По умолчанию diffserv3; besteffort отключает приоритеты, если разметка не заслуживает доверия |
cake-rtt-scheme |
Предполагаемое время отклика. По умолчанию internet; lan для интернет-канала не использовать |
cake-overhead-scheme |
Схема накладных расходов канала (служебные байты, которые технология доступа добавляет к каждому пакету: PPPoE — вход по логину и паролю, DOCSIS — кабельный интернет и т. п.). Примеры значений: ethernet, pppoe-ptm, docsis; raw отключает компенсацию. Нужна, когда скорость ограничивает сам CAKE (cake-bandwidth больше 0). В нашей схеме с HTB и cake-bandwidth=0 оставьте значение по умолчанию |
cake-ack-filter |
Отбрасывает лишние TCP-подтверждения. Значения: none (выключено), filter, aggressive; начинать советуют с filter, а aggressive включать только после проверки, что скорость TCP не падает. Включайте только на передающей очереди медленной стороны канала, где скорости различаются примерно в 10 раз и больше |
cake-wash |
Стирает DSCP-метки после того, как CAKE ими воспользовался |
cake-autorate-ingress |
Встроенная оценка пропускной способности по входящему трафику; перед боевым применением проверяйте на реальном канале |
Три практических замечания по документации:
- Когда лимит задаёт HTB (как у нас), не включайте
cake-autorate-ingress: оно меняет шейпер CAKE, а неmax-limit. - Шейпер CAKE, в отличие от безлимитного CAKE, не распределяет обработку по ядрам процессора. Если шейпер упирается в одно ядро, пропускная способность падает, а задержка растёт. На слабых моделях проверьте нужную скорость на самом устройстве.
- Проверять работу нужно под одновременной загрузкой в обе стороны с замером задержки: тест, который показывает только скорость, не скажет, остаются ли отзывчивыми звонки и другие клиенты. Меньшая скорость отдельного соединения может быть нормальным результатом честного деления.
Если нужны разные настройки на отдачу и на приём (например, cake-ack-filter только на отдаче), создайте два типа CAKE и укажите их через косую черту в queue=.
PCQ, FQ-CoDel или CAKE
- PCQ делит канал по адресам и позволяет задать потолок на клиента. Его просто настраивать и объяснять.
- FQ-CoDel по документации даёт честное деление между соединениями и управление задержкой при меньшей нагрузке на процессор. Создаётся командой
/queue type add name=fq-codel-lan kind=fq-codelи назначается так же, как CAKE. - CAKE добавляет деление между хостами, шейпер с компенсацией накладных расходов, DiffServ (приоритеты по DSCP) и фильтр ACK. За это он требует больше процессора, особенно с включённым шейпером.
Если не уверены, начните с PCQ. Если главная жалоба «пинг прыгает, когда кто-то качает», попробуйте FQ-CoDel или CAKE и сравните результат измерением.
Tip
Simple Queue — не единственное место для CAKE: тип можно назначить и интерфейсной очереди (Interface Queue). Как она работает и чем ограничена, описано в подразделе «Общая очередь на весь канал (WAN)» выше; текущие типы интерфейсных очередей показывает /queue interface print, а подробности есть на странице CAKE в документации.
Проверка работы
-
Счётчики очередей. Основной инструмент:
/queue simple print statsСмотрите на
rate(текущая скорость),bytesиpackets(трафик идёт через очередь),dropped(сколько пакетов отброшено),queued-bytesиqueued-packets(сколько ждёт). Еслиbytesне растёт, очередь не получает трафик: проверьте FastTrack,targetи порядок. -
Сброс счётчиков перед новым тестом:
/queue simple reset-counters-all -
Torch показывает, кто сейчас занимает канал. Смотрите на LAN-интерфейсе, а не на WAN: после NAT на WAN вместо адресов клиентов виден адрес роутера.
/tool torch interface=bridge duration=10sБез
durationTorch работает до нажатияCtrl+C. Помните: пока Torch запущен, FastTrack выключен для всего трафика, поэтому очереди в этот момент могут работать иначе, чем обычно. Не оставляйте Torch работать надолго. -
Тест скорости запускайте с компьютера в LAN, а не на самом роутере: лимиты очередей относятся к трафику клиентов. Проверьте, что скорость близка к
max-limit, а не к скорости канала. -
Проверка справедливости и задержки. Пока один компьютер качает большой файл, на втором выполните в командной строке Windows
ping -t 192.0.2.80и сравните время отклика с пингом в простое канала. Здесь192.0.2.80— заглушка из диапазона для документации, на неё никто не отвечает: подставьте адрес, который отвечает на ping (шлюз провайдера или публичный DNS-сервер). Затем повторите тест с выключенной схемой очередей (команды ниже) и сравните.
Чтобы сравнение было честным, выключайте всю схему, а не только дочернюю очередь: если отключить только lan-clients, трафик попадёт в родителя lan-total, который по-прежнему ограничивает его, но с типом очереди по умолчанию. Для схемы из шага 3:
/queue simple disable [find where name="lan-clients"]
/queue simple disable [find where name="server"]
/queue simple disable [find where name="lan-total"]
Включить обратно:
/queue simple enable [find where name="lan-total"]
/queue simple enable [find where name="server"]
/queue simple enable [find where name="lan-clients"]
Если у вас плоская очередь из шага 2, достаточно одной команды (и обратной к ней):
/queue simple disable [find where name="lan-pcq"]
/queue simple enable [find where name="lan-pcq"]
Полезно и другое сравнение: оставить включённым только родителя lan-total (выключив lan-clients и server). Так вы увидите разницу между типом очереди по умолчанию и PCQ или CAKE при том же общем лимите.
Типичные ошибки
- Очередь не работает из-за FastTrack. Счётчик
bytesстоит на нуле, а скорость не ограничена. Выключите правилоfasttrackили исключите хосты (шаг 0) и перезапустите закачки: старые соединения остаются FastTracked. - Неверный
target. Вtargetуказан публичный адрес или подсеть, которой нет в LAN, либо вместо192.168.88.51/32случайно записан другой адрес. Очередь определяет upload и download по адресу цели, и если цель указана неправильно, она ничего не поймает. После создания очереди проверьте/queue simple print statsво время нагрузки. - Частная очередь стоит ниже общей. Пакет попадает в первую подходящую очередь, поэтому очередь для одного хоста, расположенная под очередью на всю подсеть, никогда не сработает. Исправляется командой
move. - Перепутаны отдача и приём. В
max-limit=18M/90Mпервым идёт upload. Если записать90M/18M, клиентам разрешат отдавать 90 Мбит/с и принимать 18. То же сqueue=pcq-up/pcq-down: если поменять местами, классификаторы окажутся не на своих направлениях. - Путаница с единицами.
20M— это 20 мегабит в секунду, а не мегабайт. Лимит, выставленный «в мегабайтах», получается в восемь раз больше задуманного. - Лимит равен скорости из договора или двойной шейпер. Если лимит не ниже реальной скорости канала, очередь образуется у провайдера, и задержка под нагрузкой остаётся. А если заданы и
max-limit, иcake-bandwidth, трафик проходит через два шейпера: оставляйтеcake-bandwidth=0или настраивайте оба сознательно.
Что дальше
- MikroTik с нуля 04. Firewall для начинающих — откуда взялось правило
fasttrackи как устроены остальные правила цепочкиforward. - MikroTik с нуля 08. Диагностика и мониторинг — как следить за нагрузкой на процессор и интерфейсы после включения очередей.
- MikroTik с нуля 10. Автоматический бэкап и обновление по расписанию — как сохранить рабочую конфигурацию, прежде чем экспериментировать с лимитами.