在 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 大小。
手动安装 DPDK(建议)
此处提供了适用于 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
下载最新的 DPDK。 建议为 Azure 安装版本 22.11 LTS 或更高版本。
运行
meson builddir
生成默认配置。使用
ninja -C builddir
进行编译。使用
DESTDIR=<output folder> ninja -C builddir install
进行安装。
配置运行时环境
重启后,运行下面的命令一次:
巨页
- 针对每个 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 下的文件修改为跨重启保留巨页。
MAC 和 IP 地址:使用
ifconfig –a
查看网络接口的 MAC 和 IP 地址。 VF 网络接口和 NETVSC 网络接口具有相同的 MAC 地址,但只有 NETVSC 网络接口具有 IP 地址。 VF 接口以 NETVSC 接口的从属接口形式运行 。PCI 地址
运行
ethtool -i <vf interface name>
确定对 VF 使用哪个 PCI 地址。如果 eth0 已启用加速网络,请确保 testpmd 不会意外接管 eth0 的 VF PCI 设备 。 如果 DPDK 应用程序意外接管管理网络接口,并导致 SSH 连接断开,请使用串行控制台来停止 DPDK 应用程序。 串行控制台还可用于停止或启动虚拟机。
每次重新启动后,使用
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
。
基本:健全性检查、防故障适配器初始化
运行以下命令启动单端口 testpmd 应用程序:
testpmd -w <pci address from previous step> \ -- -i \ --port-topology=chained
运行以下命令启动双端口 testpmd 应用程序:
testpmd -w <pci address nic1> \ -w <pci address nic2> \ -- -i
启动后,运行 show port info all
检查端口信息。 应会看到一个或两个值为 net_netvsc 的 DPDK 端口。
- 使用
start <port> /stop <port>
启动流量。
上面的命令在交互模式下启动 testpmd,这是建议用于试用 testpmd 命令的模式。
基本:单个发送端/单个接收端
以下命令定期列显每秒数据包数的统计信息:
在 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>
在 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 地址一致,再进行编译。 否则,数据包在抵达接收端之前将被丢弃。
高级:单个发送端/单个转发端
以下命令定期列显每秒数据包数的统计信息:
在 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>
在 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 层地址。
通过系统包安装 DPDK(不建议)
sudo yum install -y dpdk