Подготовка системы

Оборудование

Платформа

Поддерживается работа на платформах AMD и Intel с архитектурой x86-64.

Для оптимальной работы платформ AMD требуется настройка BIOS.

Hyper-threading

Рекомендуется включить hyper-threading (HT) в BIOS.

При включенном HT следующая команда показывает 2:

lscpu | grep 'Thread(s) per core:'

NUMA

Многопроцессорные платформы рекомендуется использовать в NUMA-режиме с одним процессором на NUMA-ноду. Поддерживаются платформы с одной и двумя NUMA-нодами.

Для оптимальной производительности рекомендуется разносить сетевые карты по разным NUMA-нодам, чтобы каждый процессор работал только с портами на своей ноде.

Узнать NUMA-ноду устройства по его PCI-адресу:

cat /sys/bus/pci/devices/0000:04:00.0/numa_node

Драйвера (модули ядра)

Для сетевых карт Intel и некоторых других в системе должен быть загружен драйвер (модуль ядра), позволяющий DPDK работать с ними.

Информация

Для карт Mellanox (NVIDIA) загрузка модулей ядра не требуется. Это означает, что все порты Mellanox по умолчанию доступны DPDK и передаются обработчику пакетов автоматически.

Необходимо:

  1. Подобрать драйвер для установленных сетевых устройств (документация DPDK):

    • vfio-pci: стандартный, рекомендуется по умолчанию (см. ниже);
    • uio_pci_generic: стандартный, используется вместо vfio-pci, если он не работает (см. ниже);
    • igb_uio: нестандартный, нужен только если остальные драйвера не работают (см. ниже).
  2. Настроить загрузку драйвера при запуске системы.

Управление драйверами

Привязка устройств к нужному драйверу производится через скрипт dpdk-devbind (документация DPDK).

Cкачать и установить dpdk-devbind:

wget https://docs.mitigator.ru/v24.08/dist/dpdk-devbind -O /usr/local/bin/dpdk-devbind
chmod +x /usr/local/bin/dpdk-devbind

Посмотреть состояние сетевых устройств и доступных драйверов:

dpdk-devbind --status-dev=net

В списке Network devices using DPDK-compatible driver перечислены устройства, привязанные к совместимому с DPDK драйверу. В списке Network devices using kernel driver — устройства со стандартными драйверами ядра. Текущий драйвер указан в поле drv=. Доступные драйвера перечислены в поле unused=. Отображаются только драйвера, загруженные в системе.

Если нужный драйвер не загружен, загрузить через modprobe. Например, для загрузки драйвера vfio-pci:

modprobe vfio-pci

Сопоставить имя устройства (например, eth0 или enp3s0f0) и его PCI-адрес можно через поле if= в выводе dpdk-devbind.

Рекомендуется привязывать все устройства одной командной dpdk-devbind. Для работы с vfio-pci все порты одной карты должны быть привязаны к одному драйверу. Например, для привязки устройств 06:00.0 и 06:00.1 к драйверу vfio-pci:

dpdk-devbind -b vfio-pci 06:00.0 06:00.1
Информация

Если команда привязки выполнилась без ошибкок, драйвер можно использовать. Устройство, привязанное к специальному драйверу, пропадает из системы (вывод ip link и т.п.). Привязка работает до перезагрузки, автоматическую привязку можно настроить при установке MITIGATOR.

Внимание

Устройства, отмеченные в списке **Active**, имеют IP-адрес. Обычно это порт, через которой идет доступ к машине по SSH, поэтому скрипт не позволяет менять драйвер таким устройствам.

Автоматическая загрузка модуля ядра

Если нужный модуль ядра не загружается по умолчанию при старте системы, его загрузку можно включить через /etc/modules-load.d. Например, для загрузки vfio-pci:

echo vfio-pci >> /etc/modules-load.d/mitigator.conf

Модуль vfio-pci

Модуль vfio-pci входит в состав ядра Linux. Необходим для работы DPDK с сетевыми картами. Требует поддержки процессором виртуализации ввода-вывода (Intel VT-d или AMD-V). Включается в BIOS соответствующими настройками (например, “VT-d”, “Intel Virtualization Technology”, “AMD-V”, “AMD Virtualization”, “SVM”, “IOMMU”).

В параметрах ядра необходимо добавить опции (например, через GRUB):

intel_iommu=on iommu=pt

Проверить наличие виртуализации:

grep -q 'vmx\|svm' /proc/cpuinfo && echo enabled || echo disabled

Проверить наличие IOMMU:

compgen -G '/sys/kernel/iommu_groups/*/devices/*' > /dev/null && echo enabled || echo disabled

Загрузка модуля:

modprobe vfio-pci

Модуль uio_pci_generic

Модуль uio_pci_generic входит в состав ядра Linux. Используется вместо vfio-pci, если тот не поддерживается системой или по какой-то причине не работает.

Загрузка модуля:

modprobe uio_pci_generic

Модуль igb_uio

Модуль igb_uio может быть использован, как альтернатива другим модулям, если они не работают.

Установка модуля:

apt install -y dpdk-igb-uio-dkms
apt install -y dpdk-kmods-dkms

Загрузка модуля:

modprobe igb_uio

Hugepages

Для работы MITIGATOR необходимы настроенные hugepages (большие страницы памяти). Платформой могут поддерживаться hugepages разных размеров (2 МБ, 1 ГБ). Рекомендуется настраивать hugepages большего размера (1 ГБ).

Необходимое количество hugepages зависит желаемого количества политик защиты. Рекомендуется отводить на hugepages 50-75% от общего объема памяти.

1 GB hugepages

Рекомендуется использовать hugepages размером 1 ГБ, если поддерживаются платформой. Их можно выделить только при загрузке системы.

Проверить поддержку:

grep -q pdpe1gb /proc/cpuinfo && echo supported || echo not supported

Настраивается опциями в параметрах ядра. Пример выделения 64 страниц по 1 ГБ:

default_hugepagesz=1G hugepagesz=1G hugepages=64

2 MB hugepages

Hugepages размером 2 МБ нужно использовать, если hugepages размером 1 ГБ не поддерживаются платформой, например, в виртуальном окружении. Их можно настраивать без перезагрузки системы.

Пример выделения 2048 страниц по 2 МБ:

sysctl -w vm.nr_hugepages=2048

Пример настройки выделения страниц при загрузке системы:

echo 'vm.nr_hugepages = 2048' > /etc/sysctl.d/hugepages.conf

Docker

Установить Docker из репозиториев дистрибутива:

apt install -y docker.io
apt-get install -y docker-engine
dnf install -y docker-ce
Внимание

После установки необходимо запустить службу Docker и настроить её автозапуск:

systemctl enable --now docker
dnf install -y docker
Внимание

После установки необходимо запустить службу Docker и настроить её автозапуск:

systemctl enable --now docker

Установить Docker Compose из официального репозитория и сделать файл исполняемым:

curl -L "https://github.com/docker/compose/releases/download/v2.28.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose \
&& chmod +x /usr/bin/docker-compose
Информация

Если доступ к https://docker.mitigator.ru ведется через прокси, нужно настроить Docker.

Официальная документация по установке Docker и Docker Compose: