| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| dpi:dpi_components:platform:dpi_config [2023/11/09 09:27] – elena.krasnobryzh | dpi:dpi_components:platform:dpi_config [2026/06/03 11:10] (текущий) – [dpdk_engine=7: Явное указание диспетчеров] elena.krasnobryzh |
|---|
| ======dpi_config====== | ====== Настройка DPDK интерфейсов ====== |
| | {{indexmenu_n>1}} |
| | |
| | [[https://www.dpdk.org/|DPDK]] (Data Plane Development Kit) позволяет работать с сетевыми картами напрямую, фактически без посредничества ядра Linux, тем самым повышается производительность решения. DPDK поддерживает намного больше моделей сетевых карт, чем pf_ring, и намного более богатый интерфейс работы с ними, что позволяет реализовать различные схемы работы с картами, подходящие как для 10G трафика, так и для трафика 25G, 40G, 100G и т.д. |
| | |
| | ===== Подготовка системы ===== |
| | |
| | Начальная установка DPI делается техподдержкой VAS Experts, просьба не пытаться делать начальную установку самостоятельно, так как |
| | потом может потребоваться проверить все сделанные вами шаги, что увеличивает трудоемкость работ ТП. |
| | |
| | Далее вы сможете самостоятельно добавить или удалить сетевые порты и изменить конфигурацию. |
| | |
| | ===== Конфигурирование портов ===== |
| | |
| | <note important>Обратите внимание, что сетевые карты Mellanox нельзя переводить под DPDK с помощью утилиты driverctl — на них драйвер устанавливается иным способом. Также они остаются под управлением системы, в связи с чем интерфейсы будут отображаться в выводе утилит ip/ipconfig. |
| | При необходимости установить драйвер для поддержки DPDK на сетевые карты Mellanox, необходимо [[dpi:techsupport_info|обратиться в техническую поддержку]].</note> |
| | |
| | Сетевые карты, с которыми будет работать СКАТ, выведены из-под управления операционной системы и поэтому как Ethernet устройства для нее не видны. |
| | DPDK адресует Ethernet устройства по их PCI идентификаторам, которые можно получить командой: |
| | <code> |
| | lspci -D|grep Eth |
| | |
| | 0000:04:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) |
| | 0000:04:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) |
| | </code> |
| | Эта команда выведет список всех PCI-устройств типа ethernet. Каждая строка начинается с системного идентификатора PCI-устройства, - именно эти PCI-идентификаторы являются уникальными идентификаторами сетевой карты в DPDK. |
| | |
| | Список карт в режиме DPDK можно проверить командой ''[[dpi:dpi_components:utilities:management_utilities|driverctl list-overrides]]''.\\ Вывод: |
| | <code> |
| | 0000:04:00.0 vfio-pci |
| | 0000:04:00.1 vfio-pci |
| | </code> |
| | |
| | При необходимости карты можно вывести из режима DPDK [[dpi:dpi_components:utilities:management_utilities|командой]], при этом для них активируется штатный драйвер Linux. |
| | |
| | Предварительно остановить процесс Fastdpi |
| | |
| | <code> |
| | service fastdpi stop |
| | </code> |
| | |
| | <code> |
| | driverctl unset-override 0000:04:00.0 |
| | driverctl unset-override 0000:04:00.1 |
| | </code> |
| | |
| | После работ со штатных драйвером не забудьте вернуть их обратно под управление DPDK [[dpi:dpi_components:utilities:management_utilities|командой]] |
| | <code> |
| | driverctl -v set-override 0000:04:00.0 vfio-pci |
| | driverctl -v set-override 0000:04:00.1 vfio-pci |
| | </code> |
| | <note important>При переводе карт в режим DPDK будьте внимательны и не переведите случайно управляющий интерфейс сервера в режим DPDK - связь с сервером сразу прервется!</note> |
| | <note important>В старых инсталляциях вместо vfio-pci использовался драйвер igb_uio, что можно увидеть в выводе команды<code> |
| | driverctl list-overrides |
| | 0000:04:00.0 igb_uio</code> |
| | В этом случае рекомендуется перейти на использование драйвера vfio-pci |
| | для чего выполнить команды |
| | <code>echo "options vfio enable_unsafe_noiommu_mode=1" > /etc/modprobe.d/vfio-noiommu.conf |
| | driverctl -v set-override 0000:04:00.0 vfio-pci</code> |
| | для всех устройств из списка возращаемого list-overrides. |
| | Установка ''enable_unsafe_noiommu_mode=1'' может потребовать ребута сервера. |
| | </note> |
| | |
| | ===== Конфигурирование СКАТ ===== |
| | После того, как система настроена для работы с DPDK, можно приступать к конфигурированию СКАТ. Интерфейсы конфигурируются парами «вход»-«выход» (для последующего удобства конфигурирования опций интерфейс «вход» должен быть обращен во внутреннюю сеть оператора, а «выход» в сторону аплинка). Каждая пара образует сетевой мост, прозрачный на уровне L2. В качестве имен интерфейсов выступают PCI-идентификаторы с заменой ':' на '-' (так как символ ':' в имени интерфейса зарезервирован в СКАТ для разделения интерфейсов в одном кластере) и без начального префикса "0000:" - он у всех одинаковый: |
| | <code> |
| | # Вход - порт 41:00.0 |
| | in_dev=41-00.0 |
| | # Выход - порт 41:00.1 |
| | out_dev=41-00.1 |
| | </code> |
| | Такая конфигурация задает единственный мост 41-00.0 ←→ 41-00.1 \\ |
| | Можно указывать группу интерфейсов через ':' |
| | <code> |
| | in_dev=41-00.0:01-00.0:05-00.0 |
| | out_dev=41-00.1:01-00.1:05-00.1 |
| | </code> |
| | Эта группа образует следующие пары (мосты): \\ |
| | 41-00.0 ←→ 41-00.1 \\ |
| | 01-00.0 ←→ 01-00.1 \\ |
| | 05-00.0 ←→ 05-00.1 \\ |
| | В парах должны быть устройства одинаковой скорости; недопустимо объединять в пару 10G и 40G карты. Однако, в группе могут быть интерфейсы разной скорости, например, одна пара 10G, другая - 40G. |
| | |
| | Maксимальный размер ethernet-пакета на девайсах задается опцией ''snaplen'' в fastdpi.conf, по умолчанию ''snaplen=1540''. |
| | |
| | ===== Задание псевдонимов девайсов ===== |
| | В СКАТ 9.5.3 появилась возможность задавать псевдонимы (alias) девайсов. Вызвано это тем, что DPDK поддерживает большое количество девайсов, не только PCI, но и, например, vmbus-девайсы (Hyper-V) или виртуальные девайсы vdev. Кроме того, каждый DPDK-драйвер поддерживает свой набор конфигурационных параметров для тонкой настройки. Синтаксис описания таких девайсов несовместим с синтаксисом задания в ''in_dev''/''out_dev'', поэтому введено понятие псевдонима девайса. |
| | |
| | Суть псевдонима очень проста: вы описываете необходимый девайс в отдельном параметре и задаете этому описанию имя. Далее в параметрах ''in_dev'', ''out_dev'', ''tap_dev'' (и во всех остальных, которые ссылаются на девайсы из ''in_dev'' и ''out_dev'') вы указываете это имя - псевдоним девайса. |
| | |
| | Каждый псевдоним задается отдельным параметром ''dpdk_device'': |
| | <code> |
| | dpdk_device=alias:bus:device-description |
| | </code> |
| | здесь: |
| | * ''alias'' - задает псевдоним девайса (например, eth1). В псевдониме допустимы только буквы и цифры. |
| | * ''bus'' - тип шины: ''pci'', ''vmbus'', ''vdev'' |
| | * ''device-description'' - описатель девайса в синтаксисе, принятом в DPDK |
| | Например: |
| | <code> |
| | # eth1 - псевдоним PCI-девайса 41:00.0 |
| | dpdk_device=eth1:pci:41:00.0 |
| | # eth2 - псевдоним PCI-девайса 41:00.1 |
| | dpdk_device=eth2:pci:41:00.1 |
| | |
| | in_dev=eth1 |
| | out_dev=eth2 |
| | </code> |
| | Это описание эквивалентно следующему: |
| | <code> |
| | in_dev=41-00.0 |
| | out_dev=41-00.1 |
| | </code> |
| | Отметим, что в ''dpdk_device'' PCI-девайс задается в каноническом виде ''41:00.0''. |
| | |
| | <note tip>Для PCI-девайсов задание в ''in_dev''/''out_dev'' через псевдонимы не обязательно, можно использовать прежнюю нотацию.</note> |
| | |
| | Если требуется подключить Hyper-V девайсы (а это не PCI, а VMbus-девайсы), то использование псевдонимов обязательно. Пример: |
| | <code> |
| | dpdk_device=subs1:vmbus:392b7b0f-dbd7-4225-a43f-4c926fc87e39 |
| | dpdk_device=subs2:vmbus:58f75a6d-d949-4320-99e1-a2a2576d581c,latency=30 |
| | dpdk_device=inet1:vmbus:34f1cc16-4b3f-4d8a-b567-a0eb61dc2b78 |
| | dpdk_device=inet2:vmbus:aed6f53e-17ec-43f9-b729-f4a238c49ca9,latency=30 |
| | in_dev=subs1:subs2 |
| | out_dev=inet1:inet2 |
| | </code> |
| | Здесь мы не только задаем псевдоним, но и указываем аргумент ''latency=30'' для DPDK-драйвера. В принципе, каждый драйвер DPDK поддерживает свой набор аргументов, см. [[https://doc.dpdk.org/guides/nics/index.html|документацию DPDK]] соответствующей версии (версия DPDK, с которой собран СКАТ, выводится в ''fastdpi_alert.log'' при старте, а также при вызове ''fastdpi -ve''). Следует отметить, что бездумное задание аргументов для драйвера может привести к труднообнаружимым ошибкам и потере работоспособности СКАТа, поэтому не советуем пользоваться этой возможностью без консультаций с нашей техподдержкой. |
| | |
| | ===== Конфигурирование в Hyper-V ===== |
| | Начиная с версии 9.5.3, СКАТ поддерживает работу в виртуальной машине Hyper-V. |
| | На гостевой [[veos:installation|VEOS]] должны быть установлены: |
| | <code> |
| | # Поддержка multi-queue - необходима для СКАТ |
| | dnf install kernel-modules-extra |
| | </code> |
| | <note important>Host-система (Windows) должна поддерживать multiple channel для виртуализованных сетевых карт</note> |
| | |
| | Девайсы в Hyper-V являются VMBus-, а не PCI-девайсами, поэтому им требуется особый перевод в режим DPDK. |
| | Каждый девайс (интерфейс) идентифицируется своим уникальным идентификатором UUID, поэтому сначала нужно узнать UUID всех интерфейсов, с которыми будет работать СКАТ. Затем нужно перевести девайс в DPDK-режим: |
| | <code> |
| | # переводим интерфейсы eth0 и eth2 в DPDK-режим |
| | for DEV in eth0 eth2 |
| | do |
| | # получаем UUID девайса |
| | DEV_UUID=$(basename $(readlink /sys/class/net/$DEV/device)) |
| | # переводим в DPDK compatible mode |
| | driverctl -b vmbus set-override $DEV_UUID uio_hv_generic |
| | |
| | # Device appears in |
| | # /sys/bus/vmbus/drivers/uio_hv_generic/$DEV_UUID |
| | |
| | echo "$DEV uuid=$DEV_UUID" |
| | done |
| | </code> |
| | При необходимости интерфейс может быть переведен обратно в kernel-режим так: |
| | <code> |
| | ETH0_UUID=<eth0_UUID> |
| | driverctl -b vmbus unset-override $ETH0_UUID |
| | </code> |
| | |
| | Далее конфигурируем СКАТ — задаем девайсы в ''fastdpi.conf''. При этом используем [[#задание_псевдонимов_девайсов|псевдонимы]] для указания UUID, которые мы только что узнали: |
| | <code> |
| | # eth0 UUID=392b7b0f-dbd7-4225-a43f-4c926fc87e39 |
| | dpdk_device=eth0:vmbus:392b7b0f-dbd7-4225-a43f-4c926fc87e39 |
| | # eth2 UUID=34f1cc16-4b3f-4d8a-b567-a0eb61dc2b78 |
| | dpdk_device=eth2:vmbus:34f1cc16-4b3f-4d8a-b567-a0eb61dc2b78 |
| | |
| | # далее везде используем псевдонимы eth0 и eth2 при указании девайсов |
| | in_dev=eth0 |
| | out_dev=eth2 |
| | </code> |
| | |
| | ===== Кластеры ===== |
| | DPDK-версия СКАТ поддерживает кластеризацию: можно указывать, какие интерфейсы входят в каждый кластер. Разделителем кластеров является символ '|' |
| | <code> |
| | in_dev=41-00.0|01-00.0:05-00.0 |
| | out_dev=41-00.1|01-00.1:05-00.1 |
| | </code> |
| | Этот пример создает два кластера: |
| | * кластер с мостом 41-00.0 ←→ 41-00.1 |
| | * кластер с мостами 01-00.0 ←→ 01-00.1 и 05-00.0 ←→ 05-00.1 |
| | Кластеры являются в большей мере наследием pf_ring-версии СКАТ: в pf_ring кластер является базовым понятием, означающим "один поток диспетчера + RSS потоков-обработчиков", и это чуть ли не единственный способ масштабирования. Недостатом кластерного подхода является то, что кластеры физически изолированы друг от друга: невозможно переслать пакет с интерфейса X кластера #1 на интерфейс Y кластера #2. Это может являться значительным препятствием в режиме L2 BRAS СКАТ. |
| | |
| | В DPDK кластеры также изолированы друг от друга, но в отличие от pf_ring здесь кластер - понятие во многом логическое, наследуемое от pf_ring. DPDK намного гибче, чем pf_ring, и позволяет строить сложные многомостовые конфигурации со множеством диспетчеров без использования кластеров. Фактически, единственным аргументом "за" кластеризацию в DPDK-версии СКАТ является случай, когда у вас к СКАТ подключены две независимые сети A и B, которые никоим образом не должны взаимодействовать друг с другом. |
| | <note tip>Совет: вместо использования кластеров рассмотрите переход на другой ''dpdk_engine'', более подходящий под вашу нагрузку</note> |
| | Далее при описании конфигураций предполагается, что есть только один кластер (то есть кластеризация не используется). |
| | |
| | ===== Число ядер (потоков) ===== |
| | Ядра CPU являются, пожалуй, самым критичным ресурсом СКАТ. Чем больше физических ядер имеется в системе, тем больший трафик сможет обрабатывать СКАТ. |
| | <note important>СКАТ не использует Hyper-Threading: учитываются только реальные физические ядра, а не логические</note> |
| | Для работы СКАТу нужны следующие потоки: |
| | * потоки обработки - обрабатывают входящие пакеты, пишут в TX-очереди карты; |
| | * потоки диспетчера - читают RX-очереди карты и раскидывают входящие пакеты по потокам обработки; |
| | * служебные потоки - выполняют отложенные (продолжительные) действия, принимают и обрабатывают команды fdpi_ctrl и CLI, связь с PCRF, отправка netflow |
| | * системное ядро - выделено для работы операционной системы. |
| | Потоки обработки и диспетчера не могут располагаться на одном ядре. При старте СКАТ привязывает потоки к ядрам. |
| | СКАТ по умолчанию выбирает число потоков-обработчиков в зависимости от скорости интерфейса:\\ |
| | 10G - 4 потока\\ |
| | 25G - 8 потоков\\ |
| | 40G, 50G, 56G - 16 потоков\\ |
| | 100G - 32 потока\\ |
| | Для группы число потоков равно сумме числа потоков для каждой пары; например, для таких карт |
| | <code> |
| | # 41-00.x - 25G NIC |
| | # 01-00.x - 10G NIC |
| | in_dev=41-00.0:01-00.0 |
| | out_dev=41-00.1:01-00.1 |
| | </code> |
| | будет создано 12 потоков обработки (8 для 25G карты и 4 для 10G) |
| | |
| | В fastdpi.conf можно явно указать число потоков на кластер с помощью параметра ''num_threads'': |
| | <code> |
| | # 41-00.x - 25G NIC |
| | # 01-00.x - 10G NIC |
| | in_dev=41-00.0:01-00.0 |
| | out_dev=41-00.1:01-00.1 |
| | |
| | num_threads=8 |
| | </code> |
| | Такая конфигурация создаст 8 потоков обработки. |
| | |
| | <note important>СКАТ при планировании ядер учитывает NUMA node, к которой относятся ядра и карта: если карта на NUMA node 0, СКАТ назначит потоки обработчиков и диспетчеров также на NUMA node 0. Если ядер в NUMA node не хватает, СКАТ не запустится</note> |
| | |
| | Кроме потоков-обработчиков, для работы нужен также как минимум один поток-диспетчер (и значит, еще как минимум одно ядро), читающий rx-очереди интерфейсов. Задача диспетчера - чтобы пакеты, относящиеся к одному flow, попадали в один и тот же поток обработчика. |
| | Внутренняя архитектура работы с одним или множеством диспетчеров разительно отличается, поэтому СКАТ предоставляет несколько движков, конфигурируемых параметром ''dpdk_engine'' файла конфигурации fastdpi.conf: |
| | * ''dpdk_engine=0'' - read/write движок по умолчанию, один диспетчер на все; |
| | * ''dpdk_engine=1'' - read/write движок с двумя потоками-диспетчерами: на каждое направление по диспетчеру; |
| | * ''dpdk_engine=2'' - read/write движок с поддержкой RSS: для каждого направления создается ''dpdk_rss'' диспетчеров (по умолчанию ''dpdk_rss=2''), таким образом, общее количество диспетчеров = ''2 * dpdk_rss''; |
| | * ''dpdk_engine=3'' - read/write движок с отдельным диспетчером на каждый мост. |
| | |
| | Далее подробно описываются все эти движки, особенности их настройки и области применения, но сначала - общее замечание про потоки диспетчеров. |
| | ==== Явная привязка к ядрам ==== |
| | Можно задать в fastdpi.conf явную привязку потоков к ядрам. За это отвечают параметры: |
| | * ''engine_bind_cores'' - список номеров ядер для потоков-обработчиков |
| | * ''rx_bind_core'' - список номеров ядер для потоков диспетчеров |
| | |
| | Формат задания этих списков одинаков: |
| | <code> |
| | # 10G карты - 4 потока обработчика, 1 диспетчер на кластер |
| | 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:3:4:5|7:8:9:10 |
| | rx_bind_core=1|6 |
| | </code> |
| | Для бескластерного задания: |
| | <code> |
| | # 10G карты - 4 потока обработчика на карту |
| | in_dev=01-00.0:02-00.0 |
| | out_dev=01-00.1:02-00.1 |
| | # 2 диспетчера (по направлениям) |
| | dpdk_engine=1 |
| | |
| | # Привязка потоков обработчиков и диспетчеров |
| | engine_bind_cores=3:4:5:6:7:8:9:10 |
| | rx_bind_core=1:2 |
| | </code> |
| | |
| | Как уже отмечалось, потоки обработчиков и диспетчеров должны иметь выделенные ядра; не допускается привязывать несколько потоков к одному ядру, - СКАТ при этом выругается в fastdpi_alert.log и не будет запускаться. |
| | <note tip>Явная привязка к ядрам может быть применена только в экстренных случаях; обычно достаточно автоматической привязки. Для выяснения номеров ядер советуем запустить СКАТ с автоматической привязкой (без параметров ''engine_bind_cores'' и ''rx_bind_core'') и посмотреть в fastdpi_alert.log дамп топологии системы: номер ядра - это lcore</note> |
| | <note important>При явной привязке СКАТ строго следует заданным в fastdpi.conf параметрам и не учитывает NUMA node, что может негативно сказаться на производительности (минус 10% - 20%)</note> |
| | ===== Загрузка потока диспетчера ===== |
| | Значение загрузки потока диспетчера, близкое к 100%, не говорит о том, что диспетчер не справляется: DPDK предполагает, что данные с карты считываются потребителем (это как раз и есть диспетчер) без каких-либо прерываний типа "пришли данные", поэтому диспетчер постоянно опрашивает состояние rx-очередей интерфейсов на наличие пакетов (так называемый poll mode). Если в течение N циклов опроса не принято ни одного пакета, диспетчер засыпает на несколько микросекунд, что вполне достаточно для снижения нагрузки на ядро до единиц процентов. Но если пакеты поступают раз в N-i циклов опроса, диспетчер не будет переходить в режим сна, и загрузка ядра будет 100%. Это нормально. |
| | <note tip>Загрузку потоков СКАТа можно посмотреть следующей командой: |
| | <code> |
| | top -H -p `pidof fastdpi` |
| | </code> |
| | </note> |
| | Истинное состояние каждого диспетчера можно увидеть в fastdpi_stat.log, - в него, помимо прочего, периодически выводится статистика по диспетчерам вида: |
| | <code> |
| | [STAT ][2020/06/15-18:17:17:479843] [HAL][DPDK] Dispatcher statistics abs/delta: |
| | drop (worker queue full) | empty NIC RX | RX packets |
| | Cluster #0: 0/0 0.0%/ 0.0% | 98.0%/95.0% | 100500000/100500 |
| | </code> |
| | здесь ''empty NIC RX'' - это и есть процент холостых опросов rx-очередей карт - абсолютный процент (с начала работы СКАТ) и относительный (дельта с последнего вывода в stat-лог). 100% - значит, входных пакетов нет, диспетчер работает вхолостую. Если относительный процент меньше 10 (то есть в более чем 90% опросов интерфейсов есть входные пакеты) - диспетчер не справляется и надо рассмотреть вариант с другим движком, где большее число диспетчеров. |
| | |
| | Также хорошим индикатором, что текущий движок в целом не справляется, является ненулевое значение дельты для показателя ''drop (worker queue full)''. Это число отброшенных пакетов, которые диспетчер не смог отправить в поток обработки из-за переполнения входной очереди обработчика. Это значит, что обработчики не справляются с обработкой входящего трафика; причины могут быть две: |
| | * либо слишком мало потоков-обработчиков, надо увеличить параметр ''num_threads'' или выбрать другой движок (параметр ''dpdk_engine''); |
| | * либо трафик сильно перекошен и большинство пакетов попадает в один-два обработчика, тогда как остальные свободны. В этой ситуации нужно анализировать структуру трафика. Можно попробовать увеличить или уменьшить на единицу число потоков-обработчиков, чтобы хеш-функция диспетчера раскидывала пакеты более равномерно (напомним, что номер потока обработки есть ''хеш_пакета mod число_обработчиков'') |
| | |
| | |
| | ==== dpdk_engine=0: Один диспетчер ==== |
| | В этом режиме работы СКАТ создает один поток диспетчера на кластер. |
| | Диспетчер читает входящие пакеты со всех ''in_dev'' и ''out_dev'' устройств и раскидывает пакеты по потокам обработчиков. |
| | Подходит для 10G карт, выдерживает нагрузку до 20G и более (зависит от модели CPU и режима разбора туннелей [[dpi:dpi_components:platform:dpi_inst_spec:dpi_tunnels|check_tunnels]]) |
| | |
| | <note tip>Общее число требуемых ядер равно числу обработчиков плюс одно ядро на диспетчер</note> |
| | |
| | СКАТ конфигурирует карты следующим образом: |
| | * RX queue count = 1 |
| | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. |
| | |
| | <note tip>Для read-only режима (без ''out_dev'') число TX queue равно нулю. Некоторые DPDK-драйверы (например, vmxnet3) не позволяют конфигурировать карту с числом TX queue, равным нулю. Для таких драйверов в версии СКАТ 10.2 введен параметр fastdpi.conf ''dpdk_txq_count'': следует задать ''dpdk_txq_count=1'' |
| | </note> |
| | ==== dpdk_engine=1: Диспетчеры по направлению ==== |
| | В этом режиме создается два потока диспетчера: один для направления от абонентов в inet (для ''in_dev''), другой - для направления из inet к абонентам (для ''out_dev''). |
| | Подходит для нагрузок свыше 20G (карты 25G, 40G). |
| | <note tip>Общее число требуемых ядер равно числу обработчиков плюс два ядра на диспетчеры</note> |
| | |
| | СКАТ конфигурирует карты следующим образом: |
| | * RX queue count = 1 |
| | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. |
| | ==== dpdk_engine=2: Поддержка RSS ==== |
| | В данном режиме задействуется RSS (receive side scaling) карты. |
| | Значение RSS задается в fastdpi.conf параметром |
| | <code> |
| | dpdk_rss=2 |
| | </code> |
| | Значение ''dpdk_rss'' не должно быть менее 2. |
| | Для каждого направления создается ''dpdk_rss'' диспетчеров. |
| | <note tip>Общее число требуемых ядер равно числу обработчиков плюс ''dpdk_rss * 2'' на диспетчеры</note> |
| | Подходит для мощных карт 50G+ (то есть для СКАТ-100+). Если у вас 50G набрано из нескольких карт группировкой, данный режим вряд ли подойдет, так как для каждой карты из группы требует дополнительно как минимум 2 ядра (при ''dpdk_rss=2''). Лучше рассмотреть варианты ''dpdk_engine=1'' или ''dpdk_engine=3''. |
| | |
| | СКАТ конфигурирует карты следующим образом: |
| | * RX queue count = ''dpdk_rss'' |
| | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. |
| | ==== dpdk_engine=3: Диспетчер на мост ==== |
| | Для каждого моста создается отдельный поток диспетчера. |
| | Предназначен для конфигураций со множеством девайсов на входе и выходе: |
| | <code> |
| | in_dev=01-00.0:02-00.0:03-00.0 |
| | out_dev=01-00.1:02-00.1:03-00.1 |
| | dpdk_engine=3 |
| | </code> |
| | Для данного примера создается три потока диспетчеров: |
| | * для моста 01-00.0 <--> 01-00.1 |
| | * для моста 02-00.0 <--> 02-00.1 |
| | * для моста 03-00.0 <--> 03-00.1 |
| | |
| | <note tip>Общее число требуемых ядер равно числу обработчиков плюс число мостов</note> |
| | |
| | Данный движок предназначен для нескольких карт 25G/40G/50G в группе (то есть для СКАТ-100+) |
| | |
| | СКАТ конфигурирует карты следующим образом: |
| | * RX queue count = 1 |
| | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. |
| | ==== dpdk_engine=4: Диспетчер на порт ==== |
| | Для каждого порта (девайса) создается отдельный поток диспетчера. |
| | Предназначен для конфигураций со множеством девайсов на входе и выходе: |
| | <code> |
| | in_dev=01-00.0:02-00.0:03-00.0 |
| | out_dev=01-00.1:02-00.1:03-00.1 |
| | dpdk_engine=4 |
| | </code> |
| | Для данного примера создается шесть потоков диспетчеров - для каждого девайса по диспетчеру. Очевидно, что если у нас только один мост, данный движок эквивалентен ''dpdk_engine=1'' - один диспетчер на направление. |
| | |
| | <note tip>Общее число требуемых ядер равно числу обработчиков плюс число портов</note> |
| | |
| | Данный движок предназначен для нескольких карт 25G/40G/50G в группе (то есть для СКАТ-100+) |
| | |
| | СКАТ конфигурирует карты следующим образом: |
| | * RX queue count = 1 |
| | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. |
| | |
| | ==== dpdk_engine=6: RSS диспетчеров на мост ==== |
| | <note important>Данный ''dpdk_engine'' доступен с версии 14.0!</note> |
| | Данный движок предназначен для конфигураций со многими мостами (dev1:dev2:dev3:...) для карт 100G+. |
| | |
| | <code> |
| | in_dev=41-00.0:02-00.0:c3-00.0:c1-00.0:04-00.0:04-00.1 |
| | out_dev=41-00.1:41-00.1:02-00.1:02-00.1:c3-00.1:c3-00.1 |
| | |
| | dpdk_engine=6 |
| | dpdk_rss=4 |
| | num_threads=64 |
| | |
| | dpdk_mempool_size=256000 |
| | mem_tracking_flow=40000000 |
| | mem_tracking_ip=40000000 |
| | dpdk_emit_mempool_size=256000 |
| | mem_ssl_parsers=18000000 |
| | mem_http_parsers=512000 |
| | </code> |
| | Для данного примера создается 24 потока диспетчеров — по 4 диспетчера на мост. |
| | |
| | <note tip> |
| | Общее количество диспетчеров = ''dpdk_rss'' * число мостов.\\ |
| | Для карт 100G+ при соотношении 1 диспетчер на 10G, минимальное число диспетчеров — 10.\\ |
| | Начиная с версии 14.0 максимальное количество диспетчеров — 32. |
| | </note> |
| | |
| | Поддерживаются on-stick девайсы. |
| | СКАТ конфигурирует карты следующим образом: |
| | * RX queue count = ''dpdk_rss'' |
| | * TX queue count = число потоков обработки. Потоки обработки пишут напрямую каждый в свою TX-очередь карты. |
| | |
| | ==== dpdk_engine=7: Явное указание диспетчеров ==== |
| | <note important>Данный ''dpdk_engine'' доступен с версии 14.2!</note> |
| | |
| | Данный движок позволяет явно задавать, какие порты обслуживает каждый диспетчер. Он предназначен для сложных и гетерогенных конфигураций, когда стандартные схемы распределения диспетчеров не подходят. Например, когда в одном кластере используются порты различной производительности (100G, 40G, 10G) или требуется индивидуальная настройка параметров обработки для отдельных групп портов. |
| | |
| | Количество диспетчеров определяется числом параметров ''dpdk_dispatch''. Если для диспетчера задан параметр ''rss=N'', создается N диспетчеров — по одному на каждую RX-очередь. |
| | |
| | Для каждого диспетчера обязательно указывается используемый ''mempool''. Размер и количество ''mempool'' задаются независимо и могут различаться для разных диспетчеров. |
| | |
| | Движок является универсальным и позволяет реализовать все схемы распределения диспетчеров, поддерживаемые другими значениями ''dpdk_engine''. |
| | |
| | Диспетчеры задаются параметрами ''dpdk_dispatch''. |
| | |
| | Фатальными ошибками конфигурации считаются следующие случаи: |
| | * порт кластера не входит ни в какой ''<список-портов>'' параметра ''dpdk_dispatch'' |
| | * порт кластера входит в ''<список-портов>'' нескольких различных параметров ''dpdk_dispatch'' |
| | * в ''<списке-портов>'' параметра ''dpdk_dispatch'' перечислены порты из разных кластеров — каждый диспетчер должен обслуживать порты только одного кластера |
| | |
| | Данный движок является универсальным — через него могут быть выражены все остальные движки, например: |
| | <code> |
| | dpdk_engine=0: один диспетчер на все порты |
| | in_dev=port1:port2 |
| | out_dev=port3:port4 |
| | dpdk_dispatch=port1,port2,port3,port4 |
| | |
| | dpdk_engine=1: диспетчер на направление |
| | in_dev=port1:port2 |
| | out_dev=port3:port4 |
| | dpdk_dispatch=port1,port2 |
| | dpdk_dispatch=port3,port4 |
| | |
| | dpdk_engine=2: диспетчер на направление c поддержкой RSS |
| | dpdk_rss=4 |
| | in_dev=port1:port2 |
| | out_dev=port3:port4 |
| | dpdk_dispatch=port1,port2;rss=4 |
| | dpdk_dispatch=port3,port4;rss=4 |
| | |
| | dpdk_engine=3: диспетчер на мост |
| | in_dev=port1:port2 |
| | out_dev=port3:port4 |
| | dpdk_dispatch=port1,port3 |
| | dpdk_dispatch=port2,port4 |
| | |
| | dpdk_engine=4: диспетчер на порт |
| | in_dev=port1:port2 |
| | out_dev=port3:port4 |
| | dpdk_dispatch=port1 |
| | dpdk_dispatch=port2 |
| | dpdk_dispatch=port3 |
| | dpdk_dispatch=port4 |
| | |
| | dpdk_engine=6: диспетчер на мост с поддержкой RSS |
| | dpdk_rss=4 |
| | in_dev=port1:port2 |
| | out_dev=port3:port4 |
| | dpdk_dispatch=port1,port3;rss=4 |
| | dpdk_dispatch=port2,port4;rss=4 |
| | </code> |
| | |
| | Для диспетчера необходимо указывать используемый ''mempool''. |
| | |
| | * **Описатель ''mempool''** — только для ''dpdk_engine=7''\\ Формат: <code>dpdk_mempool=name=<name>;size=N</code> |
| | * ''name'' задает имя ''mempool'' (максимум 15 символов) |
| | * ''size'' задает размер (число элементов) ''mempool'' |
| | * оба параметра являются обязательными\\ \\ Опций ''dpdk_mempool'' может быть несколько, каждая описывает отдельный ''mempool'': <code>dpdk_mempool=...</code> |
| | * **''dpdk_max_memzone''** [cold] — устанавливает максимальное количество ''memzone'' в DPDK. По умолчанию DPDK использует ограничение на количество ''memzone'' (обычно 5120, зависит от версии DPDK). Увеличение значения может потребоваться для крупных конфигураций с большим количеством сетевых карт и ''mempool''. |
| | * ''0'' — использовать значение по умолчанию, заданное в DPDK\\ Если при запуске fastDPI возникает ошибка: ''Number of requested memzone segments exceeds maximum 5120'' следует увеличить значение параметра ''dpdk_max_memzone'' |
| | * **Описатель диспетчера** — только для ''dpdk_engine=7''\\ Формат: <code>dpdk_dispatch=<список-портов>;mempool=<имя>[;params]*</code> |
| | * ''<список-портов>'' задает, какие порты обслуживает данный диспетчер |
| | * ''mempool=<имя>'' задает имя ''mempool'' для данного диспетчера (обязательный параметр) |
| | * ''rss=N'' включает RSS на всех портах данного диспетчера; будет создано N диспетчеров — по одному на каждую RX-очередь\\ \\ Опций ''dpdk_dispatch'' может быть несколько, каждая описывает отдельный диспетчер (или группу диспетчеров, если задан ''rss''): <code>dpdk_dispatch=...</code> |