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

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

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 и платформы (чипсета или гипервизора).

Остальные разделы на этой странице («Hugepages» и «Docker») актуальны для любого выбранного драйвера.

Необходимо:

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

    • Адаптеры Mellanox работают только со специальным драйвером.
    • vfio-pci: стандартный, рекомендуется;
    • uio_pci_generic: стандартный, актуален для чипсетов без VMX/SVM (см. ниже);
    • igb_uio: нестандартный, актуален только для некоторых старых чипсетов (см. ниже);
    • virtio-pci: только для виртуальных адаптеров QEMU/KVM.
  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=i40e. В списке отображаются только загруженные драйвера. Для загрузки драйвера vfio-pci:

modprobe vfio-pci

Сопоставить имя устройства (например, 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. Таким образом нужно выяснить адреса всех интересующих устройств.

Рекомендуется привязывать все устройства одной командной. Особенно это важно для vfio-pci.

Для привязки устройств 0000:06:00.0 и 000:06:00.1 к драйверу vfio-pci:

dpdk-devbind --bind vfio-pci 0000:06:00.0 0000:06:00.1

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

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

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

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

echo vfio-pci >> /etc/modules

Модуль vfio-pci

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

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

Модуль igb_uio

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

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

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

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

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.