Рекомендуется включить hyper-threading в BIOS.
При включенном HT следующая команда показывает 2:
lscpu | grep 'Thread(s) per core:'
Если на двухсокетной системе установлены две сетевых карты, они должны быть на разных NUMA-узлах, иначе производительность будет низкой. Узнать NUMA-узел карты по PCI-адресу любого её порта можно так:
$ cat /sys/bus/pci/devices/0000:04:00.0/numa_node
0
Если карты оказались на одном узле, их нужно физически переставить.
В системе должен быть загружен модуль ядра, позволяющий DPDK работать с сетевым портом. Работоспособность драйверов, то есть возможность их привязки, зависит от сетевого адаптера, версии ядра Linux и платформы (чипсета или гипервизора).
Для 100G-адаптеров Mellanox см. документацию по ссылке ниже. Остальные разделы на этой странице («Hugepages» и «Docker») актуальны и для них.
Необходимо:
Подобрать драйвер, который будет работать с нужными сетевыми портами (документация DPDK):
uio_pci_generic
: стандартный, может не работать в редких случаях;igb_uio
: создан для DPDK, пакет есть только для Debian;vfio-pci
: требует поддержки ЦП;virtio-pci
: только для виртуальных адаптеров QEMU/KVM;Настроить загрузку драйвера при запуске системы.
Для привязки драйверов и управления устройствами можно загрузить скрипт 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
В Debian модуль igb_uio
устанавливается отдельно:
apt-get -y install linux-headers-amd64 dpdk-igb-uio-dkms
Если при этом обновилось ядро, необходимо перезагрузить систему.
Для CentOS модуля igb_uio
в популярных репозитариях нет, при необходимости
можно его собрать.
Модуль vfio-pci входит в ядро Linux, но требует поддержки процессором
виртуализации ввода-вывода (например, технологии Intel® VT-d).
Проверить поддержку (должно напечатать supported
):
grep 'vmx\|svm' /proc/cpuinfo >/dev/null && echo supported || echo not supported
Подробности см. в документации 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) необходимы для работы Mitigator´а. В зависимости от процессора могут поддерживаться hugepages разных размеров, чаще всего 2 МБ или 1 ГБ. При большем размере страницы выше производительность, но не все процессоры поддерживают размер 1 ГБ.
Необходимое количество hupepages зависит желаемого количества политик защиты, отслеживаемых адресов и соединений. Рекомендуется отводить на hugepages от 75 % до 50 % от полного объема памяти.
Проверить поддержку:
grep -m1 ' pdpe1gb ' /proc/cpuinfo
Hugepages размером 1 ГБ выделяются только при загрузке. В параметрах ядра необходимо указать опции (например, для 64 страниц по 1 ГБ, итого 64 ГБ):
default_hugepagesz=1G hugepagesz=1G hugepages=64
Например, при использовании GRUB это указывается в
/etc/default/grub
, после чего нужно вызвать update-grub
и
перезагрузить систему.
Проверить поддержку:
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 >= 18.03 (подробная инструкция по установке)
apt install docker-ce
— Debian, Ubuntu
yum install docker-ce
— CentOS
Docker Compose >= 1.18
apt install docker-compose
— Debian, Ubuntu
yum install docker-compose
— CentOS
Если доступ к https://docker.mitigator.ru ведется через прокси, нужно настроить Docker.