Banner
2025-11-15

安装&配置DPDK

来聊聊DPDK技术以及如何搭建一个DPDK开发环境

前期准备

操作系统内核版本为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

下载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驱动。

加载网卡设备到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

运行你的第一个DPDK程序

这里我们以官方示例程序 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

参考

广告
tencent cloud
广告
tencent cloud
广告
tencent cloud
GithubFacebookBilibiliSteam

动核互联

DYNAMIC CORE
朋友们