Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
dpi:dpi_components:platform:dpi_config:admin_dpsk:start [2021/04/14 16:12] – mkhizhinsky | dpi:dpi_components:platform:dpi_config:admin_dpsk:start [2022/03/30 09:05] (текущий) – удалено edrudichgmailcom | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== 3 Настройка DPDK версии ====== | ||
- | {{indexmenu_n> | ||
- | [[https:// | ||
- | |||
- | ==== Подготовка системы ==== | ||
- | |||
- | Начальная установка DPI делается техподдержкой VAS Experts, просьба не пытаться делать начальную установку самостоятельно, | ||
- | потом может потребоваться проверить все сделанные вами шаги, что увеличивает трудоемкость работ ТП. | ||
- | |||
- | Далее вы сможете самостоятельно добавить или удалить сетевые порты и изменить конфигурацию. | ||
- | |||
- | ==== Конфигурирование портов ==== | ||
- | |||
- | Сетевые карты, с которыми будет работать СКАТ, выведены из-под управления операционной системы и поэтому как Ethernet устройства для нее не видны. | ||
- | DPDK адресует Ethernet устройства по их PCI идентификаторам, | ||
- | < | ||
- | lspci -D|grep Eth | ||
- | |||
- | 0000: | ||
- | 0000: | ||
- | </ | ||
- | Эта команда выведет список всех PCI-устройств типа ethernet. Каждая строка начинается с системного идентификатора PCI-устройства, | ||
- | |||
- | Список карт в режиме DPDK можно проверить командой: | ||
- | < | ||
- | driverctl list-overrides | ||
- | |||
- | 0000: | ||
- | 0000: | ||
- | </ | ||
- | |||
- | При необходимости карты можно вывести из режима DPDK командой, | ||
- | < | ||
- | driverctl unset-override 0000: | ||
- | driverctl unset-override 0000: | ||
- | </ | ||
- | |||
- | После работ со штатных драйвером не забудьте вернуть их обратно под управление DPDK командой | ||
- | < | ||
- | driverctl -v set-override 0000: | ||
- | driverctl -v set-override 0000: | ||
- | </ | ||
- | <note important> | ||
- | <note important> | ||
- | driverctl list-overrides | ||
- | 0000: | ||
- | В этом случае рекомендуется перейти на использование драйвера vfio-pci | ||
- | для чего выполнить команды | ||
- | < | ||
- | driverctl -v set-override 0000: | ||
- | для всех устройств из списка возращаемого list-overrides | ||
- | </ | ||
- | |||
- | ==== Конфигурирование СКАТ ==== | ||
- | После того, как система настроена для работы с DPDK, можно приступать к конфигурированию СКАТ. Интерфейсы конфигурируются парами «вход»-«выход» (для последующего удобства конфигурирования опций интерфейс «вход» должен быть обращен во внутреннюю сеть оператора, | ||
- | < | ||
- | # Вход - порт 41:00.0 | ||
- | in_dev=41-00.0 | ||
- | # Выход - порт 41:00.1 | ||
- | out_dev=41-00.1 | ||
- | </ | ||
- | Такая конфигурация задает единственный мост 41-00.0 ←→ 41-00.1 \\ | ||
- | Можно указывать группу интерфейсов через ':' | ||
- | < | ||
- | in_dev=41-00.0: | ||
- | out_dev=41-00.1: | ||
- | </ | ||
- | Эта группа образует следующие пары (мосты): | ||
- | 41-00.0 ←→ 41-00.1 \\ | ||
- | 01-00.0 ←→ 01-00.1 \\ | ||
- | 05-00.0 ←→ 05-00.1 \\ | ||
- | В парах должны быть устройства одинаковой скорости; | ||
- | |||
- | Maксимальный размер ethernet-пакета на девайсах задается опцией '' | ||
- | |||
- | ==== Задание псевдонимов девайсов ==== | ||
- | В СКАТ 9.5.3 появилась возможность задавать псевдонимы (alias) девайсов. Вызвано это тем, что DPDK поддерживает большое количество девайсов, | ||
- | |||
- | Суть псевдонима очень проста: | ||
- | |||
- | Каждый псевдоним задается отдельным параметром '' | ||
- | < | ||
- | dpdk_device=alias: | ||
- | </ | ||
- | здесь: | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | Например: | ||
- | < | ||
- | # eth1 - псевдоним PCI-девайса 41:00.0 | ||
- | dpdk_device=eth1: | ||
- | # eth2 - псевдоним PCI-девайса 41:00.1 | ||
- | dpdk_device=eth2: | ||
- | |||
- | in_dev=eth1 | ||
- | out_dev=eth2 | ||
- | </ | ||
- | Это описание эквивалентно следующему: | ||
- | < | ||
- | in_dev=41-00.0 | ||
- | out_dev=41-00.1 | ||
- | </ | ||
- | Отметим, | ||
- | |||
- | <note tip> | ||
- | |||
- | Если требуется подключить Hyper-V девайсы (а это не PCI, а VMbus-девайсы), | ||
- | < | ||
- | dpdk_device=subs1: | ||
- | dpdk_device=subs2: | ||
- | dpdk_device=inet1: | ||
- | dpdk_device=inet2: | ||
- | in_dev=subs1: | ||
- | out_dev=inet1: | ||
- | </ | ||
- | Здесь мы не только задаем псевдоним, | ||
- | |||
- | ==== Конфигурирование в Hyper-V ==== | ||
- | Начиная с версии 9.5.3, СКАТ поддерживает работу в виртуальной машине Hyper-V. | ||
- | На гостевой CentOS-8 должны быть установлены: | ||
- | < | ||
- | # Поддержка multi-queue - необходима для СКАТ | ||
- | dnf install kernel-modules-extra | ||
- | </ | ||
- | <note important> | ||
- | |||
- | Девайсы в Hyper-V являются VMBus-, а не PCI-девайсами, | ||
- | Каждый девайс (интерфейс) идентифицируется своим уникальным идентификатором UUID, поэтому сначала нужно узнать UUID всех интерфейсов, | ||
- | < | ||
- | # переводим интерфейсы eth0 и eth2 в DPDK-режим | ||
- | for DEV in eth0 eth2 | ||
- | do | ||
- | # получаем UUID девайса | ||
- | DEV_UUID=$(basename $(readlink / | ||
- | # переводим в DPDK compatible mode | ||
- | driverctl -b vmbus set-override $DEV_UUID uio_hv_generic | ||
- | |||
- | # Device appears in | ||
- | # / | ||
- | |||
- | echo "$DEV uuid=$DEV_UUID" | ||
- | done | ||
- | </ | ||
- | При необходимости интерфейс может быть переведен обратно в kernel-режим так: | ||
- | < | ||
- | ETH0_UUID=< | ||
- | driverctl -b vmbus unset-override $ETH0_UUID | ||
- | </ | ||
- | |||
- | Далее конфигурируем СКАТ - задаем девайсы в '' | ||
- | < | ||
- | # eth0 UUID=392b7b0f-dbd7-4225-a43f-4c926fc87e39 | ||
- | dpdk_device=eth0: | ||
- | # eth2 UUID=34f1cc16-4b3f-4d8a-b567-a0eb61dc2b78 | ||
- | dpdk_device=eth2: | ||
- | |||
- | # далее везде используем псевдонимы eth0 и eth2 при указании девайсов | ||
- | in_dev=eth0 | ||
- | out_dev=eth2 | ||
- | </ | ||
- | |||
- | ==== Кластеры ==== | ||
- | DPDK-версия СКАТ поддерживает кластеризацию: | ||
- | < | ||
- | in_dev=41-00.0|01-00.0: | ||
- | out_dev=41-00.1|01-00.1: | ||
- | </ | ||
- | Этот пример создает два кластера: | ||
- | * кластер с мостом 41-00.0 ←→ 41-00.1 | ||
- | * кластер с мостами 01-00.0 ←→ 01-00.1 и 05-00.0 ←→ 05-00.1 | ||
- | Кластеры являются в большей мере наследием pf_ring-версии СКАТ: в pf_ring кластер является базовым понятием, | ||
- | |||
- | В DPDK кластеры также изолированы друг от друга, но в отличие от pf_ring здесь кластер - понятие во многом логическое, | ||
- | <note tip> | ||
- | Далее при описании конфигураций предполагается, | ||
- | |||
- | ==== Число ядер (потоков) ==== | ||
- | Ядра CPU являются, | ||
- | <note important> | ||
- | Для работы СКАТу нужны следующие потоки: | ||
- | * потоки обработки - обрабатывают входящие пакеты, | ||
- | * потоки диспетчера - читают RX-очереди карты и раскидывают входящие пакеты по потокам обработки; | ||
- | * служебные потоки - выполняют отложенные (продолжительные) действия, | ||
- | * системное ядро - выделено для работы операционной системы. | ||
- | Потоки обработки и диспетчера не могут располагаться на одном ядре. При старте СКАТ привязывает потоки к ядрам. | ||
- | СКАТ по умолчанию выбирает число потоков-обработчиков в зависимости от скорости интерфейса: | ||
- | 10G - 4 потока\\ | ||
- | 25G - 8 потоков\\ | ||
- | 40G, 50G, 56G - 16 потоков\\ | ||
- | 100G - 32 потока\\ | ||
- | Для группы число потоков равно сумме числа потоков для каждой пары; например, | ||
- | < | ||
- | # 41-00.x - 25G NIC | ||
- | # 01-00.x - 10G NIC | ||
- | in_dev=41-00.0: | ||
- | out_dev=41-00.1: | ||
- | </ | ||
- | будет создано 12 потоков обработки (8 для 25G карты и 4 для 10G) | ||
- | |||
- | В fastdpi.conf можно явно указать число потоков на мост с помощью параметра '' | ||
- | < | ||
- | # 41-00.x - 25G NIC | ||
- | # 01-00.x - 10G NIC | ||
- | in_dev=41-00.0: | ||
- | out_dev=41-00.1: | ||
- | |||
- | num_threads=4 | ||
- | </ | ||
- | Такая конфигурация создаст 8 (num_threads=4 * 2 моста) потоков обработки. | ||
- | |||
- | <note important> | ||
- | |||
- | Кроме потоков-обработчиков, | ||
- | Внутренняя архитектура работы с одним или множеством диспетчеров разительно отличается, | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | |||
- | Далее подробно описываются все эти движки, | ||
- | === Явная привязка к ядрам === | ||
- | Можно задать в fastdpi.conf явную привязку потоков к ядрам. За это отвечают параметры: | ||
- | * '' | ||
- | * '' | ||
- | |||
- | Формат задания этих списков одинаков: | ||
- | < | ||
- | # 10G карты - 4 потока обработчика, | ||
- | in_dev=01-00.0|02-00.0 | ||
- | out_dev=01-00.1|02-00.1 | ||
- | |||
- | # Привязываем потоки обработки для кластера #1 к ядрам 2-5, диспетчер - к ядру 1 | ||
- | # для кластера #2 к ядрам 7-10, диспетчер - к ядру 6 | ||
- | engine_bind_cores=2: | ||
- | rx_bind_core=1|6 | ||
- | </ | ||
- | Для бескластерного задания: | ||
- | < | ||
- | # 10G карты - 4 потока обработчика на карту | ||
- | in_dev=01-00.0: | ||
- | out_dev=01-00.1: | ||
- | # 2 диспетчера (по направлениям) | ||
- | dpdk_engine=1 | ||
- | |||
- | # Привязка потоков обработчиков и диспетчеров | ||
- | engine_bind_cores=3: | ||
- | rx_bind_core=1: | ||
- | </ | ||
- | |||
- | Как уже отмечалось, | ||
- | <note tip> | ||
- | <note important> | ||
- | ==== Загрузка потока диспетчера ==== | ||
- | Значение загрузки потока диспетчера, | ||
- | <note tip> | ||
- | < | ||
- | top -H -p `pidof fastdpi` | ||
- | </ | ||
- | </ | ||
- | Истинное состояние каждого диспетчера можно увидеть в fastdpi_stat.log, | ||
- | < | ||
- | [STAT ][2020/ | ||
- | drop (worker queue full) | ||
- | Cluster #0: | ||
- | </ | ||
- | здесь '' | ||
- | |||
- | Также хорошим индикатором, | ||
- | * либо слишком мало потоков-обработчиков, | ||
- | * либо трафик сильно перекошен и большинство пакетов попадает в один-два обработчика, | ||
- | |||
- | |||
- | ==== dpdk_engine=0: | ||
- | В этом режиме работы СКАТ создает один поток диспетчера на кластер. | ||
- | Диспетчер читает входящие пакеты со всех in_dev и out_dev устройств и раскидывает пакеты по потокам обработчиков. | ||
- | Подходит для 10G карт, выдерживает нагрузку до 20G и более (зависит от модели CPU и режима разбора туннелей [[dpi: | ||
- | |||
- | <note tip> | ||
- | |||
- | СКАТ конфигурирует карты следующим образом: | ||
- | * RX queue count = 1 | ||
- | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. | ||
- | ==== dpdk_engine=1: | ||
- | В этом режиме создается два потока диспетчера: | ||
- | Подходит для нагрузок свыше 20G (карты 25G, 40G). | ||
- | <note tip> | ||
- | |||
- | СКАТ конфигурирует карты следующим образом: | ||
- | * RX queue count = 1 | ||
- | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. | ||
- | ==== dpdk_engine=2: | ||
- | В данном режиме задействуется RSS (receive side scaling) карты. | ||
- | Значение RSS задается в fastdpi.conf параметром | ||
- | < | ||
- | dpdk_rss=2 | ||
- | </ | ||
- | Значение '' | ||
- | Для каждого направления создается '' | ||
- | <note tip> | ||
- | Подходит для мощных карт 50G+ (то есть для СКАТ-100+). Если у вас 50G набрано из нескольких карт группировкой, | ||
- | |||
- | СКАТ конфигурирует карты следующим образом: | ||
- | * RX queue count = '' | ||
- | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. | ||
- | ==== dpdk_engine=3: | ||
- | Для каждого моста создается отдельный поток диспетчера. | ||
- | Предназначен для конфигураций со множеством девайсов на входе и выходе: | ||
- | < | ||
- | in_dev=01-00.0: | ||
- | out_dev=01-00.1: | ||
- | dpdk_engine=3 | ||
- | </ | ||
- | Для данного примера создается три потока диспетчеров: | ||
- | * для моста 01-00.0 <--> 01-00.1 | ||
- | * для моста 02-00.0 <--> 02-00.1 | ||
- | * для моста 03-00.0 <--> 03-00.1 | ||
- | |||
- | <note tip> | ||
- | |||
- | Данный движок предназначен для нескольких карт 25G/40G/50G в группе (то есть для СКАТ-100+) | ||
- | |||
- | СКАТ конфигурирует карты следующим образом: | ||
- | * RX queue count = 1 | ||
- | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. | ||
- | ==== dpdk_engine=4: | ||
- | Для каждого порта (девайса) создается отдельный поток диспетчера. | ||
- | Предназначен для конфигураций со множеством девайсов на входе и выходе: | ||
- | < | ||
- | in_dev=01-00.0: | ||
- | out_dev=01-00.1: | ||
- | dpdk_engine=4 | ||
- | </ | ||
- | Для данного примера создается шесть потоков диспетчеров - для каждого девайса по диспетчеру. Очевидно, | ||
- | |||
- | <note tip> | ||
- | |||
- | Данный движок предназначен для нескольких карт 25G/40G/50G в группе (то есть для СКАТ-100+) | ||
- | |||
- | СКАТ конфигурирует карты следующим образом: | ||
- | * RX queue count = 1 | ||
- | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. |