В следующих командах $pciaddr
— PCI-адрес устройства (например, 01:00.0),
$netdev
— имя устройства в Linux (например, enp1s0f0
).
Работа с картами Mellanox требует специального драйвера Mellanox OFED. Стандартный драйвер Linux с DPDK работает неэффективно и нестабильно.
Убедиться, что дистрибутив поддерживается OFED, по таблице по ссылке. Рекомендуется Ubuntu 18.04 LTS, так как на нем ведутся тесты при разработке.
Загрузить драйвер версии 4.6, более новые не рекомендуются.
В распаковать архив и запустить установку:
./mlnxofedinstall --dpdk --upstream-libs
Отключить DevX:
mstconfig -d $pciaddr set UCTX_EN=0
Нажать y
(подтвержить изменения) и перезагрузить машину.
При обновлении OFED нужно повторно отключать DevX.
Особенностью работы с драйвером Mellanox является то, что они остаются под управлением Linux, то есть сетевые интерфейсы остаются в системе. Однако передавать через них трафик, когда работает Mitigator, нельзя.
Дальнейшие действия предполагают знакомство с Compose-файлами.
Убедиться, что не происходит попытки привязки PCI-адресов к другому драйверу (например, адреса НЕ встречаются в nics.conf)
Убрать секцию networks
для сервиса data-plane
в файле docker-compose.yml
.
Добавить параметр network_mode: host
сервису data-plane
в файле docker-compose.override.yml
.
Добавить адрес хостовой машины для сервисов
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
Отключение Ethernet pause frames (для всех портов):
ethtool -A $netdev rx off tx off
Включение компрессии (делается один раз для любого из портов, требуется перезагрузка):
mstconfig -d $pciaddr s CQE_COMPRESSION=1
Задание PCI MaxReadReq в 1024B (для всех портов):
setpci -s $pciaddr 68.w
результатом будет 4 цифры ABCD
, выполнить
setpci -s $pciaddr 68.w=3BCD
Важно: значение по умолчанию в 512B может оказаться лучше. Нужно проверять на конкретной системе.
Указать дополнительные параметры порта при запуске 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
Важно: дополнительный параметр может повлиять на производительность в обе стороны.