Настройка системы для карт Mellanox 100G

В следующих командах $pciaddr — PCI-адрес устройства (например, 01:00.0), $netdev — имя устройства в Linux (например, enp1s0f0).

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

Работа с картами Mellanox требует последней версии драйвера и прошивки устройства Mellanox OFED. Стандартный драйвер Linux может не работать.

  1. По указанной ссылке в разделе Download в таблице выбрать драйвер для нужного дистрибутива операционной системы. Проверена работа на Ubuntu 18.04, Ubuntu 20.04, Debian 10.

  2. Загрузить драйвер последней версии (.tgz-архив).

  3. Распаковать архив и запустить установку. В процессе установки произойдёт обновление прошивки всех сетевых карт Mellanox, обнаруженных в системе.

    Вариант A. Если достаточно драйвера и минимального набора утилит:

    ./mlnxofedinstall --upstream-libs --dpdk
    

    Нажать y. Перезагрузить систему после завершения.

    Важно: при установке на Debian 10 для указания конкретной версии дистрибутива может потребоваться правка файла distro в корне архива.

    Вариант B. Если требуется установка с дополнительными утилитами для управления картами Mellanox:

    ./mlnxofedinstall --upstream-libs --dpdk --basic --without-neohost-backend --without-neohost-sdk
    

    Нажать y. Перезагрузить систему после завершения.

    Вариант C. Если Mellanox OFED уже установлен, но требуется обновление прошивки сетевых карт:

    ./mlnxofedinstall --fw-update-only
    

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

  4. На платформах AMD EPYC и AMD Ryzen Threadripper для избежания ошибок работы драйвера mlx5_core рекомендуется в параметры ядра Linux прописать iommu=pt.

Настройка Mitigator´а

Особенностью работы с драйвером Mellanox является то, что они остаются под управлением Linux, то есть сетевые интерфейсы остаются в системе. Однако передавать через них трафик, когда работает Mitigator, нельзя.

Дальнейшие действия предполагают знакомство с Compose-файлами.

  1. Убедиться, что не происходит попытки привязки PCI-адресов к другому драйверу (например, адреса НЕ встречаются в nics.conf)

  2. Убрать секцию networks для сервиса data-plane в файле docker-compose.yml.

  3. Добавить параметр network_mode: host сервису data-plane в файле docker-compose.override.yml.

  4. Добавить адрес хостовой машины для сервисов backend и fwstats в файле docker-compose.override.yml:

    services:
      backend:
        extra_hosts:
        - data-plane.mitigator: <addr>
    
      fwstats:
        extra_hosts:
        - data-plane.mitigator: <addr>
    

    где <addr> — адрес хостовой машины (127.0.0.1 и localhost не подходят).

Безопасность

С настройками выше к обработчику пакетов может подключиться кто угодно.

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

Требуется запретить доступ к TCP-портам 8888 и 8889 с внешних интерфейсов. При это должен сохраниться доступ из контейнеров, адреса и интерфейсы которых меняются при перезапуске.

Одно из решений на основе iptables — выполнить команды:

iptables -A INPUT --protocol tcp --in-interface eno1 --dport 8888 -j DROP
iptables -A INPUT --protocol tcp --in-interface eno1 --dport 8889 -j DROP

Здесь eno1 — management-интерфейс.

Эти правила должны применяться при запуске системы. В Debian и Ubuntu можно сделать это через cron:

cat >/etc/cron.d/mitigator <<END
@reboot /usr/sbin/iptables -A INPUT --protocol tcp --in-interface eno1 --dport 8888 -j DROP
@reboot /usr/sbin/iptables -A INPUT --protocol tcp --in-interface eno1 --dport 8889 -j DROP
END
chmod +x /etc/cron.d/mitigator

Оптимизация производительности

Все команды, где встречается $pciaddr или $netdev, нужно выполнять для каждого порта Mellanox.

  1. Отключение Ethernet pause frames:

    ethtool -A $netdev rx off tx off

  2. Увеличение параметра PCI Max Read Request до 1K. Оптимизирует передачу данных по PCI-шине для больших пакетов:

    setpci -s $pciaddr 68.w

    результатом будет 4 цифры ABCD, выполнить

    setpci -s $pciaddr 68.w=3BCD (первая цифра заменяется тройкой).

  3. Включение агрессивной CQE-компрессии для RX. Оптимизирует передачу данных по PCI-шине (параметр прошивки порта, указывается один раз, требуется перезагрузка):

    mstconfig -d $pciaddr s CQE_COMPRESSION=1

  4. Включение Multi-Packet Rx Queue. Оптимизирует передачу данных по PCI-шине для маленьких пакетов на больших скоростях.

    Важно: требуется для работы с портом в direct-режиме; в обычном режиме включать не рекомендуется.

    В docker-compose.override.yml для сервиса data-plane добавить переменную окружения DATA_PLANE_DPDK_EXTRA_ARGS со значением -w $pciaddr,mprq_en=1 для каждого используемого порта, например, для портов af:00.0 и af:00.1:

    services:
      data-plane:
        network: host
        environment:
          DATA_PLANE_DPDK_EXTRA_ARGS: >
            -w af:00.0,mprq_en=1
            -w af:00.1,mprq_en=1
    
  5. Оптимизация работы с PCI-шиной для AMD EPYC и AMD Ryzen Threadripper. Необходим для достижения максимальной производительности на этих платформах (параметр прошивки порта, указывается один раз, требуется перезагрузка):

    mstconfig -d $pciaddr s PCI_WR_ORDERING=1