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

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

Hyper-threading

Рекомендуется включить hyper-threading в 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
0

Модули ядра

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

Необходимо:

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

    • Карты Mellanox работают только со специальным драйвером.
    • vfio-pci: стандартный, необходим для карт Intel;
    • uio_pci_generic: стандартный, используется вместо vfio-pci для платформ без VMX/SVM (см. ниже);
    • virtio-pci: нужен для виртуальных адаптеров QEMU/KVM;
    • igb_uio: нестандартный, нужен только если остальные драйвера не работают (см. ниже).
  2. Настроить загрузку драйвера при запуске системы.

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

Привязка устройств к нужному драйверу производится через скрипт dpdk-devbind (документация 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-адрес можно через поле if= в выводе dpdk-devbind.

Рекомендуется привязывать все устройства одной командной dpdk-devbind. Для работы с 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. Необходим для работы DPDK с сетевыми картами Intel. Требует поддержки процессором виртуализации ввода-вывода (например, Intel VT-d). Настраивается в BIOS и в параметрах ядра через опцию iommu=on.

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

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

Модуль igb_uio

Модуль igb_uio устанавливается отдельно:

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

Hugepages

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

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

1 GB hugepages

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

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

grep -m1 pdpe1gb /proc/cpuinfo

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

default_hugepagesz=1G hugepagesz=1G hugepages=64

2 MB hugepages

Hugepages размером 2 МБ можно настраивать без перезагрузки системы.

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

sysctl -w vm.nr_hugepages=2048

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

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

Docker

Установка Docker Compose (подробная инструкция по установке)

`apt install docker-compose` — Debian, Ubuntu \
`yum install docker-compose` — CentOS

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