DPDK作為DOCA軟件框架重要的組成部分,幾乎在所有DOCA APP中都會出現,并且占有非常大的比重。因此,除了可以根據DOCA SDK以及提供的示例進行網絡相關功能的開發,也可以直接用DPDK API和相關示例進行開發。本人理解的兩者區別如下:
- DPDK是DOCA的功能子集,DOCA包含了更豐富的功能和加速特性;
- 如果設備能夠運行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

注意:
- 檢查mac是否和pf0hpf和p0對應;
- testpmd的使用(轉發和下發流規則)可在DPDK官網dpdk.org參看學習,不做贅述;
- 可以用在宿主機上用ping和iperf等工具進行流量測試;
- 運行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

③ 運行

特別注意:
- 一定要加上–no-mac-updating,一定要加上–no-mac-updating,一定要加上–no-mac-updating,重要的事情說三遍!!!
- -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的網絡產品越做越好。
參考文檔:
- NVIDIA BlueField-2 Ethernet DPU User Guide(硬件文檔):
https://docs.nvidia.com/networking/display/BlueField2DPUENUG
- NVIDIA BLUEFIELD DPU PLATFORM OPERATING SYSTEM v3.9.2 DOCUMENTATION(軟件文檔):https://docs.nvidia.com/networking/display/BlueFieldDPUOSLatest
- DOCA SDK文檔:https://docs.nvidia.com/doca/sdk/index.html
- DPDK官網:https://www.dpdk.org/
- DPDK文檔:http://core.dpdk.org/doc/archives/
- DPDK-Pktgen文檔:https://pktgen-dpdk.readthedocs.io/en/latest/