Перейти к основному содержимому
Как настроить Nginx-DPDK в SelectOS

Как настроить Nginx-DPDK в SelectOS

к сведению

Наше решение совместимо с картами Intel® и Mellanox из перечня поддерживаемых карт.

Данная инструкция предназначена для карт Intel®. Для карт Mellanox будет разработана отдельная инструкция.

Шаг 1: установите fast-nginx

Ускоренная версия Nginx находится в тестовом репозитории в пакете fast-nginx.

примечание
  1. Откройте файл /etc/apt/sources.list.d/1.0.list.

  2. Закомментируйте основной репозиторий:

    deb [signed-by=/usr/share/keyrings/selectos-archive-keyring.gpg] https://stable.see.selectel.ru selectos main contrib
  3. Добавьте тестовый репозиторий:

    deb [signed-by=/usr/share/keyrings/selectos-archive-keyring.gpg] https://testing.see.selectel.ru selectos main contrib
  4. Выполните sudo apt update для обновления кеша пакетного менеджера.

  5. Установите пакет fast-nginx.

    apt install fast-nginx

    При установке пакета будут установлены все необходимые зависимости.

Шаг 2: настройте конфигурацию DPDK

примечание
  1. Откройте файл /usr/local/fast-nginx/conf/f-stack.conf
  2. Укажите номера используемых ядер для работы утилиты.
  3. Укажите количество каналов памяти.
  4. Настройте сеть для работы сервера.

Номера используемых ядер для работы утилиты

Hexadecimal bitmask of cores to run on

к сведению

Все указанные ядра будут полностью использованы для Nginx-DPDK.

Пример расчета

Количество ядер в процессоре: 8

Используемые ядра: первое, четвертое

Маска для заполнения параметра будет выглядеть так:

  • в двоичном виде 10010000,
  • в шестнадцатеричном виде 0x90.

Количество и номера ядер являются абсолютной величиной.

Рекомендуем использовать порядковые номера ядер относительно каждого процессора в отдельности. При указании ядер разных процессоров память для процессов может распределиться некорректно.

Количество каналов памяти

Number of memory channels

# Получить информацию об их количестве
dmidecode -t memory | grep Locator

Настройка сети

addr, netmask, broadcast, gateway

Конфигурация сети IPv4 находится под заголовком [port0].

Укажите адресацию, которую будете использовать для работы сервиса. Значения, предустановленные в конфигурационном файле, является примером.

Пример конфига
[port0]
addr=192.168.1.2
netmask=255.255.255.0
broadcast=192.168.1.255
gateway=192.168.1.1
# IPv6 net addr
# Optional parameters
#addr6=ff::02
#prefix_len=64
#gateway6=ff::01

Шаг 3: настройте конфигурацию Nginx

примечание
  1. Откройте файл /usr/local/fast-nginx/conf/nginx.conf
  2. В параметре worker_processes укажите количество ядер из маски Hexadecimal bitmask of cores to run on.

Шаг 4: настройте конфигурацию сети

Настройки сети обязательно необходимо указать полностью независимо от организации связности между машинами.

примечание
  1. Откройте файл /usr/local/fast-nginx/tools/Makefile.

  2. Укажите значения следующих параметров.

    INTERFACEимя интерфейса, который будет использоваться для работы с DPDK
    PCI_PORTномер порта шины PCI
    IPпосмотреть заголовки доступных версий всех пакетов
    NETMASKмаска сети
    BROADCASTшироковещательный адрес
    ETHERMAC интерфейса, который предполагается использовать
    GATEWAYшлюз

    Номер порта шины PCI можно получить:

    • из вывода lspci
    • использовать имеющийся в директории скрипт dpdk-devbind.py с флагом -s
  3. В блоке deinit укажите актуальный драйвер в зависимости от используемой сетевой карты.

Пример конфига
DRIVER=vfio-pci
HUGEPAGES_COUNT=8192
INTERFACE=enp21s0f0
PCI_PORT=0000:15:00.0

PREFIX=/usr/local/fast-nginx
DEVBIND=python3 $(PREFIX)/tools/dpdk-devbind.py
MODULES=$(PREFIX)/modules

IP=10.10.10.10
NETMASK=255.255.255.0
BROADCAST=10.10.10.255
ETHER=40:a6:b7:52:ef:fc
GATEWAY=10.10.10.1

init:
@echo $(HUGEPAGES_COUNT) | tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
@mkdir -p /mnt/huge
@mount -t hugetlbfs nodev /mnt/huge
@modprobe $(DRIVER)
-@insmod $(MODULES)/rte_kni.ko carrier=on

-@ip link set dev $(INTERFACE) down
@$(DEVBIND) -b $(DRIVER) $(PCI_PORT)

nginx:
$(PREFIX)/sbin/nginx

stop:
$(PREFIX)/sbin/nginx -s stop

inet:
@ifconfig veth0 $(IP) netmask $(NETMASK) broadcast $(BROADCAST) hw ether $(ETHER)
@route add -net 0.0.0.0 gw $(GATEWAY) dev veth0

deinit:
$(DEVBIND) -u $(PCI_PORT)
$(DEVBIND) -b i40e $(PCI_PORT)
@ip link set dev $(INTERFACE) up

@ifconfig $(INTERFACE) $(IP) netmask $(NETMASK) broadcast $(BROADCAST) hw ether $(ETHER)
@route add -net 0.0.0.0 gw $(GATEWAY) dev $(INTERFACE)

Шаг 5: запустите fast-nginx

Makefileзапустить, инициализировать и деинициализировать DPDK
make initинициализировать DPDK
make nginxзапустить Nginx
make inetнастроить виртуальный интерфейс для работы с DPDK
make nginx -stopостановить Nginx
make deinitдеинициализировать DPDK (рекомендуем выполнять через nohup)

Шаг 6: проверьте привязку интерфейсов

  1. Запустите скрипт dpdk-devbind.py -s.

    Совместно с запуском скрипта произойдет удаление интерфейса из доступных для управления.

  2. Проверьте вывод скрипта.

    При успешном выполнении интерфейс, указанный в настройках, перенесётся в раздел Network devices using DPDK-compatible driver.

    Network devices using DPDK-compatible driver
    ============================================
    0000:02:00.0 'I210 Gigabit Network Connection 1533' drv=vfio-pci unused=igb,igb_uio
    Network devices using kernel driver
    ===================================
    0000:01:00.0 'I210 Gigabit Network Connection 1533' if=inet0 drv=igb
    unused=igb_uio,vfio-pci *Active*

Рекомендации

примечание
  • Для проверки состояния Nginx воспользуйтесь htop, top или ps.
  • Для перезапуска Nginx с новыми параметрами достаточно провести обновление конфигурации командой nginx -s reload.
  • При изменении конфигурации f-stack потребуется полностью пройти процесс запуска: всё остановить и запустить снова.

Возникающие ошибки и примечания

Ошибка BIOS

примечание

Если не включен VT-d при запуске, произойдет следующая ошибка:

Error: bind failed for 0000:02:00.0 - Cannot bind to driver vfio-pci: [Errno 22]
Invalid argument
Error: unbind failed for 0000:02:00.0 - Cannot open /sys/bus/pci/drivers//unbind:
[Errno 13] Permission denied: '/sys/bus/pci/drivers//unbind'
make: *** [Makefile:25: init] Error 1

Решение

Обратитесь в техническую поддержку с просьбой включить параметр в BIOS.

Ошибки главного процесса

примечание

Nginx создаёт N+1 процессов в системе (один главный и N рабочих процессов). Если что-то произойдёт с главным процессом, то рабочие процессы потребуется завершать по-отдельности.

Решение

Завершите рабочие процессы по-отдельности и запустите Nginx заново.

Иные ошибки

примечание

При возникновении иных ошибок, выполните следующие команды и направьте их результаты через тикет-систему для анализа:

  1. lspci -t
  2. ls -l /sys/kernel/iommu_groups/
  3. dmesg | grep -i iommu