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

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

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

Работа с картами Mellanox требует специального драйвера Mellanox OFED. Стандартный драйвер Linux с DPDK работает неэффективно и нестабильно.

  1. Убедиться, что дистрибутив поддерживается OFED, по таблице по ссылке. Рекомендуется Ubuntu 18.04 LTS, так как на нем ведутся тесты при разработке.

  2. Загрузить драйвер версии 4.6, более новые не рекомендуются.

  3. В распаковать архив и запустить установку:

    ./mlnxofedinstall --dpdk --upstream-libs
    
  4. Отключить DevX:

    mstconfig -d $pciaddr set UCTX_EN=0
    

    Нажать y (подтвержить изменения) и перезагрузить машину.

При обновлении OFED нужно повторно отключать DevX.

Настройка 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

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

  1. Отключение Ethernet pause frames (для всех портов):

    ethtool -A $netdev rx off tx off

  2. Включение компрессии (делается один раз для любого из портов, требуется перезагрузка):

    mstconfig -d $pciaddr s CQE_COMPRESSION=1

  3. Задание PCI MaxReadReq в 1024B (для всех портов):

    setpci -s $pciaddr 68.w

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

    setpci -s $pciaddr 68.w=3BCD

    Важно: значение по умолчанию в 512B может оказаться лучше. Нужно проверять на конкретной системе.

  4. Указать дополнительные параметры порта при запуске DPDK:

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

    ...
    services:
      data-plane:
        network: host
        environment:
          DATA_PLANE_DPDK_EXTRA_ARGS: >
            -waf:00.0,mprq_en=1,rxqs_min_mprq=1,txqs_min_inline=1
            -waf:00.1,mprq_en=1,rxqs_min_mprq=1,txqs_min_inline=1
    

    Важно: дополнительный параметр может повлиять на производительность в обе стороны.