3. DPDK环境搭建:在Ubuntu/CentOS上编译安装DPDK,配置大页内存

好,咱们进入实战环节。DPDK的环境搭建,说白了就是两件事:把代码编译成可执行文件,再把系统调教得适合它跑。我见过不少新手在这步卡住,其实没那么玄乎。

3.1 环境准备:先看看你的硬件

动手之前,先确认几件事。我个人习惯用 lscpulspci 扫一眼硬件。

  • CPU:必须支持 x86_64 或 ARM64。Intel 的 Ivy Bridge 及以上都行。
  • 网卡:Intel 82599(ixgbe)、X710(i40e)这些是常客。用 lspci | grep Ethernet 看看。
  • 内核:Linux 3.10 以上。我建议用 4.15+,省心。
我的经验:有一次在 CentOS 7 上折腾,内核版本 3.10,编译 DPDK 20.11 时死活报错。后来发现是内核太老,缺了某些头文件。升级到 4.18 就顺了。

3.2 安装依赖:别漏了这些包

不同发行版,依赖包名字不一样。我列个表,你对着装就行。

发行版 命令
Ubuntu 20.04+ sudo apt install build-essential linux-headers-$(uname -r) libnuma-dev python3-pip
CentOS 7/8 sudo yum install gcc make kernel-devel numactl-devel python3-pip

嗯,这里要注意:linux-headerskernel-devel 必须装,否则编译内核模块时会报错。我曾经因为漏了这个,卡了半小时。

3.3 下载与编译:动手吧

DPDK 官网 下载稳定版。我习惯用 21.11 LTS,长期支持,坑少。

# 下载
wget https://fast.dpdk.org/rel/dpdk-21.11.tar.xz
tar xf dpdk-21.11.tar.xz
cd dpdk-21.11

# 配置编译
meson build
cd build
ninja
sudo ninja install

这里解释一下:meson 是 DPDK 从 19.11 开始用的构建系统,比原来的 make 快多了。编译完成后,库文件会装到 /usr/local/lib 下。

注意:如果你用的是 CentOS 7,默认的 meson 版本可能太旧。建议用 pip 装个新的:pip3 install meson ninja

3.4 配置大页内存:这是关键

DPDK 绕过了内核协议栈,直接操作网卡。但内存访问必须用大页,否则性能上不去。说白了,大页就是让 CPU 少查页表,减少 TLB miss。

我一般配 2MB 的大页,数量根据内存大小来。比如 16GB 内存,分 8GB 给 DPDK,那就是 4096 个 2MB 页。

# 临时配置(重启失效)
echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

# 永久配置(推荐)
echo 'vm.nr_hugepages=4096' >> /etc/sysctl.conf
sysctl -p

然后挂载大页文件系统:

mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
echo 'nodev /mnt/huge hugetlbfs defaults 0 0' >> /etc/fstab
避坑指南:我曾经在 NUMA 架构的机器上只配了单节点的大页,结果 DPDK 程序跑在另一个节点上,性能惨不忍睹。后来用 grep -i huge /proc/meminfo 检查,才发现分配不均匀。建议用 numactl --hardware 先看拓扑,再按节点分配。

3.5 验证环境:跑个测试看看

编译完、配好大页,总得验证一下。DPDK 自带了一个 helloworld 示例,在 examples/helloworld 目录下。

cd examples/helloworld
make
./build/helloworld

如果看到类似 hello from core 1 的输出,说明环境没问题。嗯,这里要注意:如果报错说找不到 rte_config.h,多半是环境变量没设好。加一句:

export RTE_SDK=/path/to/dpdk-21.11
export RTE_TARGET=x86_64-native-linux-gcc

3.6 知识体系:一张图看懂

下面这张 SVG 图,把 DPDK 环境搭建的核心逻辑串起来了。你一看就明白。

DPDK 环境搭建核心流程 硬件检查 CPU/网卡/内核 安装依赖 build-essential/numa 编译安装 meson/ninja 大页配置 2MB/1GB 大页 挂载 hugetlbfs /mnt/huge 验证运行 helloworld 示例 关键点:大页配置是性能瓶颈,NUMA 分配要均匀 1 2 3 4 5 6

3.7 常见问题:我踩过的坑

  • 编译报错找不到 numa.hsudo apt install libnuma-devyum install numactl-devel
  • 大页分配失败:检查 /proc/meminfo 里的 HugePages_Total,如果为 0,说明没生效。重启试试。
  • 运行示例时权限不足:DPDK 需要 root 权限,或者把用户加入 dpdk 组。我一般直接 sudo 跑。
核心总结:DPDK 环境搭建,硬件检查是前提,大页配置是灵魂。编译过程用 meson 很省事,但别忘了装依赖。验证环节跑个 helloworld,能跑通就说明环境没问题。

公众号:蓝海资料掘金营,微信deep3321