2. DPDK 环境搭建:系统要求、内核配置、大页内存配置、DPDK 源码编译与安装、环境变量设置
DPDK 的运行依赖于精心配置的操作系统环境。本章将详细讲解从硬件与操作系统要求、内核编译选项、大页内存配置,到 DPDK 源码编译安装及环境变量设置的完整流程。正确的环境搭建是后续驱动适配与调试的基础,任何一步的疏漏都可能导致轮询模式驱动(PMD)初始化失败或性能严重下降。
2.1 系统要求与依赖安装
DPDK 对硬件和操作系统有明确的最低要求。在开始编译前,请确保系统满足以下条件:
| 类别 | 要求 | 说明 |
|---|---|---|
| CPU | x86-64 (Intel/AMD), ARMv8, Power8+ | 必须支持 SSE4.2 / NEON / AltiVec 指令集;建议关闭 BIOS 中的 C-State 和 P-State 以降低延迟抖动。 |
| 内存 | ≥ 4 GB | 推荐 8 GB 以上;大页内存需要预留连续物理内存。 |
| 网卡 | Intel i350/XL710/XXV710, Mellanox ConnectX-4/5/6, Broadcom NetXtreme-E 系列等 | 必须被 DPDK 原生 PMD 或内核驱动绑定支持。 |
| 操作系统 | Linux Kernel ≥ 4.18 | 推荐 5.10+;需要支持 UIO、VFIO、KNI 等内核模块。 |
| 工具链 | GCC ≥ 9.0, Meson ≥ 0.61, Ninja, pkg-config | DPDK 23.11 使用 Meson 构建系统。 |
安装基础依赖(以 Ubuntu 为例):
sudo apt update
sudo apt install -y build-essential meson ninja-build pkg-config \
libnuma-dev libelf-dev libpcap-dev python3-pyelftools \
linux-headers-$(uname -r)
- libnuma-dev:提供 NUMA 内存分配接口,DPDK 必须依赖。
- libelf-dev:用于加载 eBPF 程序及解析 ELF 符号。
- python3-pyelftools:构建过程中用于解析内核头文件。
- linux-headers:编译内核模块(如 igb_uio、kni)时需要。
2.2 内核配置与模块加载
DPDK 需要内核提供用户态 I/O 支持。主要有两种驱动框架:UIO (Userspace I/O) 和 VFIO (Virtual Function I/O)。VFIO 支持 IOMMU 和设备隔离,安全性更高,是生产环境的推荐选择。
2.2.1 内核编译选项检查
确保内核已启用以下选项(通常发行版内核已默认开启):
# 检查 UIO 支持
grep CONFIG_UIO /boot/config-$(uname -r)
# 检查 VFIO 支持
grep CONFIG_VFIO /boot/config-$(uname -r)
grep CONFIG_VFIO_PCI /boot/config-$(uname -r)
grep CONFIG_VFIO_IOMMU_TYPE1 /boot/config-$(uname -r)
如果输出为 y 或 m,则表示支持。若为 is not set,则需要重新编译内核或加载对应模块。
2.2.2 加载内核模块
加载 VFIO 相关模块(推荐):
sudo modprobe vfio-pci
sudo modprobe vfio_iommu_type1
# 确认加载
lsmod | grep vfio
如果使用 UIO 框架,需要加载 uio_pci_generic 或编译 DPDK 提供的 igb_uio 模块:
sudo modprobe uio_pci_generic
# 或编译 igb_uio
cd /path/to/dpdk/kernel/linux/igb_uio
make
sudo modprobe uio
sudo insmod igb_uio.ko
dmesg | grep -i iommu。
2.3 大页内存配置
DPDK 通过大页(Hugepages)减少 TLB 缺失,提升内存访问性能。通常配置 2MB 或 1GB 大页。
2.3.1 配置 2MB 大页
临时配置(重启后失效):
# 分配 1024 个 2MB 大页,共 2GB
echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
永久配置(通过 grub):
# 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 中添加
GRUB_CMDLINE_LINUX="default_hugepagesz=2M hugepagesz=2M hugepages=1024"
# 更新 grub
sudo update-grub
# 重启
sudo reboot
2.3.2 配置 1GB 大页(推荐用于高性能场景)
1GB 大页需要 CPU 支持(如 Intel Skylake+),且必须在启动时预留:
# 在 GRUB_CMDLINE_LINUX 中添加
GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=4"
# 更新并重启
sudo update-grub
sudo reboot
2.3.3 挂载大页文件系统
DPDK 通过 hugetlbfs 访问大页内存:
# 创建挂载点
sudo mkdir -p /mnt/huge
# 挂载 2MB 大页
sudo mount -t hugetlbfs pagesize=2MB /mnt/huge
# 或挂载 1GB 大页
sudo mount -t hugetlbfs pagesize=1GB /mnt/huge
将挂载写入 /etc/fstab 以持久化:
echo "nodev /mnt/huge hugetlbfs pagesize=2MB 0 0" | sudo tee -a /etc/fstab
# 查看大页分配情况
cat /proc/meminfo | grep Huge
# 输出示例:
# HugePages_Total: 1024
# HugePages_Free: 1024
# Hugepagesize: 2048 kB
2.4 DPDK 源码编译与安装
DPDK 从 20.11 版本开始全面采用 Meson 构建系统。以下以 DPDK 23.11 LTS 为例。
2.4.1 获取源码
# 从官网下载
wget https://fast.dpdk.org/rel/dpdk-23.11.tar.xz
tar xf dpdk-23.11.tar.xz
cd dpdk-23.11
2.4.2 配置与编译
# 创建构建目录
meson setup build
# 进入构建目录
cd build
# 编译
ninja
# 安装到系统(默认 /usr/local)
sudo ninja install
# 更新动态链接库缓存
sudo ldconfig
常用配置选项(在 meson setup 时指定):
| 选项 | 说明 | 示例 |
|---|---|---|
-Dexamples=all |
编译所有示例程序 | meson setup -Dexamples=all build |
-Dplatform=generic |
通用平台优化(默认) | meson setup -Dplatform=generic build |
-Dplatform=native |
针对当前 CPU 优化(性能最佳) | meson setup -Dplatform=native build |
-Denable_kmods=true |
编译内核模块(igb_uio, kni) | meson setup -Denable_kmods=true build |
-Dtests=true |
编译单元测试 | meson setup -Dtests=true build |
pkg-config --modversion libdpdk 应输出 23.11.0。运行 ldconfig -p | grep dpdk 可查看已安装的动态库。
2.5 环境变量设置
DPDK 应用程序运行时需要知道大页挂载点、使用的网卡 PCI 地址等信息。这些通过环境变量或命令行参数传递。
2.5.1 核心环境变量
| 变量名 | 说明 | 示例值 |
|---|---|---|
RTE_SDK |
DPDK 源码根目录 | /home/user/dpdk-23.11 |
RTE_TARGET |
目标架构-编译配置(旧版使用,新版可省略) | x86_64-native-linuxapp-gcc |
PKG_CONFIG_PATH |
pkg-config 搜索路径,指向 DPDK 的 .pc 文件 | /usr/local/lib/x86_64-linux-gnu/pkgconfig |
LD_LIBRARY_PATH |
动态库搜索路径(如果安装到非标准路径) | /usr/local/lib/x86_64-linux-gnu |
2.5.2 配置示例(写入 ~/.bashrc)
# DPDK 环境变量
export RTE_SDK=/home/user/dpdk-23.11
export PKG_CONFIG_PATH=/usr/local/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/usr/local/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
# 大页挂载点(DPDK 默认查找 /mnt/huge)
export DPDK_HUGEPAGE_MOUNT=/mnt/huge
# 默认 EAL 参数(可选)
export DPDK_EAL_ARGS="-l 0-3 -n 4 --huge-dir /mnt/huge"
应用环境变量:
source ~/.bashrc
2.6 环境搭建验证:运行测试程序
编译并运行 DPDK 自带的 helloworld 示例,验证环境是否搭建成功。
# 编译 helloworld
cd $RTE_SDK/examples/helloworld
make
# 运行(需要 root 权限)
sudo ./build/helloworld
预期输出:
hello from core 1
hello from core 2
hello from core 3
hello from core 0
- EAL: Cannot open /dev/vfio/vfio:VFIO 模块未加载或权限不足。执行
sudo modprobe vfio-pci并确保以 root 运行。 - EAL: No free hugepages reported:大页未正确分配。检查
/proc/meminfo中的 HugePages_Total 是否为 0。 - EAL: PCI device 0000:02:00.0 is not supported:网卡未被 DPDK 驱动绑定。后续章节将讲解绑定流程。
2.7 环境搭建整体流程 SVG
下图总结了从系统准备到运行测试的完整环境搭建流程: