Интерактивная система просмотра системных руководств (man-ов)
tc-cbq-details (8)
>> tc-cbq-details (8) ( Русские man: Команды системного администрирования )
tc-cbq-details (8) ( Linux man: Команды системного администрирования )
ИМЯ
CBQ - очередь, базирующая на классах
СИНТАКСИС
tc qdisc ... dev
УСТРОЙСТВО
( parent
classid
| root) [ handle
major:
] cbq avpkt
размер
bandwidth
скорость
[ cell
размер
] [ ewma
степень
] [ mpu
размер
]
tc class ... dev
УСТРОЙСТВО
parent
major:[minor]
[ classid
major:minor
] cbq allot
размер
[ bandwidth
скорость
] [ rate
скорость
] prio
приоритет
[ weight
вес
] [ minburst
количество_пакетов
] [ maxburst
количество_пакетов
] [ ewma
степень
] [ cell
размер
] avpkt
размер
[ mpu
размер
] [ bounded isolated ] [ split
handle
& defmap
defmap
] [ estimator
интервал константа
]
ОПИСАНИЕ
Очередь, базирующая на классах (Class Based Queueing) реализует мощную иерархию классов.
Поддерживает ограничения и приоритеты. Разделение осуществляется
по времени простоя канала, вычисляемого на основании временных характеристик освобождения очереди и полосы
пропускания.
АЛГОРИТМ РАЗДЕЛЕНИЯ
Разделение осуществляется с использованием расчета времени простоя канала и при отклонении от заданных значений выполняются определенные действия.
При ограничении канала 10 мбит/с до 1 мбит/с, полоса простаивает 90% времени. Если это не так,
необходимо распределить трафик так, чтобы полоса простаивала 90% времени.
С точки зрения ядра это сложно вычислить, поэтому CBQ получает время
простоя из количества микросекунд, которые проходят между запросами драйвера устройства пакетов для передачи. Основываясь на знании о
размерах пакетов можно приблизительно оценить насколько загружен или пуст канал.
Это довольно осторожные оценки и они не всегда приводят к правильным результатам. Например, какова действительная скорость канала интерфейса,
если невозможно обеспечить скорость передачи данных 100 мбит/c из-за неверно написанного драйвера? Сетевые карты PCMCIA никогда не позволяют добиться скорости 100 мбит/c из-за архитектурных ограничений шины. Как в этом случае вычислить время простоя?
Физическая пропускная способность канала не может быть правильно определена
для псевдо-сетевых интерфейсов типа PPP через Ethernet или PPTP через TCP/IP. Эффективная пропускная способность в этом случае определяется приблизительно по эффективности каналов (pipes) пользовательского пространства, которые чётко не определены.
Во время операций эффективное время простоя вычисляется по EWMA (exponential
weighted moving average), которое основано на предположении, что последние пакеты экспоненциально
более важные, чем ранние. Средняя загрузка Unix рассчитывается таким же образом.
Вычисленное время простоя вычитается из значения EWMA и получается значение, называемое 'avgidle'.
Идеально загруженный канал имеет значение avgidle равным нулю: пакеты прибывают точно с заданным
интервалом.
Перегруженный канал имеет отрицательное значение avgidle и, если это отрицательное значение
слишком большое по модулю, CBQ забивается.
И наоборот, простаивающий канал имеет большое значение avgidle, которое позволяет
обеспечить канал бесконечного объема после нескольких часов отсутствия пакетов. Для
предотвращения таких перегибов, значение avgidle ограничивается значением
maxidle.
При переполнении канала, в теории, CBQ тоже может забиться на период между отправлением
пакетов. Однако в связи с ограничениями принятие решения по таймеру (см. параметр
minburst
ниже) это невозможно.
РАСПРЕДЕЛЕНИЕ
В рамках одной очереди CBQ может существовать множество классов. Каждый из этих классов
имеет собственную очередь, по умолчанию
tc-pfifo(8).
При постановке пакета в очередь, он попадает в очередь на верхнем уровне и, с использованием
различных методов определяется, какой класс должен получить этот пакет.
Если такой класс определен, процесс классификации повторяется для всех
дочерних классов этого класса, если они есть.
CBQ использует следующие методы для распределения пакета по дочерним классам:
(i)
по skb->priority.
Устанавливается из пользовательского пространства опцией
SO_PRIORITY
в функции setsockopt.
skb->priority
используется только тогда, когда skb->priority содержит идентификатор существующего класса в виде major:minor, который является дочерним для очереди с этим пакетом.
(ii)
по фильтрам, привязанным к этому классу
(iii)
по карте defmap класса, которая задается параметрами
split & defmap .
defmap может содержать инструкции для каждого возможного приоритета пакета Linux.
Каждый класс также имеет
уровень .
Конечные классы, находящиеся в конце иерархии (и не имеющие дочерних классов), находятся на уровне 0.
АЛГОРИТМ РАСПРЕДЕЛЕНИЯ
Распределение идет по циклу, который заканчивается когда найден конечный класс. На любом этапе цикла может быть вызван обработчик ошибок.
Цикл состоит из следующих этапов:
(i)
Если пакет создан локально и содержит правильный идентификатор класса в поле
skb->priority,
выбирается этот класс и цикл заканчивается.
(ii)
Проверка условий фильтров, привязанных к классу. Если это последняя ветвь, закончить работу.
В противном случае повторить операцию.
(iii)
Если фильтры не вернули класс, но вернули идентификатор класса (classid),
попробовать найти класс с таким идентификатором для текущей очереди.
Сравнить
уровни
найденного класса и текущего класса. Если уровень найденного класса меньше и этот класс не является конечным, повторить цикл для этого класса. Если класс конечный, прервать цикл. Если уровень больше, то вызвать обработчик ошибок.
(iv)
Если фильтры не вернули ни класс, ни правильную ссылку на него, определить класс по приоритету. Он ищется в таблице defmap класса. Если по приоритету класс не найден, найти в таблице класс, помеченный как
BEST_EFFORT .
Если уровень этого класса выше или в таблице не определен класс
BEST_EFFORT ,
вызвать обработчик ошибок.
Обработчик ошибок находится вне цикла и состоит из следующих этапов:
(i)
Найти в таблице defmap класс, на который передавать управление в случае ошибки. Если defmap содержит класс с
приоритетом
пакета (указывается в поле TOS), выбрать этот класс и закончить.
(ii)
Найти в таблице класс с приоритетом
BEST_EFFORT .
Если такой класс есть в таблице, выбрать его и закончить.
(iii)
Выбрать класс, на котором произошла ошибка и закончить.
Если пакет поставлен в очередь в случае завершения при обработке ошибки, то, возможно, что он попадет не в конечный класс, а будет поставлен в очередь где-то в середине иерархии.
АЛГОРИТМ РАСПРЕДЕЛЕНИЯ ССЫЛОК (LINK SHARING)
Когда необходимо забрать пакет из очереди для отправки на сетевой интерфейс, CBQ
определяет, из очереди какого класса это необходимо сделать. Это осуществляется
посредством процесса Weighted Round Robin, когда каждый класс получает шанс
отправить пакет. Процесс WRR начинает опрос сначала с классов с наивысшим
приоритетом (с минимальным числом, но более высоким семантически) и, в случае
если очередь этих классов пуста, переходит к менее приоритетным классам.
Каждый класс только освобождает заданное количество данных из очереди на каждом раунде.
Если класс находится близко к переполнению и не отмечен как
bounded ,
он будет пытаться занимать avgidle от соседних классов, которые не помечены как
isolated.
Этот процесс повторяется снизу вверх. Если классу невозможно занять достаточно avgidle для отправки пакета, он забивается и не принимает пакеты, пока avgidle не станет положительным числом.
ОЧЕРЕДЬ
Верхний элемент дерева классов очереди CBQ имеет следующие параметры:
parent major:minor | root
Обязательный параметр, определяющий место экземпляра CBQ: как
root
(корневой) класс сетевого интерфейса или дочерний класс указанного по идентификатору класса.
handle major:
Как и другие типы очередей, CBQ поддерживает идентификатор 'handle' (обработчик), состоящий только из
основного номера и двоеточия после него. Опциональный параметр.
avpkt размер
Средний размер пакета, используемый для вычисления. Как минимум 2/3 от MTU интерфейса. Обязательный
параметр.
bandwidth скорость
Для определения времени простоя, CBQ должна знать скорость физического интерфейса или
родительской очереди. Это очень важный параметр. Объяснения см. ниже. Обязательный
параметр.
cell
Размер ячейки определяет шаг времени передачи пакетов. Значение по умолчанию вполне походит для большинства случаев.
mpu
Пустой пакет также требует некоторое время на передачу. Это значение задает минимальное время отправки пакета.
По умолчанию - 0.
ewma степень
Когда вычисляется среднее время простоя, используется EWMA, которое сглаживает полученное
значение. Степень задает силу сглаживания. Малые значения означают большую чувствительность.
Значение параметра должно быть от 0 до 31. По умолчанию - 5.
Очередь CBQ не разделяет трафик по каналам, она лишь задает параметры об интерфейсе и канале.
Реально трафик разделяется в классах.
КЛАССЫ
Следующие параметры используются для классов:
parent major:minor
Место класса в иерархии. Если класс верхнего уровня, дополнительный
номер может быть опущен. Обязательный параметр.
classid major:minor
Как и очереди, классы могут быть именованы. Основной номер должен
совпадать с основным номером родительской очереди. Если класс имеет
дочерние классы, нужно указать дополнительный номер.
weight вес
При отправке пакетов на интерфейс учитывается вес. Классы с более
высоким весом могут передать больше трафика за раз. Вес классов
нормализуется и в дальнейшем учитываются пропорции, а не числа. По умолчанию - 1.
allot размер
Задает сколько байтов взять из очереди за раз. Вес вычисляется с учётом нормализованного веса класса, описанного выше.
priority приоритет
Классы с меньшим значением приоритета быстрее ставятся на отправку пакетов.
Обязательный параметр.
rate rate
rate скорость
Максимальная скорость для этого класса и всех его дочерних классов. Обязательный параметр.
bandwidth скорость
Параметр для класса отличается от аналогичного параметра для корневой очереди CBQ.
Используется только для определения значений параметров maxidle и offtime, которые
рассчитываются для maxburst или minburst. Обязательный параметр, если указан параметр
maxburst или minburst.
maxburst
Количество пакетов для вычисления значения параметра maxidle. При таком значении
avgidle равно maxidle, то есть количество средних пакетов, которое будет передано до тех пор
как avgidle станет равно 0. Чем выше это значение, тем чаще будут отправки.
Вы не можете установить maxidle напрямую, только через этот параметр.
minburst
Как упомянуто выше, CBQ нужно определить границу переполнения. Идеальным решением будет
сделать это для вычисленного времени простоя и пропустить 1 пакет. Однако ядра Unix
имеют жестко заданные события планировщика с периодом короче 10 мс, поэтому лучше установить
границу на более продолжительный период и затем пропустить пакеты.
Время ожидания называется 'offtime'. Более высокие значения minburst приводят к более
аккуратному разделению на длительном периоде, но к более высоким скачкам в масштабах миллисекунд.
minidle
minidle
Если avgidle меньше 0, очередь перегружена и необходимо подождать, пока значение avgidle будет
достаточно большим для отправки хотя бы одного пакета. Для предотвращения внезапных скачков
во время продленного периода, avgidle сбрасывается до minidle, если оно слишком маленькое.
Minidle указывает отрицательное количество микросекунд, так что заданное значение 10 означает
ограничение avgidle до -10 микросекунд.
bounded
Указывает что класс не получает очереди на отправку от других классов того же уровня
isolated
Указывает что класс не передает очередь на отправку другим классам того же уровня
split major:minor & defmap bitmap[/bitmap]
Если фильтры, привязанные к классу не вынесли решение, может быть проведена классификация
по приоритету пакетов. Доступно 16 приоритетов (от 0 до 15).
defmap определяет какой класс получает пакеты каких приоритетов в виде битовой таблицы. Бит LSB соответствует
приоритету 0. Параметр
split
какому классу передается трафик.
Например, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
задает для класса 10:0 передачу пакетов с приоритетами 6 и 7 классу 10:1.
Дополнительная конфигурация
be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
отправляет все пакеты с приоритетами 0, 1, 2, 3, 4 и 5 классу 10:1.
estimator интервал константа
CBQ устанавливает какую полосу канала может использовать каждый класс, которая необходима
для работы фильтров. Для этого используется простой механизм в виде
интервала
(в микросекундах) когда отправляется трафик. Временная
константа
также задается в микросекундах для EWMA.
Эти значения отражают чувствительность среднего значения от пиков. Более высокое значение означает меньшую чувствительность.
ЛИТЕРАТУРА
o
Sally Floyd and Van Jacobson, "Link-sharing and Resource
Management Models for Packet Networks",
IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
o
Sally Floyd, "Notes on CBQ and Guarantee Service", 1995
o
Sally Floyd, "Notes on Class-Based Queueing: Setting
Parameters", 1996
o
Sally Floyd and Michael Speer, "Experimental Results
for Class-Based Queueing", 1998, not published.