Настройка DPDK в виртуальной машине Linux

Внимание

Эта статья ссылается на CentOS, дистрибутив Linux, который приближается к состоянию конца жизни (EOL). Обратите внимание на использование и план соответствующим образом. Дополнительные сведения см. в руководстве centOS End Of Life.

Набор Data Plane Development Kit (DPDK) в Azure предоставляет более быструю платформу пакетной обработки в пользовательском пространстве для высокопроизводительных приложений. Эта платформа обходит сетевой стек ядра виртуальной машины.

В типичной обработке пакетов с использованием сетевого стека ядра применяется процесс на основе прерываний. Когда сетевой интерфейс получает входящие пакеты, есть прерывание ядра для обработки пакета и переключения контекста из пространства ядра в пользовательское пространство. DPDK устраняет переключение контекста и метод взаимодействия на основе прерываний в пользу реализации в пользовательском пространстве с использованием драйверов режима опроса (PMD) для быстрой обработки пакетов.

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

DPDK может работать на виртуальных машинах Azure, поддерживающих несколько дистрибутивов операционной системы. Ключевое отличие DPDK с точки зрения производительности — реализация виртуализации сетевых функций. Эти реализации могут принять форму сетевых виртуальных модулей (NVA), таких как виртуальный маршрутизатор, брандмауэр, VPN, подсистема балансировки нагрузки, развитое пакетное ядро и приложения типа "отказ в обслуживании" (DDoS).

Список инструкций по настройке DPDK на виртуальных машинах MANA доступен здесь: Сетевой адаптер Microsoft Azure (MANA) и DPDK в Linux

Преимущества

Большее количество пакетов в секунду (PPS). Обход ядра и управление пакетами в пространстве пользователя уменьшают количество циклов за счет исключения переключения контекста. Благодаря этому также повышается скорость обработки пакетов в секунду на виртуальных машинах Linux в Azure.

Поддерживаемые операционные системы — минимальные версии

Поддерживаются следующие дистрибутивы из Azure Marketplace:

ОС Linux Версия ядра
Ubuntu 18.04 4.15.0-1014-azure+
SLES 15 SP1 4.12.14-8.19-azure и более поздние
RHEL 7.5 3.10.0-862.11.6.el7.x86_64+
CentOS 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-cloud+

Указанные версии являются минимальными. Более новые версии тоже поддерживаются.

Список требований для DPDK на виртуальных машинах MANA доступен здесь: Сетевой адаптер Microsoft Azure (MANA) и DPDK в Linux

Поддержка настраиваемого ядра

Любую версию ядра Linux, не указанную в списке, можно найти в репозитории GitHub. Чтобы получить дополнительные сведения, обратитесь по адресу aznetdpdk@microsoft.com.

Поддержка регионов

Все регионы Azure поддерживают DPDK.

Необходимые компоненты

На виртуальной машине Linux необходимо включить ускоренную работу в сети. Виртуальная машина должна иметь по крайней мере два сетевых интерфейса с одним интерфейсом для управления. Включение ускоренной сети в интерфейсе управления не рекомендуется. Сведения о создании виртуальной машины Linux с ускоренной сетью см. в этой статье.

Кроме того, DPDK использует команды RDMA для создания очередей данных на сетевом адаптере. Убедитесь, что на виртуальной машине загружены правильные драйверы ядра RDMA. Они могут быть mlx4_ib, mlx5_ib или mana_ib в зависимости от размеров виртуальных машин.

Инструкции по установке DPDK для виртуальных машин MANA доступны здесь: сетевой адаптер Microsoft Azure (MANA) и DPDK в Linux

Установка зависимостей сборки

RHEL7.5/CentOS 7.5

yum -y groupinstall "Infiniband Support"
sudo dracut --add-drivers "mlx4_en mlx4_ib mlx5_ib" -f
yum install -y gcc kernel-devel-`uname -r` numactl-devel.x86_64 librdmacm-devel libmnl-devel meson

Компиляция и установка DPDK вручную

  1. Скачайте последнюю версию DPDK. Для Azure рекомендуется использовать LTS версии 22.11 или более поздней версии.

  2. Создайте конфигурацию по умолчанию с помощью команды meson builddir.

  3. Выполните сборку с помощью ninja -C builddir.

  4. Выполните установку с помощью команды DESTDIR=<output folder> ninja -C builddir install.

Настройка среды выполнения

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

  1. Hugepages.

    • Настройте функцию больших страниц, выполнив следующую команду (один раз для каждого узла NUMA):
     echo 1024 | sudo tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages
    
    • Создайте каталог для подключения с помощью команды mkdir /mnt/huge.

    • Подключите большие страницы с помощью команды mount -t hugetlbfs nodev /mnt/huge.

    • Проверьте, зарезервированы ли большие страницы, с помощью команды grep Huge /proc/meminfo.

    • Приведенный выше пример предназначен для 2M огромных страниц. Также можно использовать огромные страницы 1G.

    Примечание.

    Вы можете изменить файл grub, чтобы большие страницы были зарезервированы при загрузке, выполнив эти инструкции для DPDK. Инструкции находятся в нижней части страницы. При использовании виртуальной машины Linux Azure измените файлы в разделе /etc/config/grub.d, чтобы резервировать большие страницы при перезагрузках.

  2. MAC- и IP-адреса. Эти адреса сетевых интерфейсов можно просмотреть с помощью команды ifconfig –a. Сетевые интерфейсы VF и NETVSC имеют одинаковый MAC-адрес, но лишь сетевой интерфейс NETVSC имеет IP-адрес. Интерфейсы VF работают как подчиненные интерфейсов NETVSC.

  3. PCI-адреса

    • Узнайте, какой PCI-адрес нужно использовать для VF, с помощью команды ethtool -i <vf interface name>.

    • Если eth0 имеет ускоренную сеть, убедитесь, что testpmd случайно не использует устройство PCI VF для eth0. Если приложение DPDK случайно захватило сетевой интерфейс управления, что привело к потери SSH-подключения, используйте последовательную консоль для прекращения работы приложения DPDK. Последовательную консоль также можно использовать для остановки или запуска виртуальной машины.

  4. Загружайте ibuverbs при каждой перезагрузке с помощью команды modprobe -a ib_uverbs. Только для SLES 15 загрузите mlx4_ib с помощью команды modprobe -a mlx4_ib.

Главный PMD

Приложения DPDK должны выполняться через главный PMD, предоставляемый в Azure. Если приложение работает непосредственно через VF PMD, оно не получает все пакеты, предназначенные для виртуальной машины, так как некоторые из них отображаются в синтетическом интерфейсе. DPDK поддерживает два типа главных PMD: NetVSC PMD и Failsafe PMD. Главный PMD гарантирует, что приложение получает все пакеты, предназначенные для него. Кроме того, приложение продолжает работать в режиме DPDK по главному PMD, даже если VF отозван при обслуживании узла.

NetVSC PMD

NetVSC — это рекомендуемый PMD для запуска в качестве главного PMD в Azure. Это гарантирует, что приложение получает все пакеты, предназначенные для него. Это также позволяет убедиться, что приложение продолжает выполняться в режиме DPDK, даже если VF отменяется при обслуживании узла. Дополнительные сведения об использовании и настройке PMD NetVSC см. в разделе (https://doc.dpdk.org/guides/nics/netvsc.html).

Отказоустойчивый драйвер PMD

Примечание. Выполнение с неработобезопасным PMD не рекомендуется в Azure. Если версия DPDK составляет 22.11 LTS или более поздней, рекомендуется использовать NetVSC PMD.

В качестве альтернативы можно запустить приложение DPDK по протоколу PMDe с ошибкой. Дополнительные сведения о сбое PMD см . в библиотеке драйверов в режиме опроса с безопасностью с ошибкой.

Запуск testpmd

Чтобы запустить testpmd в режиме root, выполните сначала команду sudo.

Основное: проверка работоспособности, инициализация отказоустойчивого адаптера

  1. Выполните следующие команды, чтобы запустить приложение testpmdс с одним портом:

    testpmd -w <pci address from previous step> \
      -- -i \
      --port-topology=chained
    
  2. Чтобы запустить приложение testpmdс с двумя портами, выполните следующие команды:

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    -- -i
    

После запуска testpmd выполните команду show port info all, чтобы проверить сведения о порте. Вы увидите один или два порта DPDK, которые net_netvsc.

  1. Используйте команду start <port> /stop <port> для запуска трафика.

Предыдущие команды запускают testpmd в интерактивном режиме, что и рекомендуется, чтобы попробовать выполнить команды testpmd.

Основное: одиночные отправитель и получатель

Следующие команды периодически выводят статистику пакетов в секунду:

  1. Выполните приведенную ниже команду на стороне отправки:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. Выполните приведенную ниже команду на стороне приема:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=rxonly \
      --eth-peer=<port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

При выполнении предыдущих команд в виртуальной машине измените адреса IP_SRC_ADDR и IP_DST_ADDR в app/test-pmd/txonly.c, чтобы они соответствовали фактическому IP-адресу виртуальных машин перед сборкой. В противном случае пакеты будут удалены, прежде чем они достигнут получателя.

Дополнительно: одиночные отправитель и сервер пересылки

Следующие команды периодически выводят статистику пакетов в секунду:

  1. Выполните приведенную ниже команду на стороне отправки:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. Выполните приведенную ниже команду на стороне пересылки:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address NIC1> \
      -w <pci address NIC2> \
      -- --nb-cores <number of cores to use for test pmd> \
      --forward-mode=io \
      --eth-peer=<recv port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

При выполнении предыдущих команд в виртуальной машине измените адреса IP_SRC_ADDR и IP_DST_ADDR в app/test-pmd/txonly.c, чтобы они соответствовали фактическому IP-адресу виртуальных машин перед сборкой. В противном случае пакеты будут удалены, прежде чем они достигнут сервера пересылки. Вы не можете получить переадресованный трафик третьего компьютера, так как модуль пересылки testpmd не изменяет адреса уровня 3, если только вы не вносите некоторые изменения кода.

sudo yum install -y dpdk

Ссылки