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

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

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

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

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

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

Большее количество пакетов в секунду (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+

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

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

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

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

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

Предварительные требования

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

На виртуальных машинах, использующих InfiniBand, проверьте и обеспечьте загрузку соответствующих драйверов mlx4_ib или mlx5_ib, как описано в статье Включение InfiniBand.

Ubuntu 18.04

sudo add-apt-repository ppa:canonical-server/server-backports -y
sudo apt-get update
sudo apt-get install -y dpdk

Ubuntu 20.04 и выше

sudo apt-get install -y dpdk

Debian 10 и выше

sudo apt-get install -y dpdk

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

Ubuntu 18.04

sudo add-apt-repository ppa:canonical-server/server-backports -y
sudo apt-get update
sudo apt-get install -y build-essential librdmacm-dev libnuma-dev libmnl-dev meson

Ubuntu 20.04 и выше

sudo apt-get install -y build-essential librdmacm-dev libnuma-dev libmnl-dev meson

Debian 10 и выше

sudo apt-get install -y build-essential librdmacm-dev libnuma-dev libmnl-dev meson

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

SLES 15 SP1

Ядро Azure

zypper  \
  --no-gpg-checks \
  --non-interactive \
  --gpg-auto-import-keys install kernel-azure kernel-devel-azure gcc make libnuma-devel numactl librdmacm1 rdma-core-devel meson

Ядро по умолчанию

zypper \
  --no-gpg-checks \
  --non-interactive \
  --gpg-auto-import-keys install kernel-default-devel gcc make libnuma-devel numactl librdmacm1 rdma-core-devel meson

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

  1. Скачайте последнюю версию DPDK. Для Azure требуется версия 19.11 LTS или новее.
  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.

      [ПРИМЕЧАНИЕ] Вы можете изменить файл 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 гарантирует, что приложение получит все пакеты, которые были ему отправлены. Это также позволяет убедиться, что приложение продолжает выполняться в режиме DPDK, даже если VF отменяется при обслуживании узла. Дополнительные сведения об отказоустойчивом PMD см. в разделе Fail-safe poll mode driver library (Библиотека отказоустойчивого драйвера режима опроса).

Запуск testpmd

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

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

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

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

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    --vdev="net_vdev_netvsc0,iface=eth1" \
    --vdev="net_vdev_netvsc1,iface=eth2" \
    -- -i
    

    При запуске testpmd с более чем двумя сетевыми адаптерами аргумент --vdev выглядит подобно следующему шаблону: net_vdev_netvsc<id>,iface=<vf’s pairing eth>.

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

  4. Используйте команду 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> \
      --vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
      -- --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> \
      --vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
      -- --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> \
      --vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
      -- --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> \
      --vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
      --vdev="net_vdev_netvsc<2nd id>,iface=<2nd iface to attach to>" (you need as many --vdev arguments as the number of devices used by testpmd, in this case) \
      -- --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, если вы не внесли изменения в код.

Ссылки