Поделиться через


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

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

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

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+
Debian 10 4.19.0-1-cloud+

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

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

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

Для любой версии ядра Linux, не указанной в списке, см. Патчи для создания настроенного под Azure ядра Linux. Чтобы получить дополнительные сведения, обратитесь по адресу 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

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.

    • Подключите hugepages с помощью mount -t hugetlbfs nodev /mnt/huge.

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

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

    Примечание.

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

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

  3. PCI-адреса

    • Узнайте, какой PCI-адрес нужно использовать для 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 на устойчивом PMD. Для получения дополнительной информации о резервном PMD см. библиотеку драйверов режима опроса с отказоустойчивостью.

Запуск testpmd

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

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

  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
    

После запуска выполните команду 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. Выполните следующую команду на приемной стороне (RX):

    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. Выполните следующую команду на стороне TX:

    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. Выполните следующую команду на стороне FWD:

    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

Ссылки