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

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

Hyper-threading

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

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

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

NUMA

Если на двухсокетной системе установлены две сетевых карты, они должны быть на разных NUMA-узлах, иначе производительность будет низкой. Узнать NUMA-узел карты по PCI-адресу любого её порта можно так:

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

Если карты оказались на одном узле, их нужно физически переставить.

Модули ядра

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

Для 100G-адаптеров Mellanox см. документацию по ссылке ниже. Остальные разделы на этой странице («Hugepages» и «Docker») актуальны и для них.

Необходимо:

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

    • uio_pci_generic: стандартный, может не работать в редких случаях;
    • igb_uio: создан для DPDK, пакет есть только для Debian;
    • vfio-pci: требует поддержки ЦП;
    • virtio-pci: только для виртуальных адаптеров QEMU/KVM;
    • драйверы сетевых адаптеров Mellanox.
  2. Настроить загрузку драйвера при запуске системы.

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

Для привязки драйверов и управления устройствами можно загрузить скрипт DPDK (оригинальная документация):

wget https://docs.mitigator.ru/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 — устройства со стандартными драйверами. Доступные драйвера указываются для каждого устройства списком unused=, например unused=uio_pci_generic,i40e. В списке отображаются только загруженные драйвера. Для загрузки драйвера uio_pci_generic:

modprobe uio_pci_generic

Сопоставить имя устройства (например, eth0 или enp3s0f0) и PCI-адрес можно через sysfs:

ls -l /sys/class/net | grep pci

Например, ссылка на ../../devices/pci0000:00/0000:00:1d.1/0000:04:00.0/net/eth0 означает, что eth0 связан с устройством 0000:04:00.0.

Для привязки устройства 0000:06:00.0 к драйверу uio_pci_generic:

dpdk-devbind --bind uio_pci_generic 0000:06:00.0

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

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

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

Универсальный способ для большинства дистрибутивов:

echo uio_pci_generic >> /etc/modules

Модуль igb_uio

В Debian модуль igb_uio устанавливается отдельно:

apt-get -y install linux-headers-amd64 dpdk-igb-uio-dkms

Если при этом обновилось ядро, необходимо перезагрузить систему.

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

Модуль vfio-pci

Модуль vfio-pci входит в ядро Linux, но требует поддержки процессором виртуализации ввода-вывода (например, технологии Intel® VT-d). Проверить поддержку (должно напечатать supported):

grep 'vmx\|svm' /proc/cpuinfo >/dev/null && echo supported || echo not supported

Модули Mellanox

Подробности см. в документации DPDK. Там же описаны утилиты для тонкой настройки устройств и обновления прошивок.

Должны использоваться стандарные драйверы Mellanox, поставляемые в Linux:

modprobe mlx5_core mlx5_ib ib_uverbs

Так можно настроить их загрузку при запуске системы:

for m in in mlx5_core mlx5_ib ib_uverbs; do echo $m >> /etc/modules; done

Hugepages

Большие страницы (hugepages) необходимы для работы Mitigator´а. В зависимости от процессора могут поддерживаться hugepages разных размеров, чаще всего 2 МБ или 1 ГБ. При большем размере страницы выше производительность, но не все процессоры поддерживают размер 1 ГБ.

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

1 GB hugepages

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

grep -m1 ' pdpe1gb ' /proc/cpuinfo

Hugepages размером 1 ГБ выделяются только при загрузке. В параметрах ядра необходимо указать опции (например, для 64 страниц по 1 ГБ, итого 64 ГБ):

default_hugepagesz=1G hugepagesz=1G hugepages=64

Например, при использовании GRUB это указывается в /etc/default/grub, после чего нужно вызвать update-grub и перезагрузить систему.

2 MB hugepages

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

grep -m1 ' pse ' /proc/cpuinfo

Hugepages размером 2 МБ управляются через sysctl. Например, для выделения 2048 страниц по 2 МБ (итого 4 ГБ) при загрузке системы:

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

Можно выделить двухмегабайтные hugepages без перезагрузки.

sysctl -w vm.nr_hugepages=2048

Однако из-за фрагментации памяти Mitigator может не запуститься, тогда перезагрузка необходима.

Docker

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