在 Linux 虚拟机中设置 DPDK

Azure 中的数据平面开发工具包 (DPDK) 提供了更快速的用户空间包处理框架,适用于性能密集型应用程序。 此框架绕过虚拟机的内核网络堆栈。

在使用内核网络堆栈的典型包处理中,进程是由中断指令驱动。 当网络接口收到传入的包时,不仅有内核中断指令会处理包,还有上下文切换会从内核空间切换到用户空间。 DPDK 消除了上下文切换和中断指令驱动方法,而是实现用户空间,以使用轮询模式驱动程序来加速包处理。

DPDK 由多组用户空间库构成,这些库提供对较低级别资源的访问权限。 这些资源包括硬件、逻辑核心、内存管理和网络接口卡的轮询模式驱动程序。

DPDK 可以在支持多个操作系统分发版的 Azure 虚拟机中运行。 DPDK 在驱动网络功能虚拟化实现方面提供与众不同的关键性能。 这些实现可采用网络虚拟设备 (NVA) 的形式,如虚拟路由器、防火墙、VPN、负载均衡器、演进包核心和拒绝服务 (DDoS) 应用程序。

此处提供了 MANA VM 上 DPDK 的设置说明列表:Linux 上的 Azure 网络适配器(MANA)和 DPDK

优势

提高每秒包数 (PPS) :绕过内核并控制用户空间中的包可消除上下文切换,从而减少周期计数。 同时,这还会提高 Azure Linux 虚拟机中每秒处理的包比率。

支持的操作系统最低版本

支持 Azure 市场中的以下分发版:

Linux OS 内核版本
Ubuntu 18.04 4.15.0-1014-azure+
SLES 15 SP1 4.12.14-8.19-azure+
CentOS 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-cloud+

所记录的版本是最低要求。 还支持较新版本。

此处提供了 MANA VM 上 DPDK 的要求列表:Linux 上的 Azure 网络适配器(MANA)和 DPDK

自定义内核支持

对于未列出的任何 Linux 内核版本,请参阅用于生成 Azure 优化 Linux 内核的修补程序。 有关详细信息,还可以联系 aznetdpdk@microsoft.com

区域支持

所有 Azure 区域都支持 DPDK。

先决条件

必须在 Linux 虚拟机上启用加速网络。 虚拟机应至少有两个网络接口,其中一个接口用于管理。 不建议在管理界面上启用加速网络。 了解如何创建启用加速网络的 Linux 虚拟机

此外,DPDK 会使用 RDMA 谓词在网络适配器上创建数据队列。 在 VM 中,确保加载正确的 RDMA 内核驱动程序。 它们可以为 mlx4_ib、mlx5_ib 或 mana_ib,具体取决于 VM 大小。

此处提供了适用于 MANA VM 的 DPDK 安装说明:Linux 上的 Azure 网络适配器(MANA)和 DPDK

安装版本依赖项

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 安装版本 22.11 LTS 或更高版本。

  2. 运行 meson builddir 生成默认配置。

  3. 使用 ninja -C builddir 进行编译。

  4. 使用 DESTDIR=<output folder> ninja -C builddir install 进行安装。

配置运行时环境

重启后,运行下面的命令一次:

  1. 巨页

    • 针对每个 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 的说明操作。 页面底部提供了这些说明。 如果使用的是 Azure Linux 虚拟机,请改为将 /etc/config/grub.d 下的文件修改为跨重启保留巨页。

  2. MAC 和 IP 地址:使用 ifconfig –a 查看网络接口的 MAC 和 IP 地址。 VF 网络接口和 NETVSC 网络接口具有相同的 MAC 地址,但只有 NETVSC 网络接口具有 IP 地址。 VF 接口以 NETVSC 接口的从属接口形式运行 。

  3. PCI 地址

    • 运行 ethtool -i <vf interface name> 确定对 VF 使用哪个 PCI 地址。

    • 如果 eth0 已启用加速网络,请确保 testpmd 不会意外接管 eth0 的 VF PCI 设备 。 如果 DPDK 应用程序意外接管管理网络接口,并导致 SSH 连接断开,请使用串行控制台来停止 DPDK 应用程序。 串行控制台还可用于停止或启动虚拟机。

  4. 每次重新启动后,使用 modprobe -a ib_uverbs 加载 ibuverbs。 (仅适用于 SLES 15)另外,使用 modprobe -a mlx4_ib 加载 mlx4_ib

主 PMD

DPDK 应用程序必须通过在 Azure 中公开的主 PMD 运行。 如果应用程序直接通过 VF PMD 运行,它不会收到发往 VM 的所有包,因为一些包通过综合接口显示。 DPDK 支持两种类型的主 PMD:NetVSC PMD 和故障安全 PMD。 主 PMD 可保证应用程序接收以其为目标的所有数据包。 此外,还可确保应用程序继续在 DPDK 模式下运行,即使在为主机提供服务时撤销了 VF 也不例外。

NetVSC PMD

NetVSC 是建议在 Azure 中作为主 PMD 运行的 PMD。 它会保证应用程序接收以其为目标的所有数据包。 此外,还能确保应用程序继续以 DPDK 模式运行,即使在为主机提供服务时撤销了 VF,也不例外。 有关如何使用和配置 NetVSC PMD 的详细信息,请参阅(https://doc.dpdk.org/guides/nics/netvsc.html)。

防故障 PMD

注意:不建议在 Azure 中通过防故障 PMD 运行。 如果 DPDK 版本为 22.11 LTS 或更高版本,则建议使用 NetVSC PMD。

作为替代方法,可以通过防故障 PMD 运行 DPDK 应用程序。 若要详细了解防故障 PMD,请参阅防故障轮询模式驱动程序库

运行 testpmd

若要在根模式下运行 testpmd,请在 testpmd 命令前面使用 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
    

启动后,运行 show port info all 检查端口信息。 应会看到一个或两个值为 net_netvsc 的 DPDK 端口。

  1. 使用 start <port> /stop <port> 启动流量。

上面的命令在交互模式下启动 testpmd,这是建议用于试用 testpmd 命令的模式。

基本:单个发送端/单个接收端

以下命令定期列显每秒数据包数的统计信息:

  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. 在 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 更改为与虚拟机的实际 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 更改为与虚拟机的实际 IP 地址一致,再进行编译。 否则,数据包在抵达转发端之前将被丢弃。 你无法使用第三台计算机来接收转发的流量,因为除非做出一些代码更改,否则 testpmd 转发器不会修改第 3 层地址。

sudo yum install -y dpdk

参考