Классовая дисциплина PRIO, информация для понимания параметра priomap

Автор gardarea51, 30 января 2014, 19:58:34

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

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

gardarea51

Всем привет, недавно я задался вопросом по дисциплине PRIO, о которой в LARTC написано не очень много. Хотя писать о ней особо и нечего, но смутил меня следующий момент: по молчанию PRIO создает 3 полосы (класса) с дефолтным значением таблицы priomap (bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1). В LARTC написано, что если мы меняем число полос/классов (bands), то нужно поменять параметр priomap. И это я никак не мог понять, а как же его поменять.. задал вопрос на LOR'е и сам же на него ответил. Решил продублировать сюда - вдруг кому пригодится.

Объясню суть вкратце, а потом немного деталей. К примеру нам нужно создать PRIO с 4мя классами (1:1, 1:2, 1:3, 1:4, максимум их может быть 16), делаем это так:
tc qdisc add dev eth0 root handle 1: prio bands 4
Суть: если трафик правильно классифицируется (нашими фильтрами) и попадает в нужные классы, то обрабатывается с приоритетом от 0 до 3 (соответственно для каждого класса), а неклассифицированный трафик обрабатывается по флагам TOS и попадает в первые 3 класса: 1:1, 1:2, 1:3 из-за того, что мы не меняли таблицу priomap.

Теперь больше информации для полного понимания. В сети об этом написано довольно подробно, но мне было довольно сложно понять что написано =):
Цитироватьpriomap classForPrio_0 classForPrio_1 ... classForPrio_15
This option defines a table which is used to assign a packet to a class based on its :priority:. It is only used if the packet is not assigned a class by a classifier. There is one entry in the table per packet priority, so the table has 16 entries. The first entry in the table contains the class number for priority 0 packets, the second entry contains the class number for priority 1 packets, and so on. Class number 0 means classid N:1, class number 1 means classid N:2, etc. The «priomap» option must be the last one in the command line. The «priomap» keyword is followed by the class numbers for each priority in asceding priority number order. If not specified this default priomap is used:
priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
If you supply less than 16 class numbers the ones you do supply are used to fill in the first entries in the table. The default map is used for the remaining entries.
Вот мой корявый перевод:
Цитироватьpriomap classForPrio_0 classForPrio_1... classForPrio_15
Эта опция определяет таблицу, которая используется для назначения пакету класса исходя из его «приоритета». Это используется только тогда, когда пакету не был присвоен класс классификатором. Здесь каждая запись в таблице определяет приоритет пакета, всего может быть 16 записей. Первая запись в таблице содержит номер класса для пакетов 0го приоритета, вторая запись содержит номер класса для пакетов 1го и так далее. Класс номер 0 означает classid N:1, класс номер 1 означает classid N:2 и т.д. Опция «priomap» должна быть последней в строке команды. Ключевое слово «priomap» определяет номера классов для каждого приоритета в соответствии с порядковым номером. Если значение не указано, то умолчально priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1. Если вы укажете меньше 16ти номеров классов они будут использоваться для заполнения первых записей в таблице. По умолчанию карта используется для остальных записей (прим. переводчика - видимо для записей, которые не были классифицированы фильтрами).
Вот еще цитата (с сайта Хакер, спасибо автору - Евгению Зобнину):
ЦитироватьКлассовая дисциплина prio предназначена для классификации трафика с помощью фильтров или приоритезации. По умолчанию prio содержит три класса, в каждом из которых находится обычная дисциплина FIFO. Когда сетевая карта обращается за очередным пакетом, проверяется класс :1. Если он не содержит пакетов, проверяется класс :2 и только в последнюю очередь - :3. Получается, что пакеты класса :1 получают наивысший приоритет, а :3 - наименьший. Решение о том, в какой класс направить трафик, дисциплина prio принимает на основе поля TOS сетевого пакета.
Получается, что при добавлении следующей дисциплины:
tc qdisc add dev eth0 root handle 1: prio
рисуется такая картинка:
TOS (0-15) 0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
    priomap 1   2   2   2   1   2   0   0   1   1   1   1   1   1   1  1   
prio       |   |   |   
  0   1:1   |   |   |   
  1   1:2---+   |   |   
  2   1:3-------+---+   

Пакеты с TOS 0 будут отправлены в полосу с приоритетом 1, пакеты с TOS 1 будут отправлены в полосу с приоритетом 2... пакеты с TOS 6 будут отправлены в полосу с приоритетом 0. Это поведение по-умолчанию. Его можно изменить, добавив опцию priomap, к примеру так:
tc qdisc add dev eth0 root handle 1: prio bands 4 priomap 0 1 2 3
Здесь заодно создается не 3, а 4 класса (максимум можно создать 16) с приоритетами 0-3. В умолчальной таблице priomap будут изменены первые 4 значения, вписанные здесь, остальные останутся умолчальными (TOS). И эти первые 4 значения будут определяться как classForPrio_0 classForPrio_1... classForPrio_15
TOS (0-15) 0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
    priomap 0   1   2   3   1   2   0   0   1   1   1   1   1   1   1  1   
prio       |   |   |   |
  0   1:1---+   |   |   |   
  1   1:2-------+   |   |
  2   1:3-----------+   |
  3   1:4---------------+

Если в команде добавления дисциплины задать priomap полностью (16 значений вместо 4х), то можно раскидать пакеты c метками TOS(0-15) уже по 4м классам. Значения здесь должны быть в пределах 0-3.

Но... это все относится только к распределению пакетов с метками TOS по некому количеству классов дисциплины PRIO, которую мы создали. Самое важное, что при наличии у нас фильтров, которые классифицируют трафик и отправляют его в классы 1:1 - 1:4 (в нашем случае будет 4 класса) - трафик будет обрабатываться по приоритетам, у класса 1:1 приоритет 0, у класса 1:2 приоритет 1... у класса 1:4 приоритет 3.

Вывод: при наличии классификаторов, трафик идет в нужные классы, которые обрабатываются по их приоритету, а пакеты с меткой TOS, если не задавать priomap будут обрабатываться первыми 3мя классами. Вроде выходит, что TOS надо бы раскидать по всем классам (в данном случае по 4м), но вроде бы и нафиг оно надо, потому что метку TOS ставят не просто так и пусть эти пакеты и обрабатываются шустрыми первыми 3мя классами.