1. 环境搭建与DPDK编译

任务目标

在Linux系统上完成DPDK环境搭建:安装编译依赖、下载并编译DPDK源码、配置大页内存与加载内核模块,最终通过运行示例程序验证环境可用。

环境与依赖

  • 操作系统:Ubuntu 22.04 LTS(内核≥5.15)或CentOS Stream 9
  • CPU:x86_64架构,支持SSE4.2及以上指令集
  • 内存:≥8GB(推荐16GB),需预留1GB以上用于大页内存
  • 磁盘:≥10GB可用空间
  • 网卡(可选):Intel 82599/XL710等DPDK支持型号,用于后续实验;本案例验证不强制要求

安装依赖

DPDK编译需要以下核心工具链与库。Ubuntu系统执行:

sudo apt update
sudo apt install -y build-essential meson ninja-build python3-pip \
    pkg-config libnuma-dev libpcap-dev linux-tools-common \
    linux-tools-$(uname -r) python3-pyelftools

CentOS/RHEL系统执行:

sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y meson ninja-build python3-pip numactl-devel \
    libpcap-devel kernel-devel elfutils-libelf-devel \
    python3-pyelftools

下载与编译DPDK

本案例使用DPDK 23.11 LTS版本(截至2024年12月仍为维护版本)。下载源码并编译:

cd ~
wget https://fast.dpdk.org/rel/dpdk-23.11.tar.xz
tar xf dpdk-23.11.tar.xz
cd dpdk-23.11

# 配置编译(默认构建所有库和示例程序)
meson setup build
ninja -C build

# 安装到系统目录(可选,便于后续开发)
sudo ninja -C build install
sudo ldconfig

编译完成后,示例程序位于build/examples/目录下。若需验证编译产物,可执行:

ls build/examples/helloworld/helloworld

配置大页内存

DPDK运行时需要大页内存支持。以下配置分配1024个2MB大页(共2GB),并挂载hugetlbfs:

# 临时配置(重启后失效)
echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

# 永久配置(写入sysctl.conf)
echo 'vm.nr_hugepages=1024' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 挂载hugetlbfs(若未自动挂载)
sudo mkdir -p /mnt/huge
sudo mount -t hugetlbfs pagesize=2MB /mnt/huge
echo 'nodev /mnt/huge hugetlbfs pagesize=2MB 0 0' | sudo tee -a /etc/fstab

验证大页是否配置成功:

grep HugePages_Total /proc/meminfo
# 预期输出:HugePages_Total:    1024

加载内核模块

DPDK用户态驱动需要以下内核模块支持(仅当使用VFIO或IGB_UIO驱动时):

# 加载VFIO模块(推荐,支持IOMMU)
sudo modprobe vfio-pci

# 若系统不支持IOMMU,改用IGB_UIO模块
sudo modprobe igb_uio

若igb_uio模块不存在(DPDK 20.11+默认不编译),需手动编译:

cd ~/dpdk-23.11/kernel/linux/igb_uio
make
sudo insmod igb_uio.ko

验证模块加载:

lsmod | grep -E "vfio_pci|igb_uio"

运行验证程序

使用DPDK自带的helloworld示例验证环境可用性。该程序会初始化EAL并打印每个lcore的编号:

cd ~/dpdk-23.11/build/examples/helloworld

# 以root权限运行,指定2个lcore
sudo ./helloworld -l 0-1

预期输出(与代码逻辑严格一致):

EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Static memory layout is selected, amount of reserved memory: 536870912 bytes
EAL: VFIO support initialized
hello from core 1
hello from core 0

若输出包含hello from core X(X为0和1),且无EAL初始化错误,则说明DPDK编译正确、大页内存配置有效、内核模块加载成功,环境已可用。

常见问题排查

  • EAL: Cannot open /dev/vfio/vfio:VFIO未正确初始化,执行sudo modprobe vfio-pci并确认/dev/vfio/vfio存在。
  • EAL: No available hugepages reported:大页内存未配置或权限不足,检查/proc/meminfo中HugePages_Total值,并确认以root运行。
  • 编译时提示缺少numa.h:未安装libnuma-dev,执行sudo apt install libnuma-dev后重新运行meson setup build。
  • 运行示例时提示"EAL: unsupported platform":CPU不支持DPDK所需指令集,需使用x86_64且支持SSE4.2的处理器。

验证通过标准

  1. helloworld程序成功输出两个core的hello信息,无EAL错误日志。
  2. /proc/meminfo中HugePages_Total≥1024。
  3. lsmod能看到vfio_pci或igb_uio模块。
  4. 重新运行sudo ./helloworld -l 0-1可重复获得相同结果。