Управление трафиком с помощью ALTQ

ALTQ  –  это  сокращение  понятия  альтернативного  обслуживания,  весьма   гибкого механизма управления сетевым трафиком, который существовал в самостоятельном виде

до  того,  как  был  включён  в  PF  на  OpenBSD1.  В  OpenBSD  ALTQ  был  интегрирован

Хеннингом Брауэром в код PF начиная с релиза OpenBSD 3.3, включая его конфигурацию в pf.conf, поскольку имело смысл объединить его именно с пакетным фильтром. Порты PF для других BSD систем последовали этому примеру, внеся ряд некоторых дополнительных интеграций ALTQ.

Базовые концепции ALTQ

Управление пропускной способностью имеет много общего с контролем  баланса вашей чековой книжки или обработкой других ресурсов, которые  являются дефицитными или

доступны   в   ограниченных   количествах.   Обычно,   ресурсы   доступны   с    жёстким

ограничением верхних пределов, и вам необходимо выделять ресурсы с  максимальной эффективностью, в соответствии с некоторыми приоритетами,  установленными вашими политиками или спецификациями.

Ядро  управления пропускной  способностью  ALTQ  основано на  концепции  очередей. Очереди явлются одной из форм буферов для сетевых пакетов. Пакеты будут находиться в очереди до тех пор, пока они де будут либо  удалены, либо отправлены по пути их следования, в зависимости от  критериев  относящихся к очереди и с учётом доступной пропускной  способности очереди. Очереди прикреплются к конкретным интерфейсам и управление пропускной способностью осуществлется на базе интерфейса, с разделением доступной пропускной способности в определённых вами очередях.

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

После определения очереди вы интегрируете формирование трафиком в  ваш набор правил, переписав свои правила пропуска или правила  соответствия для назначения

трафика на указанные очереди.

Примечание

В установках ALTQ, любой трафик который вы явно не назначали в спецфичную очередь, ставится в очередь по умолчанию.

Планировщики очереди или дисциплины очереди

В сети настроенной по умолчанию, без использования очередей в стиле ALTQ, стек TCP/IP и  его  подсистема  фильтрации  обрабатывают  пакеты  в  порядке  их  поступления  на интерфейс. Это то, что обычно называется дисциплиной  первым вошёл-первым вышел (FIFO). Очереди ALTQ могут быть настроены на совершенно различное поведение, иногда привнося поразительный эффект. Каждый из трёх алгоритмов расписания (планировщика) или  дисциплины  предлагает  свои  собственные  уникальные  наборы  опций.  Эти  типы известны как priq, cbq и hfsc.

•     priq – очереди основанные на приоритетах определяются исключительно с точки зрения установленных приоритетов в общей полосе пропускани. Для очередей типа priq допускается диапазон установки приорита от 0 до 15, где большее значение имеет  более   приоритетный  режим.  Пакеты  которые  соответствуют  критериям высшего приоритета обслуживаются быстрее чем пакеты соответствующие низкому приоритету.

•     cbq – очереди основанные на классах определяют постоянную аренду пропускной способности, как процент от общедоступной или в единицах килобит, мегабит или гигабит   в   секунду.  Очереди   cbq   могут   разделяться  на   очереди,  которым назначается приоритет в диапазане  от 0 до 7, с тем же условием, что высокий приоритет  обслуживается  в  первую очередь. Пакеты находтся в  очереди пока доступна полоса пропускания. Для очередей, которые подразделяются на очереди с приоритетом и ассигнованием пропускной способности, пакеты соответствующие критериям более высокого приоритета обслуживаются быстрее.

•     hfsc  –  дисциплина  hfsc  использует  алгоритм  Hierarchical  Fair   Service   Curve обеспечивающий "справедливое" распределение полосы пропускания для очередей в   иерархии.   hfsc   позволяет   создавать   режим   очереди   с   гарантированным минимальным  выделением  полосы  и  жесткими  верхними  лимитами. Вы  можете ассигнование полосы пропускания, которое может изменяться с течением времени и приоритет в диапазоне от 0 до 7.

•     Оба  алгоритма  и  соответствующие  установки  достаточно  сложные   и   имеют множество    настраиваемых    параметров.    По    этой    причине,    большинство практических  использований  ALTQ   придерживается  простых  типов  очередей. Однако те кто понимает hfsc практически молятся им.

Примечание переводчика

(немного сумбурно получилось, а может так и написано изначально, поэтому приведу более простое описание типов очередей которое имеется в Википедии:

•     CBQ Class Based Queueing. Очереди, присоединенные к интерфейсу, создают дерево. Таким образом, у каждой очереди могут  быть  дальнейшие дочерние очереди.  У  каждой очереди  могут  быть  приоритет  и  присвоенная пропускная способность. Приоритет, главным образом, управляет временем, за которое  пакеты будут отосланы, в то время как другие будут ждать своей очереди. За счёт этого регулируется пропускная способность.

•     PRIQ Priority Queueing. У этих очередей не может быть дочерних очередей. Каждой очереди присваивается уникальный приоритет, в пределах от 0 до 15. Пакеты с высшим номером имеют высший приоритет.

•     HFSC Hierarchical Fair Service Curve. В родительской очереди определяется суммарная пропускная способность для всех очередей интерфейса. Указывается общая пропускная способность, предоставляемая провайдером и не зависящая от скорости сетевого интерфейса. В  дочерней очереди  эта  директива определяет максимальную скорость передачи информации в битах, которая будет обработана очередью в любой момент. )

Установка ALTQ

Включение ALTQ для использования логики очередей в вашем наборе правил, вам могут понадобиться дополнительные шаги, зависящие от того какую операционную систему вы используете.

ALTQ на OpenBSD

На OpenBSD, все поддерживаемые дисциплины очередей собраны в ядра  GENERIC и GENERIC.MP. Для конфигурирования вам необходимо только отредактировать ваш pf.conf.


ALTQ на FreeBSD

На FreeBSD вам необходимо проверить что ваше ядро скомпилировано с  поддержкой опций дисциплин очередей. По умолчанию, ядро FreeBSD  GENERIC  на включает опцию

ALTQ,  и  вы  можете  заметить  это  просматривая  сообщения  выведенные  при  запуске

скрипта /etc/rc.d/pf при включении PF. Соответствующие опции пречислены ниже:

options ALTQ

options ALTQ_CBQ # Class Bases Queuing (CBQ) options ALTQ_RED # Random Early Detection (RED) options ALTQ_RIO # RED In/Out

options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC) options ALTQ_PRIQ # Priority Queuing (PRIQ)

options ALTQ_NOPCC # Required for SMP build

Опции ALTQ необходимы для включения ALTQ в ядре. На SMP системах,  вам также необходима опция ALTQ_NOPCC. В зависимости от типа очереди который вы планируете использовать, вам необходимо включить по меньшей  мере один из типов ALTQ_CBQ, ALTQ_PRIQ, или ALTQ_HFSC. Наконец, вы  можете включить технологию уклонения от перегрузки (congestion-avoidance techniques) Random Early Detection (RED) и RED In/Out совместно  с  опциями  ALTQ_RED  и  ALTQ_RIO,  соответственно.  Обратитесь  к  хендбуку FreeBSD для  получения информации о компиляции и  установки собственного ядра с данными опциями.

ALTQ на NetBSD

ALTQ был интегрирован в реализацию PF NETBSD 4.0 и поддерживается в NetBSD 4.0 и более поздних релизах. Ядро NetBSD GENERIC используемое по умолчанию не включает поддержки опций связанных с ALTQ. Однако, файл конфигурации GENERIC поставляется со  всеми  соответствующими вариантами  требуемых  опций,  закомментированными для простоты включения. Ниже приведены основные параметры ядра:

options ALTQ # Manipulate network interfaces’ output queues options ALTQ_CBQ # Class-Based Queueing

options ALTQ_HFSC # Hierarchical Fair Service Curve options ALTQ_PRIQ # Priority Queueing

options ALTQ_RED # Random Early Detection

Опции ALTQ необходимы для включения ALTQ в ядре. В зависимости от типа  очереди который вы планируете использовать, вам необходимо включить по меньшей мере один из типов ALTQ_CBQ, ALTQ_PRIQ, или ALTQ_HFSC.

Использование ALTQ требует компиляции PF в ядро. Загружаемые модули ядра связанные с PF не поддерживают функционал ALTQ. Для получения более актуальной информации следует  обратиться  к  документации  PF  для  NetBSD  по  адресу  http://www.netbsd.org/ Documentation/network/pf.html.

Установка очередей

Сейчас мы будем рассматривать примеры установки трёх различных типов  очередей ALTQ: основанных на приоритете, основанных на классах и HFSC.

Основной синтаксис PF для очередей ALTQ похож на следующий:

altq on interface type [options … ] main_queue { sub_q1, sub_q2 ..} queue sub_q1 [ options … ]

queue sub_q2 [ options … ] { subA, subB, … } […]

pass [ … ] queue sub_q1 pass [ … ] queue sub_q2

