DPDK及其上层应用的安装使用

本文最后更新于:2023年9月22日 下午

DPDK及其上层应用的安装使用

DPDK是Intel公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。

DPDK

安装

DPDK需要根据系统版本选择,版本的选择可查看DPDK官方文档,由于当前内核为Ubuntu20.04.5故选用dpdk版本为20.11版本,文档中也提供相应的安装方式。

软件包

1
2
3
$ sudo apt-get install meson
$ sudo apt-get install python3-pyelftools
$ sudo apt-get install pkg-config

安装步骤

1
2
3
4
5
6
7
$ git clone git://dpdk.org/dpdk-stable
$ cd dpdk-stable
$ git checkout 20.11
$ meson build
$ cd build
$ ninja
$ ninja install

检查是否安装成功:

1
2
$ pkg-config --modversion libdpdk
20.11.2

dpdk-20.11 默认会编译 app 目录下的所有应用,比如 testpmd,编译完成后生成的可执行文件在 ./build/app 目录下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ls -l build/app
...
-rwxr-xr-x 1 root root 16949456 12月 13 09:56 dpdk-pdump
-rwxr-xr-x 1 root root 16950176 12月 13 09:56 dpdk-proc-info
-rwxr-xr-x 1 root root 16949984 12月 13 09:56 dpdk-test-acl
-rwxr-xr-x 1 root root 17088760 12月 13 09:56 dpdk-test-bbdev
-rwxr-xr-x 1 root root 16950688 12月 13 09:56 dpdk-test-cmdline
-rwxr-xr-x 1 root root 16984424 12月 13 09:56 dpdk-test-compress-perf
-rwxr-xr-x 1 root root 17024104 12月 13 09:56 dpdk-test-crypto-perf
-rwxr-xr-x 1 root root 17058480 12月 13 09:56 dpdk-test-eventdev
-rwxr-xr-x 1 root root 16949448 12月 13 09:56 dpdk-test-fib
-rwxr-xr-x 1 root root 16970928 12月 13 09:56 dpdk-test-flow-perf
-rwxr-xr-x 1 root root 16965288 12月 13 09:56 dpdk-test-pipeline
-rwxr-xr-x 1 root root 17826888 12月 13 09:56 dpdk-testpmd
-rwxr-xr-x 1 root root 16948944 12月 13 09:56 dpdk-test-regex
-rwxr-xr-x 1 root root 16948936 12月 13 09:56 dpdk-test-sad
...

相关命令

查看网卡绑定情况

1
./dpdk-stable-20.11.9/usertools/dpdk-devbind.py -s

image-20230921134405249

TestPMD安装使用

TestPMD是一个使用DPDK软件包分发的参考应用程序。其主要目的是在网络接口的以太网端口之间转发数据包。

image-20230921134040659

编译igb_uio驱动

1
2
3
$ git clone http://dpdk.org/git/dpdk-kmods
$ cd dpdk-kmods/linux/igb_uio
$ make

加载uio、igb_uio

1
2
$ modprobe uio
$ insmod ./dpdk-kmods/linux/igb_uio/igb_uio.ko intr_mode=legacy

配置大页内存

1
$ echo 512  >  /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

运行TestPMD

网卡驱动绑定至igb_uio

注意:Mellanox网卡不需要绑定可以直接检测到设备,其他网卡需要进行绑定。

1
2
3
$ ifconfig ens33 down
$ ifconfig ens34 down
$ dpdk-devbind.py -b igb_uio <网卡名称 or 网卡的BDF号>

运行

1
2
$ cd dpdk-stable-21.11.2/build/app/
$ sudo ./dpdk-testpmd -l 0-3 -n 4 -- -i --portmask=0x3 --nb-cores=2

image-20230921113227538

-l 参数用来设置用到的逻辑核。0核用来管理命令行,1、2核用来转发数据包。-n 参数用来指定使用的内存通道数。–(破折号)分开了EAL参数和应用程序参数。端口掩码指定使用的网卡端口。--nb-cores用来指定两个核作为数据的转发。

解绑

1
2
3
4
5
6
$ lspci | grep Eth
$ dpdk-devbind.py -u 02:02.0 02:03.0
$ modprobe e1000
$ ./dpdk-stable-20.11.9/usertools/dpdk-devbind.py -b e1000 0000:02:01.0
$ ifconfig ens33 up
$ ifconfig ens34 up

TestPMD的相关使用

启动转发

1
$ testpmd> start

停止转发

1
$ testpmd> stop

查看当前所有在用端口的相关统计

1
$ testpmd> show port stats all

查看port信息

1
$ testpmd> show port info 0

使用多核

1
2
3
4
5
6
7
testpmd> set nbcore 2

testpmd> show config fwd

