1.DPDK 简介
DPDK(Data Plane Development Kit)是数据平面开发工具包,由用于加速在各种CPU架构上运行的数据包处理的库组成。
DPDK需要一定的网卡硬件支持,以Intel为例,支持以下网卡:
e1000 (82540, 82545, 82546)
e1000e (82571, 82572, 82573, 82574, 82583, ICH8, ICH9, ICH10, PCH, PCH2, I217, I218, I219)
igb (82575, 82576, 82580, I210, I211, I350, I354, DH89xx)
ixgbe (82598, 82599, X520, X540, X550)
i40e (X710, XL710, X722, XXV710)
ice (E810)
fm10k (FM10420)
ipn3ke (PAC N3000)
ifc (IFC)
完整的网卡支持列表可在官网查询:
http://core.dpdk.org/supported/
在Linux上部署DPDK有两种方式,一种是通过命令行依次进行配置,编译,驱动加载等;另一种是通过DPDK的脚本进行快捷配置和编译。
通过命令行的方式部署,可配置项更多,可以获得更佳的性能,对DPDK的工作环境也能有更好的熟悉;通过脚本方式部署步骤较少,较简单。
通过命令行部署的教程请移步:
在Linux(CentOS)上部署DPDK------命令行方式
2.DPDK 环境
该章节的内容参照自官网的DPDK System Requirements。
2.1 编译所需的工具和库
- GNU:
make
。 - coreutils:
cmp
,sed
,grep
,arch
, etc. - gcc: versions 4.9 或更新版本。
- libc headers, 即
glibc-devel.x86_64
(以64位数Intel平台为例)。 - Linux kernel headers or sources required to build kernel modules. (
kernel - devel.x86_64
;kernel - devel.ppc64
) - 若需要在64位操作系统上编译32位软件,还需要以下工具:
-
glibc.i686
,libgcc.i686
,libstdc++.i686
andglibc-devel.i686
for Intel i686/x86_64; -
glibc.ppc64
,libgcc.ppc64
,libstdc++.ppc64
andglibc-devel.ppc64
for IBM ppc_64;
-
这里需要注意的是kernel-devel
的版本要匹配内核的版本,可以通过uname -r
查看内核版本号,并通过yum info kernel-devel
查看已安装或支持的kernel-devel
版本号。这里查看到我的centos已经预装了kernel-devel
,版本与kernel版本一致:
uname -r
3.10.0-862.el7.x86_64
yum info kernel-devel
已安装的软件包
名称 :kernel-devel
架构 :x86_64
版本 :3.10.0
发布 :862.el7
大小 :37 M
源 :installed
kernel头文件的路径位于/usr/lib/modules/$kernel-version/kernel
2.2 运行环境
- Kernel version >= 3.16
- glibc >= 2.7 (for features related to cpuset)
- Kernel configuration,centos提供的配置可运行大多数DPDK应用。
3.DPDK 脚本部署
该章节的内容参照自官网的脚本快速部署
3.1 下载DPDK代码
可从官网下载最新的稳定版或开发版的DPDK代码DPDK代码下载。
然后解压缩:
tar xJf dpdk-.tar.xz
cd dpdk-
其中DPDK的代码包含如下部分:
- lib: Source code of DPDK libraries
- drivers: Source code of DPDK poll-mode drivers
- app: Source code of DPDK applications (automatic tests)
- examples: Source code of DPDK application examples
- config, buildtools, mk: Framework-related makefiles, scripts and configuration
其中在usertools路径下可以找到dpdk-setup.sh
脚本,这个脚本可以运行下面这些功能:
- 编译DPDK库
- 加载或移除DPDK IGB_UIO kernel module
- 加载或移除VFIO kernel module
- 加载或移除DPDK KNI kernel module
- 对NUMA会非NUMA系统均支持创建或删除hugepages
- 查看当前网口状态,以及预留端口给DPDK使用
- 对于非root用户,设置VFIO驱动的权限
- 运行test和testpmd应用
- 在meminfo中查看hugepages信息
- 在/mnt/huge中列出hugepages信息
- 移除编译的DPDK库
3.2 配置脚本的组成
dpdk-setup.sh
脚本在逻辑上组成一系列步骤。每个步骤都提供了许多选项,可指导用户完成所需任务。以下是每个步骤的简要概述。
第1步:构建DPDK库
最初,用户必须选择DPDK target,以便正确配置target类型和编译选项,随后DPDK会根据选择的target和编译环境进行编译。
第一步可选的target和编译选项类型如下:
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1] arm64-armv8a-linuxapp-clang
[2] arm64-armv8a-linuxapp-gcc
[3] arm64-dpaa2-linuxapp-gcc
[4] arm64-dpaa-linuxapp-gcc
[5] arm64-stingray-linuxapp-gcc
[6] arm64-thunderx-linuxapp-gcc
[7] arm64-xgene1-linuxapp-gcc
[8] arm-armv7a-linuxapp-gcc
[9] i686-native-linuxapp-gcc
[10] i686-native-linuxapp-icc
[11] ppc_64-power8-linuxapp-gcc
[12] x86_64-native-bsdapp-clang
[13] x86_64-native-bsdapp-gcc
[14] x86_64-native-linuxapp-clang
[15] x86_64-native-linuxapp-gcc
[16] x86_64-native-linuxapp-icc
[17] x86_x32-native-linuxapp-gcc
第2步:设置环境
这个步骤需要配置Linux的环境以支持DPDK应用程序的运行。需要配置的环境有两项,分别是:
- Hugepages配置
- DPDK kernel module配置(网卡驱动配置)
可以为NUMA或非NUMA系统设置Hugepages,但是仅支持默认的2MB大小的hugepage size。若想设置更大的单页,需要自己配置,可以参考:用命令行方式部署DPDK。
还可以在此步骤中插入所需的DPDK内核模块,并且可以将网络端口绑定到此模块以供DPDK应用程序使用。
----------------------------------------------------------
Step 2: Setup linuxapp environment
----------------------------------------------------------
[18] Insert IGB UIO module
[19] Insert VFIO module
[20] Insert KNI module
[21] Setup hugepage mappings for non-NUMA systems
[22] Setup hugepage mappings for NUMA systems
[23] Display current Ethernet/Crypto device settings
[24] Bind Ethernet/Crypto device to IGB UIO module
[25] Bind Ethernet/Crypto device to VFIO module
[26] Setup VFIO permissions
第3步:运行应用程序
上述步骤完成后,用户就可以运行测试应用程序。测试应用程序允许用户为DPDK运行一系列功能测试。支持接收和发送数据包的testpmd应用也可以运行。
----------------------------------------------------------
Step 3: Run test application for linuxapp environment
----------------------------------------------------------
[27] Run test application ($RTE_TARGET/app/test)
[28] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
第4步:检查系统
此步骤提供了一些用于检查hugepage映射状态的工具。
----------------------------------------------------------
Step 4: Other tools
----------------------------------------------------------
[29] List hugepage info from /proc/meminfo
第5步:系统清理
最后一步有将系统恢复到原始状态的一些选项。
----------------------------------------------------------
Step 5: Uninstall and system cleanup
----------------------------------------------------------
[30] Unbind devices from IGB UIO or VFIO driver
[31] Remove IGB UIO module
[32] Remove VFIO module
[33] Remove KNI module
[34] Remove hugepage mappings
3.3 配置脚本运行示例
dpdk-setup.sh
需要用root权限来运行。
source usertools/dpdk-setup.sh
第一步选择编译的target和编译选项,在x86架构的cpu上运行64位的centos,并使用gcc编译,可以选择[15] x86_64-native-linuxapp-gcc
。
Option: 15
Configuration done using x86_64-native-linuxapp-gcc
== Build lib
== Build lib/librte_compat
== Build lib/librte_kvargs
......
== Build app/test-eventdev
Build complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefined
------------------------------------------------------------------------------
RTE_TARGET exported as x86_64-native-linuxapp-gcc
------------------------------------------------------------------------------
Press enter to continue ...
第二步配置hugepages,在NUMA系统中,选择[22] Setup hugepage mappings for NUMA systems
。然后输入hugepages的页数,例如每个NUMA node需要128MB的hugepages,且系统默认的每页huge page的大小是2M,则输入页数为64。
随后需要加载DPDK的kernel module(网卡驱动),可以选择IGB UIO
或者VFIO
,分别对应[18] Insert IGB UIO module
和[19] Insert VFIO module
,也可以都加载,在绑定时选择特定的kernel module。
Option: 18
Unloading any existing DPDK UIO module
Loading DPDK UIO module
可以通过[24] Bind Ethernet/Crypto device to IGB UIO module
将网卡绑定IGB UIO的驱动:
Option: 24
Network devices using kernel driver
===================================
0000:03:00.0 'I210 Gigabit Network Connection 1533' if=enp3s0 drv=igb unused=igb_uio *Active*
0000:04:00.0 'I210 Gigabit Network Connection 1533' if=enp4s0 drv=igb unused=igb_uio *Active*
0000:05:00.0 'I210 Gigabit Network Connection 1533' if=enp5s0 drv=igb unused=igb_uio
0000:06:00.0 'I210 Gigabit Network Connection 1533' if=enp6s0 drv=igb unused=igb_uio
No 'Crypto' devices detected
============================
No 'Eventdev' devices detected
==============================
No 'Mempool' devices detected
=============================
No 'Compress' devices detected
==============================
Enter PCI address of device to bind to IGB UIO driver: 05:00.0
OK
随后可以用配置脚本中的[28] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
运行测试程序。在此之前需要先声明RTE_TARGET路径,退出脚本后运行:
export RTE_TARGET=/home/dpdk-stable-18.11.2/x86_64-native-linuxapp-gcc/
随后重新打开脚本,可以运行测试程序:
Option: 28
Enter hex bitmask of cores to execute testpmd app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0x03
Launching app
......
至此,DPDK的部署就算完成了,接下来可以尝试编译和运行
基于DPDK的简单应用了。
基于DPDK的简单应用编译与运行方法可以查看:
编译和运行DPDK示例程序