来聊聊DPDK技术以及如何搭建一个DPDK开发环境
这里我使用的操作系统为 Ubuntu 22.04
操作系统内核版本为5.4及以上,可以使用下面的命令检查
uname -r
glibc版本为2.7及以上,可以使用下面的命令检查
ldd --version
Python版本为3.6及以上,可以使用下面的命令检查
python3 --version
安装编译工具链
sudo apt install build-essential pkg-config
安装meson & ninja
sudo pip3 install meson ninja
安装pyelftools
sudo apt install python3-pyelftools
安装libnuma-dev
sudo apt install libnuma-dev
下载DPDK包
下载完成后解压该包并进入
# 'x'请替换为自己的实际版本号
tar xJf dpdk-x.x.x.tar.xz
cd dpdk-x.x.x
包中文件说明(来自官方文档)
- The DPDK is composed of several directories, including:
- doc: DPDK Documentation
- license: DPDK license information
- 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: Framework-related scripts and configuration
- usertools: Utility scripts for end-users of DPDK applications
- devtools: Scripts for use by DPDK developers
- kernel: Kernel modules needed for some operating systems
配置构建
meson setup build
构建并安装DPDK
cd build
ninja
sudo meson install
sudo ldconfig
验证安装,使用下面的命令查看当前网卡的状态
dpdk-devbind.py --status-dev net
如果一切正常,他应该会输出当前网卡的状态信息,就像下面这样。
Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (7) I219-V 15bc' if=eno1 drv=e1000e unused=vfio-pci
0000:01:00.0 'Ethernet Controller E810-C for QSFP 1592' if=enp1s0f0np0 drv=ice unused=vfio-pci
0000:01:00.1 'Ethernet Controller E810-C for QSFP 1592' if=enp1s0f1np1 drv=ice unused=vfio-pci
同时也可以看到,目前我们的网卡设备依然在使用内核驱动,下一步我们需要将他移动到DPDK驱动。
加载vfio驱动
sudo modprobe vfio-pci iommu=on
注意,vifo需要IOMMU保护,但如果你的系统中没有该模块,那就需要加载一个额外的模块
# 加载vfio模块
sudo modprobe vfio-pci
# 配置no-IOMMU模式
modprobe vfio enable_unsafe_noiommu_mode=1
查看当前设备状态
dpdk-devbind.py --status-dev net
可以看到,当前我的设备有三块网卡,并且都没有配置在DPDK驱动下
Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (7) I219-V 15bc' if=eno1 drv=e1000e unused=vfio-pci
0000:01:00.0 'Ethernet Controller E810-C for QSFP 1592' if=enp1s0f0np0 drv=ice unused=vfio-pci
0000:01:00.1 'Ethernet Controller E810-C for QSFP 1592' if=enp1s0f1np1 drv=ice unused=vfio-pci
将该设备绑定到DPDK驱动
sudo dpdk-devbind.py --bind=vfio-pci 0000:01:00.0
再次查看设备状态
dpdk-devbind.py --status-dev net
# 网卡已经被绑定到DPDK驱动
Network devices using DPDK-compatible driver
============================================
0000:01:00.0 'Ethernet Controller E810-C for QSFP 1592' drv=vfio-pci unused=ice
Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (7) I219-V 15bc' if=eno1 drv=e1000e unused=vfio-pci
0000:01:00.1 'Ethernet Controller E810-C for QSFP 1592' if=enp1s0f1np1 drv=ice unused=vfio-pci
可以使用下面的命令查看当前内存的分配状态
cat /proc/meminfo | grep Huge
AnonHugePages: 0 kB
ShmemHugePages: 137216 kB
FileHugePages: 0 kB
HugePages_Total: 0 # 大页内存总数,因为还未分配,所以目前是0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
编辑 /etc/default/grub 文件,在 GRUB_CMDLINE_LINUX_DEFAULT 行添加大页内存参数
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash hugepagesz=1G hugepapges=4"
重新加载配置
update-grub
再次使用下面的命令查看当前内存的分配状态
cat /proc/meminfo | grep Huge
这里我们以官方示例程序 helloworld 为例
对于构建方式,这里我选用官方推荐的meson
进入 helloworld 示例程序的目录中
cd example/helloworld
编写meson.build文件,如果该文件已经存在就替换他
project('helloworld', 'c')
dpdk = dependency('libdpdk')
sources = files('main.c')
executable('helloworld', sources, dependencies: dpdk)
启动构建
meson setup build
# 下面是该命令的简化版本
meson build
编译dpdk程序
ninja -C build
运行该dpdk程序
./build/helloworld