io packet forwarding - ports=2 - cores=2 - streams=2 NUMA support disabled, MP over anonymous pages disabled
Logical Core 13 (socket 1) forwards packets on 1 streams:P=0/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:01
Logical Core 14 (socket 1) forwards packets on 1 streams:P=1/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00

更改转发模式

TestPMD 的转发模式包括:

  • io(输入/输出模式):通常也被称为 IO 模式,是最常用的转发模式,也是 TestPMD 启动时的默认模式。在该模式下,CPU 从一个端口接收数据包(Rx),并将其发送到另一个端口(Tx)。如果需要的话,一个端口可同时用于接收和发送。

  • rxonly(收包模式):在此模式下,TestPMD 会轮询 Rx 端口的数据包,然后直接释放而不发送,以这种方式充当数据包接收器。

  • txonly(发包模式):在此模式下,TestPMD 生成 64Byte 的 IP 数据包,并从 Tx 端口发送出去。不接收数据包,仅作为数据包的发送源。

  • mac:在转发报文前修改报文的 src MAC 地址和 dst MAC 地址。默认的行为是将 src MAC 地址设置为转发接口的 MAC 地址,将 dst MAC 地址设置为预设的 MAC 地址,可以通过 eth-peer 或 eth-peers-configfile 命令参数,在程序启动时配置预设 MAC 地址。目前还不支持对 src MAC 地址进行预设。

  • macswap:MAC 交换转发模式,在转发报文之前交换报文的 src MAC 地址和 dst MAC 地址。

  • flowgen:多数据流生成模式,根据不同的 dst IP 地址生成一组数据流,同时终结接收到的流量。

  • csum:根据报文的 offload 标记,通过硬件或软件方法修改报文的 checksum 字段。

  • icmpecho:接收一组报文,查找是否有 ICMP echo 请求,如果有,就回应 ICMP echo reply。

  • ieee1588:演示对 Rx 和 Tx 基于 L2 IEEE1588 V2 PTP 时间同步特性,需要配置 CONFIG_RTE_LIBRTE_IEEE1588=y。

  • 5tswap:交换L2,L3,L4的源和目的地 (如果存在)。

    ​ L2交换以太网的源地址和目的地址,与macswap相同。

    ​ L3交换IP (v4和v6) 的源地址和目的地址。

    ​ L4交换传输层的源端口和目的端口 (TCP和UDP)。

  • shared-rxq:仅接收共享Rx队列。从mbuf中解析数据包源端口,并相应地更新流统计信息。

1
2
testpmd> set fwd rxonly
testpmd> start

检查转发配置

1
$ testpmd> show config fwd

image-20230921113320721

表明 TestPMD 正使用默认的 IO 转发模式,logical Core 1 将对Port 0接收到的数据包转发到Port 1上发送出去;

pktgen-dpdk

DPDK-Pktgen其实就是DPDK的一个应用,它类似于linux原生的pktgen,通过自己构造数据包,然后发送。而DPDK-Pktgen做的更强大,他可以通过用lua脚本或者json编辑自己的测试过程,同时输出自己关心的数据,比如发送,接收的数据包数量,流量带宽等等。

安装

1
2
3
4
5
6
7
8
$ git clone git://dpdk.org/apps/pktgen-dpdk
$ cd pktgen-dpdk
$ git checkout pktgen-21.03.1
$ meson build
$ cd build
$ ninja
$ ls -l app/pktgen //编译出来的可执行程序
-rwxr-xr-x 1 root root 477672 10月 19 12:59 app/pktgen
基本使用方法
1
Usage: ./app/pktgen [EAL options] -- [-h] [-v] [-P] [-G] [-T] [-f cmd_file] [-l log_file] [-s P:PCAP_file] [-m <string>]

pktgen 支持的命令行参数还是挺多的,具体可以通过 pktgen –help 来详细查看。不过它像大多数基于 dpdk 的测试程序一样,命令行参数主要有两部分组成:

其中,最重要的一个参数就是 -l 参数,用它来指定使用的核列表,比如:-l 1,2 或者 -l 1-2,表示使用核 1 和核 2。值得注意的是,pktgen 至少要指定两个核,因为 pktgen 需要一个核与用户进行交互,比如响应测试过程中用户的输入。

pktgen 自有参数部分最重要的是 -m 参数,用它来指定网口与核之间的对应关系,比如:-m 2.0,表示让核 2 来处理网口 0。值得注意的是,若要指定多个对应关系(使用多个网卡和多个核),则需多次使用 -m 参数。如果要收包,最好也指定一下 -P 参数,表示让所有网口进入混杂模式,以便接收到所有数据包。

