3. DPDK环境搭建:在Ubuntu/CentOS上编译安装DPDK,配置大页内存
好,咱们进入实战环节。DPDK的环境搭建,说白了就是两件事:把代码编译成可执行文件,再把系统调教得适合它跑。我见过不少新手在这步卡住,其实没那么玄乎。
3.1 环境准备:先看看你的硬件
动手之前,先确认几件事。我个人习惯用 lscpu 和 lspci 扫一眼硬件。
- 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-headers 或 kernel-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 环境搭建的核心逻辑串起来了。你一看就明白。
3.7 常见问题:我踩过的坑
- 编译报错找不到 numa.h:
sudo apt install libnuma-dev或yum install numactl-devel。 - 大页分配失败:检查
/proc/meminfo里的HugePages_Total,如果为 0,说明没生效。重启试试。 - 运行示例时权限不足:DPDK 需要 root 权限,或者把用户加入
dpdk组。我一般直接sudo跑。
核心总结:DPDK 环境搭建,硬件检查是前提,大页配置是灵魂。编译过程用 meson 很省事,但别忘了装依赖。验证环节跑个 helloworld,能跑通就说明环境没问题。
公众号:蓝海资料掘金营,微信deep3321