Современные
информационные технологии
Компьютерная
инженерия
И.А. Гаврилов,
Р.В. Бараненко
Херсонский национальный технический университет
Оптимизация РАБОТЫ шейпера на Linux, iproute2.
Переход от линейных списков фильтров
к хэш-таблицам
В настоящее время администраторы локальных
вычислительных сетей и интернет-провайдеры сталкиваются с проблемой ограничения
пропускной способности канала для отдельного узла сети ниже технических
возможностей канала до узла (шейпингом). Крупные провайдеры и компании используют
для ее решения специализированное оборудование от именитых производителей,
таких как Cisco, Juniper Networks, Redback, Huawei. Платформы этих
производителей запросто могут работать на скоростях в десятки гигабит, но их
цена достаточно высока. Поэтому предприятиями и Ethernet-операторами для целей
шейпинга чаще всего применяются PC-сервера с операционными системами Linux,
*BSD и т.п. На соответствующем аппаратном обеспечении они способны работать с
потоками 500-700 Мбит/с при pps около 100-120 тысяч пакетов в секунду. Для
задач шейпинга очень хорошо зарекомендовала себя операционная система Linux с
ее огромными возможностями по управлению трафиком.
На рис. 1 представлена структура типичной
ЛВС провайдера, либо сеть большого предприятия. При этом доступ к сети Интернет
может обеспечиваться не только посредством PPPoE, но и IPoE, PPTP и т.п. Задача
шейпинга (а также терминации туннелей) возлагается на BRAS.
Пусть имеется небольшая сеть 10.0.0.0/24. Типичная конфигурация шейпера
входящего трафика будет выглядеть следующим образом:
Рис. 1 Структура типичной ЛВС
tc qdisc add dev ifb0 root
handle 1:0 htb default 4
tc class add dev ifb0 parent 1:0 classid 1:100 htb rate 90Mbit
tc class add dev ifb0 parent 1:100 classid 1:1 htb ceil 1Mbit
tc class add dev ifb0 parent 1:100 classid 1:2 htb ceil 2Mbit
tc class add dev ifb0 parent 1:100 classid 1:3 htb ceil 512Kbit
.............
tc class add dev ifb0 parent 1:100 classid 1:fe htb ceil 8Mbit
tc filter add dev ifb0 protocol ip parent 1:0 u32 match u32 0x0a000001
0xffffffff at 16 classid 1:1
tc filter add dev ifb0 protocol ip parent 1:0 u32 match u32
0x0a000002 0xffffffff at 16 classid 1:2
.............
tc filter add dev ifb0 protocol ip parent 1:0 u32 match u32
0x0a0000fe 0xffffffff at 16 classid 1:fe
В случае использования данной конфигурации
среднее количество сравнений, выполняемых фильтрами, составляет около 128. При
достаточно большом суммарном трафике (достаточно 100 Мбит/с) и невысокой
производительности аппаратного обеспечения получается нагрузка на процессор
80-90%, нестабильная задержка прохождения пакетов и т.п.
Целью работы является оптимизация
механизма фильтрации пакетов с использованием хэш-таблиц фильтров iproute2.
Хэш-таблицу можно представить в виде
таблицы, имеющей 4095 строк и до 256 столбцов, имеющих собственный номер.
Образный пример такой таблицы показан на рис. 2.
1::
|
1:0: |
1:1: |
1:2: |
1:3: |
::0 |
|
1:1:0 |
|
|
::1 |
|
|
|
|
... |
... |
... |
... |
... |
::800 |
|
|
|
|
::801 |
|
|
1:2:801 |
|
... |
... |
... |
... |
... |
::ffe |
|
|
|
|
::fff |
|
|
|
|
Рис. 2 Представление хэш-таблицы
По умолчанию всегда создается таблица с
номером 800::, которая имеет один столбец. В нее изначально попадают все
пакеты. В каждой ячейке таблицы может быть правило. Если не указано, в какую
ячейку записывать правило, то оно по умолчанию записывается в ячейку с номером
800.
Смысл использования хэш-таблиц сводится к
тому, чтобы на основании какого-либо байта (или нескольких) в пакете сделать
вывод о расположении правила в таблице и сразу направить пакет к нему. Т.е.
вместо 254 проверок производится всего одна. Далее показан вариант
конфигурирования фильтров шейпера с использованием хэш-таблиц.
Для начала создается таблица с номером 1 и
256-ю столбцами:
tc filter add dev ifb0
protocol ip parent 1:0 handle 1:: u32 divisor 256
После этого в каждый столбец таблицы 1
отправляются пакеты, последний октет которых будет равен номеру столбца.
Например, пакет с адресом назначения 10.0.0.15 будет отправлен в 1:0f: (15-й
столбец таблицы 1):
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 800:: match u32 0x0a000000 0xffffff00 at 16
hashkey mask 0x000000ff at 16 link 1:
Стоит напомнить, что изначально правила
попадают в таблицу 800:: и именно к ней должно добавляться правило, которое
распределяет пакеты по другим таблицам. Ключевые слова hashkey mask 0x000000ff
at 16 говорят о том, что распределение по столбцам таблицы 1:: делается на
основании последних 8 бит адреса назначения.
После этого в каждый столбец добавляется
правило:
tc filter add dev ifb0 protocol ip parent 1:0 u32
ht 1:1: match u32 0x0a000001 0xffffffff at 16 classid 1:1
tc filter add dev ifb0 protocol ip parent 1:0 u32
ht 1:2: match u32 0x0a000002 0xffffffff at 16 classid 1:2
.........
tc filter add dev ifb0 protocol ip parent 1:0 u32
ht 1:fe: match u32 0x0a0000fe 0xffffffff at 16 classid 1:fe
При необходимости классификации и шейпинга
трафика хостов сетей размером более /24 (более 256 хостов), например сеть /20,
возможно использование следующих вариантов:
1) Модифицирование предыдущего примера:
хеширование провести по последнему байту адреса назначения, а в каждый столбец
вместо одного правила добавить 16 (24), которые будут отбирать
пакеты на основании предпоследнего октета. Например, для пакетов с адресами
назначения вида 10.0.Х.126, которые будут отправляться в столбец 7Е (126 в
десятичном виде) таблицы 1::
tc filter add dev ifb0 protocol ip parent 1:0 u32
ht 1:7e: match u32 0x0a00007e 0xffffffff at 16 classid 1:7e
tc filter add dev ifb0 protocol ip parent 1:0 u32
ht 1:7e: match u32 0x0a00017e 0xffffffff at 16 classid 1:17e
.........
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 1:7e: match u32 0x0a00087e 0xffffffff at 16
classid 1:87e
2) Создание таблицы на 16 столбцов и
распределение пакетов по ним (16 столбцам) на основании предпоследнего байта
адреса назначения, а в каждом столбце будет правило, отправляющее пакеты на
основании последнего байта адреса назначения в 16 таблиц на 256 столбцов:
tc filter add dev ifb0
protocol ip parent 1:0 u32
tc filter add dev ifb0
protocol ip parent 1:0 handle 100: u32 divisor 16
tc filter add dev ifb0
protocol ip parent 1:0 handle 1: u32 divisor 256
tc filter add dev ifb0
protocol ip parent 1:0 handle 2: u32 divisor 256
......
tc filter add dev ifb0
protocol ip parent 1:0 handle 16: u32 divisor 256
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 800:: match u32 0x0a000000 0xffff0000 at 16
hashkey mask 0x00000f00 at 16 link 100:
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 100:0: match u32 0x0a000000 0xffffff00 at 16
hashkey mask 0x000000ff at 16 link 1:
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 100:1: match u32 0x0a000100 0xffffff00 at 16
hashkey mask 0x000000ff at 16 link 2:
.......
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 100:f: match u32 0x0a000f00 0xffffff00 at 16
hashkey mask 0x000000ff at 16 link 16:
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 1:1: match u32 0x0a000001 0xffffffff at 16
classid 1:1
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 1:2: match u32 0x0a000002 0xffffffff at 16
classid 1:2
.........
tc filter add dev ifb0
protocol ip parent 1:0 u32 ht 1:ff: match u32 0x0a0000ff 0xffffffff at 16
classid 1:ff
tc filter add
dev ifb0 protocol ip parent 1:0 u32 ht 2:0: match u32 0x0a000100 0xffffffff at
16 classid 1:100
tc filter add
dev ifb0 protocol ip parent 1:0 u32 ht 2:1: match u32 0x0a000101 0xffffffff at
16 classid 1:101
.........
tc filter add
dev ifb0 protocol ip parent 1:0 u32 ht 2:ff: match u32 0x0a0001ff 0xffffffff at
16 classid 1:1ff
.........
.........
tc filter add
dev ifb0 protocol ip parent 1:0 u32 ht 16:0: match u32 0x0a000f00 0xffffffff at
16 classid 1:f00
tc filter add
dev ifb0 protocol ip parent 1:0 u32 ht 16:1: match u32 0x0a000f01 0xffffffff at
16 classid 1:f01
.........
tc filter add
dev ifb0 protocol ip parent 1:0 u32 ht 16:fe: match u32 0x0a000ffe 0xffffffff
at 16 classid 1:ffe
Предложенный способ повышает
производительность шейпера, который несколько сложнее в настройке, но может обеспечить
повышение производительности PC-сервера, выполняющего роль BRASа, в 10-20 раз,
что для BRASов существенно важно, так как шейпинг не единственная задача этого
класса устройств.
Литература:
1. http://www.opennet.ru/docs/RUS/LARTC/index.html
2. http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2