1
./build/app/pktgen -l 1-3 -- -P -m 2.0 -m 3.1
1
2
3
4
5
6
7
8
9
10
Pktgen:/> set 0 size 64 // 将网口 0 所发包的帧大小设置 64 字节
Pktgen:/> set 0 src ip 192.168.0.1/32 // 将网口 0 所发包的源 IP 设置为 192.168.0.1
Pktgen:/> set 0 dst ip 192.168.0.2 // 将网口 0 所发包的目的 IP 设置为 192.168.0.2
Pktgen:/> set 0 count 100000000 // 将网口 0 的发包数设置为 100000000
Pktgen:/> set 0 rate 20 // 将网口 0 的发包速率设置为最大速率的 20%
Pktgen:/> start 0 // 启动网口 0 的发包过程
Pktgen:/> stop 0 // 停止网口 0 的发包过程
Pktgen:/> stp // 停止所有网口的发包过程
Pktgen:/> clr // 清除屏幕上的收发包统计信息
Pktgen:/> quit // 退出 pktgen 程序

常见错误

ERROR: Dependency “libdpdk” not found
1
2
3
4
5
Found pkg-config: /usr/bin/pkg-config (1.4.2)
Found CMake: /usr/bin/cmake (3.18.2)
Run-time dependency libdpdk found: NO (tried pkgconfig and cmake)

meson.build:62:0: ERROR: Dependency "libdpdk" not found, tried pkgconfig and cmake

显示没有找到dpdk相关的库,原因在于dpdk编译时生成的库并没有放入/usr/lib与/lib中。dpdk相关的库数量非常多,如果直接拖动到这两个文件夹中,不方便管理。因此可以采用ld.so的方式进行类似”快捷方式”的连接,dpdk的库不需要移动位置就可以被其他的程序调用。

解决方法:重新安装dpdk

error: pcap library not found!
1
app/meson.build:36:0: ERROR: C library 'pcap' not found

解决方法

1
2
$ sudo apt-get install libsqlite3-0 libpcap0.8
$ sudo apt-get install libpcap-dev
Pogram sphinx-build found: NO
1
2
Pogram sphinx-build found: NO
Build targets in project: 8

解决方法

1
sudo apt-get install sphinx-doc sphinx-common
librte_kvargs.so.21: cannot open shared object file: No such file or directory
1
./app/pktgen: error while loading shared libraries: librte_kvargs.so.21: cannot open shared object file: No such file or directory

解决方法

1
2
3
4
$ find ./ -name librte_kvargs.so.21
./dpdk-stable-20.11.9/build/lib/librte_kvargs.so.21
$ sudo ln -s ./dpdk-stable-20.11.9/build/lib/librte_kvargs.so.21 /usr/local/lib/librte_kvargs.so.21
$ ldconfig -v

DPDK日志系统

根据日志的优先级高低, DPDK将日志分为 8 个级别(宏定义如下)。 数字越小级别越高, 其中RTE_LOG_DEBUG的值为 8, 这是日志的最低级别, 意味着输出的日志信息最多,因为高于这个级别的日志的信息都会被输出;相应地, RTE_LOG_EMERG 为日志的最高级别,只输出严重错误的信息 。

1
2
3
4
5
6
7
8
9
/* Can't use 0, as it gives compiler warnings */
#define RTE_LOG_EMERG 1U /**< System is unusable. */
#define RTE_LOG_ALERT 2U /**< Action must be taken immediately. */
#define RTE_LOG_CRIT 3U /**< Critical conditions. */
#define RTE_LOG_ERR 4U /**< Error conditions. */
#define RTE_LOG_WARNING 5U /**< Warning conditions. */
#define RTE_LOG_NOTICE 6U /**< Normal but significant condition. */
#define RTE_LOG_INFO 7U /**< Informational. */
#define RTE_LOG_DEBUG 8U /**< Debug-level messages. */
1
$ ./build/app/dpdktestpmd --log-level="pmd,net.mqnic.nint":8 --log-level=8

命令中,带有命令选项--log-level="pmd.net.mqnic.init":8 的同时,还加上--log-level=8
全局级别设置成了RTE_LOG_CRIT (数字8)

参考

DPDK系列之二:pktgen-dpdk向testpmd发送数据的测试_cloudvtech的博客-CSDN博客

DPDK

DPDK Tools User Guides — Data Plane Development Kit 17.11.10 documentation

DPDK 配置和优化指南 (amperecomputing.com)

TestPMD

云服务器 使用 DPDK 测试-最佳实践-文档中心-腾讯云 (tencent.com) 包含使用TestPMD测试带宽及吞吐率。

Testpmd Application User Guide — Data Plane Development Kit 17.11.10 documentation (dpdk.org) TestPMD官方手册

pktgen-dpdk

dpdk-pktgen 的安装和基本使用-CSDN博客

9. EAL parameters — Data Plane Development Kit 23.07.0 documentation (dpdk.org)


DPDK及其上层应用的安装使用
http://example.com/2023/09/22/DPDK及其上层应用的安装使用/
作者
Eddy
发布于
2023年9月22日
许可协议