Обратите внимание, что очереди cbq и hfsc могут иметь несколько уровней подочередей. Очереди priq  можно  назвать  плоскими, поскольку они  имеют  только очередь одного уровня. Мы будем рассматривать специфику синтаксиса для каждого типа в следующих разделах.


ВРЕЗКА: ЧТО ТАКОЕ ВАША ОБЩАЯ ПРОПУСКНАЯ СПОСОБНОСТЬ?

Фактически, для очередей может быть трудно определить полезную пропускную способность конкретного интерфейса. Если вы не укажете общую пропускную способность, она будет использована при расчёте ассигнований. Однако, некоторые типы интерфейсов не гарантируют предоставления верной информации о фактическом значении полосы пропускания. Одним из распространённых примеров такого расхождения явлется 100 Мбит Ethernet-интерфейс, в приложении к линии DSL, которая, фактически позволяет только  8Мбит  дл скачивания и 1 МБит для загрузки.* Ethernet-интерфейс может сообщить вам о 100Мбитах пропускной способности, без учёта значений DSL.

Поэтому,  и  как  правило,  имеет  смысл  установить  общую  пропускную  способность  для  фиксированного  значения.  К сожалению, используемое значение не будет именно тем, о котором вам говорит поставщик  канала. всегда присутствуют некоторые накладные расходы, меняющиеся в небольших пределах в  зависимости от технологий и реализации канала. В типовых каналах TCP/IP Ethernet, накладные расходы достаточно низкие. TCP/IP через ATM накладные расходы будут гораздо выше и могут составлять почти 20%. Если информация о пропускной способности не предоставлена поставщиком канала, вам придётся сделать обоснованное предположение её начального значения.  В любом случае, вы должны остро осознавать, что доступная общая пропускная способность никогда не превышает пропускную способность самого слабого линка (канала) в вашем сетевом маршруте.

Очереди поддерживаются только для исходящих соединений системы. При планировании управления полосой пропускания, вы должны рассматривать фактическую полезную пропускную способность соответствующую  самому узкому линку на пути соединения, даже если ваши очереди настроены на различных интерфейсах.

*  Эти цифры реальны сейчас. через несколько лет они могут показаться странными, если не смешными.

Очереди основанные на приоритете

Базовые  концепции  очереди  основанной  на  приоритете  (priq)  довольно  просты,  и возможно даже, являются самыми простыми для понимания. Общая полоса пропускания распределяется в основную очередь, и главное значение  имеет приоритет трафика. Вы определяете значение приоритета в диапазоне от 0 до 15, где наиболее высокое значение соответствует более приоритетному трафику.

Практический пример

В целях практического примера обратимся к Даниэлю Хартмееру. Он обнаружил простой, но весьма эффективный способ улучшения пропускной способности для собственной сети

используя ALTQ. Как и многие другие, Даниэль использовал домашнее  соединение по

ассиметричной  линии  с  достаточно  низкой  пропускной  способностью,  и  чувствовал сильное желание улучшить использование доступной полосы  пропускания. Кроме того, когда   линия   практически   полностью   загружена,   начинают   появляться   некоторые странности. Одна из особенностей указывающая на возможности улучшения – входящий трафик (скачивание, входящая почта и пр.) замедляется диспропорционально всякий раз, когда  возникает исходящий трафик – более чем можно было бы объяснить  передачей сырых данных. Это возвращает нас к базовым особенностям TCP.

Когда отсылается пакет, отправитель ожидает подтверждения (в виде пакета  ACK) от принимающей стороны, и ждёт его прибытия некоторое, определённое время. Если ACK не прибывает в течение заданного интервала времени, отправитель полагает, что пакет не был получен и отправляет пакет повторно. Проблема состоит в том, что в настройках по умолчанию,  пакеты   обслуживаются  последовательно,  по  мере  их  поступления  на интерфейс. Это неизбежно означает, что пакеты ACK, практически не имеющие полезной нагрузки, будут ожидать в очереди, в то время как передаются большие пакеты данных.

Формируется  гипотеза:  если  маленьким  пакетам  ACK,  практически  не  содержащим данных, удастся проскользнуть между большими пакетами данных, это приведёт к более эффективному использованию доступной пропускной способности. Самый простой способ практической реализации и проверкии теории состоял в том, чтобы создать две очереди с разными  приоритетами  и  и   интегрировать  их  в  набор  правил.  Следующие  строки показывают пример соответствующей части набора правил.

ext_if="kue0"

altq on $ext_if priq bandwidth 100Kb queue { q_pri, q_def } queue q_pri priority 7

queue q_def priority 1 priq(default)

pass out on $ext_if proto tcp from $ext_if queue (q_def, q_pri) pass in on $ext_if proto tcp to $ext_if queue (q_def, q_pri)

Здесь, очередь основанная на приоритете устанавливается на внешнем  интерфейсе с

двумя  подчинёнными  очередями. Первая  подочередь, q_pri,  имеет  большее  значение приоритета – значение 7; другая подочередь (q_def) имеет  значительно более низкий приоритет – значение 1. Этот, казалось бы весьма простой набор правил работающий за счёт использования ALTQ обрабатывает очереди с различными приоритетами. Как только соединение назначается в основную очередь, ALTQ проверяет тип каждого пакета по полю типа сервиса  (ToS). Пакеты ACK содержат бит задержки ToS установленный в низкое значение  (low),  который  говорит  о  том,  что  отправитель  хотел  скорейшей  доставки пакета. Когда ALTQ видит пакет с низкой задержкой (low-delay), и  доступны очереди с различными  приоритетами,  он  назначает  пакет  в  высокоприоритетную  очередь.  Это означает, что пакеты ACK сразу  передаются  в очередь с более низким приоритетом и доставляются быстрее, а это, в свою очередь означает, что пакеты данных обслуживаются быстрее.

Конечным  результатом  является  то,  что  такая  конфигурация  обеспечивает  лучшую производительность чем чистая конфигурация FIFO на том же оборудовании и с той же полосой пропускания2.

Использование правила match для назначения очереди

В  предыдущем  примере,  набор  правил  был  построен  традиционным   образом,  с назначением  очереди  как  части  пропускающего  правила.  Тем   не  менее  это  не

единственный способ назначения очереди. Использование правил соответствия  (match)

(доступных в  OpenBSD 4.6 и  старше) позволяет легко модифицировать этот  простой режим приоритетных очередей в существующем наборе правил.

Если вы работаете основываясь на примерах глав 3 и 4, вероятно, что ваш набор правил уже включает правило match, которое используется для nat-to исходящего трафика. Если вы хотите использовать очереди основанные на приоритетах в своем наборе правил, вы можете начать с добавления определения очереди и внесения некоторох незначительных корректировок в исходящие правила match.

Начните  с  определения  очереди  из  предыдущего  примера,  и   настройки   общей пропускной  способности  в  соответствии  с  локальными  условиями  как  в  следующем примере:

altq on $ext_if priq bandwidth $ext_bw queue { q_pri, q_def } queue q_pri priority 7

queue q_def priority 1 priq(default)

Это позволяет определить макрос ext_bw для распределения полосы пропускания на все очереди.  Самый  простой  и  быстрый  способ  интеграции   очередей  в  набор  правил заключается в редактировании исходящего правила match примерно в следующем виде:

match out on $ext_if from $int_if:network nat-to ($ext_if) queue (q_def, q_pri)

Перезагрузите ваш набор правил, и приоритетные очереди будут применены  ко всему трафику инициированному в локальной сети. вы можете использовать команду systat для получения живого обзора назначения трафика очередям.

$ sudo systat queues

Результат выглядит примерно так:

2 users Load 0.39 0.27 0.30 Fri Apr 1 16:33:44 2011

QUEUE  BW  SCH  PR PKTS  BYTES  DROP_P DROP_B QLEN BORROW SUSPE P/S B/S

q_pri

priq

7   21705 1392K    0

0

0

12 803

q_def

priq

12138 6759K    0

0

0

9 4620

Рассматривая цифры в колонках PKTS (пакеты) и BYTES, вы чётко видите, что очереди работают  именно  так,  как  было  задумано.  Очередь  q_pri   обрабатывает  довольно значительное количество пакетов в объёме данных, как собственно и ожидалось. Пакеты ACK не занимают много места. С другой стороны, трафик назначенный в очередь q_def

содержит больше данных в каждом пакете, а цифры, по существу, показывают обратное соотношение числа пакетов к размеру данных по сравнению с очередью q_pri.

Примечание

systat является программой присущей всем BSD системам, а версия используемая в OpenBSD предлагает несколько вариантов представления  информации,  имеющей  отношение  к  PF,  которые  отсутствуют  в  systat   прочих  систем.  Мы  вернёмся  к использованию systat в следующей главе. В тоже время, вам следует изучить  руководство по работе с этой программой и попробовать её. Это весьма полезный инструмент для знакомства с вашей системой.

Источник: Книга о PF, by Peter N.M. Hansteen, Перевод выполнил Михайлов Алексей aka iboxjo

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

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