网路

NVIDIA BlueField-2 DPU 和 DPDK 开发入门指南

DPDK作为DOCA软件框架重要的组成部分,几乎在所有DOCA APP中都会出现,并且占有非常大的比重。因此,除了可以根据DOCA SDK以及提供的示例进行网络相关功能的开发,也可以直接用DPDK API和相关示例进行开发。本人理解的两者区别如下:

  1. DPDK是DOCA的功能子集,DOCA包含了更丰富的功能和加速特性;
  2. 如果设备能够运行DOCA APP,则一定可以运行DPDK APP,反之则不一定;

综上,对于熟悉DPDK的开发者来说,无论是利用DOCA开发还是利用DPDK进行开发都会相对容易很多。因此,特别建议初学者先学会DPDK开发再上手DOCA开发

本文将介绍如何把如下三个DPDK APP快速迁移到NVIDIA BlueField-2 DPU(以下简称bf2)上运行:

·dpdk-testpmd:DPDK中非常重要的测试工具,主要功能包括快速配置端口转发和下发流规则;

·dpdk-l2fwd:DPDK中最简单的转发示例程序,很多APP都可以在此基础上进行开发,进而避免“造轮子”、“从零开始”;

·dpdk-pktgen:非kernel版本的pktgen,能够更快速的生成、发送和接收报文。特别是在DPU Arm上进行对比时,DPDK版本的pktgen效率相对kernel版本的pktgen提升了许多。提起该工具旨在方便对DPU进行网络性能压测;

一、迁移环境

1)bf2 运行在嵌入式模式(Embedded CPU Function Ownership Mode)下,即默认模式;

2)DOCA 版本为DOCA_1.4.0;

3)网络拓扑:

注:如果只有一块bf2且没有光模块,也可以在如下拓扑中用VF+VM进行迁移和压测VF的申请方式和Mellanox CX系列网卡一致,不再赘述,唯一区别是代表口下沉到bf2的Arm子系统中

  • 运行dpdk-testpmd

① DOCA默认集成DPDK(无源码,只有编译后的目录,在/opt/mellanox/dpdk下),查询默认版本的DPDK版本号:

* export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/mellanox/dpdk/lib/aarch64-linux-gnu/pkgconfig

* pkg-config –modversion libdpdk

② 可执行DPDK程序在/opt/mellanox/dpdk/bin下。查询可用的dpdk端口:

特别注意,Mellanox的网卡无需绑定uio或者vfio驱动,即开即用,只不过在运行dpdk app时,该端口的内核网络栈无法使用

③dpdk-testpmd同在/opt/mellanox/dpdk/bin下。在root下运行,转发pf0hpf和p0间的流量:

关闭OVS:

* /etc/init.d/openvswitch-switch stop

申请大页:

* echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

运行app:

* /opt/mellanox/dpdk/bin/dpdk-testpmd -a 03:00.0,representor=[0,65535] — –nb-ports=2 –total-num-mbufs=131000  -i

注意:

  1. 检查mac是否和pf0hpf和p0对应;
  2. testpmd的使用(转发和下发流规则)可在DPDK官网dpdk.org参看学习,不做赘述;
  3. 可以用在宿主机上用ping和iperf等工具进行流量测试;
  4. 运行dpdk-l2fwd

该示例的源码需要DPDK官网(dpdk.org)下载,寻找与默认版本相近的版本下载并复制到Arm中即可,该程序没有任何复杂的功能,非常适合初学者进行学习,以便深入了解bf2;

②进入源码目录,利用make编译,这里不建议使用meson+ninja进行编译;

* export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/mellanox/dpdk/lib/aarch64-linux-gnu/pkgconfig

* make

③ 运行

特别注意:

  1. 一定要加上–no-mac-updating,一定要加上–no-mac-updating,一定要加上–no-mac-updating,重要的事情说三遍!!!
  2. -p指定了端口号(eg:3=0x0011,即绑定0号dpdk端口和1号dpdk端口),不同bf2上的pf0hpf和p0对应的dpdk端口号可能是不一样的,可以多次切换参数值并根据mac地址将端口号识别出来;
  • 运行dpdk-pktgen

①pktgen需要再arm中编译安装新版本的DPDK,经过测试可行的DPDK版本是21.11;

* 下载源码至arm,解压并进入源码目录;

*  meson build

*  ninja -C build

*  cd build

*  ninja install(卸载:ninja uninstall)

*  ldconfig

注意:

·编译可能出现类似如下问题,错误类似“找不到rxp-compiler头文件”,这个应该是其它厂商(Marvell)的驱动。修改报错目录下的meson文件,删除build目录重编即可。

·按照如下修改drivers/regex/octeontx2/meson.build,再重编DPDK:

修改前

修改后

②安装好的版本可能和默认版本冲突,本人解决方案如下:

·使用DPDK-21.11:

* mv  /opt/mellanox/dpdk  /opt/mellanox/dpdk_

* ldconfig

·使用默认版本DPDK:

* cd  dpdk-statble-21.11/build (进入编译目录)

* ninja  uninstall (卸载)

* mv  /opt/mellanox/dpdk_  /opt/mellanox/dpdk(还原目录)

* export  PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/mellanox/dpdk/lib/aarch64-linux-gnu/pkgconfig

* ldconfig

·使用时,记得检测当前环境使用的版本:

* pkg-config  –modversion  libdpdk

③DPDK-21.11环境部署好后,在DPDK官网下载pktgen-21.11,最后在Arm中利用meson和ninja进行编译即可正常使用;

* ./pktgen -m 1024 -b 03:00.0 — -m “[1:2].0”

bf2 Arm中pktgen-21.11运行情况

最后补充,本人在bf2上开发了快一年,受限于需求,所以基本都在用DPDK进行开发。但DOCA是一个更丰富的软件框架,建议熟悉DPDK在bf2上的使用后进一步学习DOCA的使用。另外,上述迁移试验基本都是2022年在bf2中进行的,所碰到的问题可能会随着产品迭代消失,所以本人的经验仅供参考,希望NVIDIA的网络产品越做越好。

参考文档:

  1. NVIDIA BlueField-2 Ethernet DPU User Guide(硬件文档):

https://docs.nvidia.com/networking/display/BlueField2DPUENUG

Tags