DPDK:环境搭建与网卡绑定
介绍在虚拟机中裁剪编译 DPDK、加载 igb_uio 驱动、配置大页内存、绑定网卡,以及使用 l2fwd 和 testpmd 验证。
DPDK 通过用户态驱动和轮询模式绕过内核协议栈,实现高速包处理。本文以 VMware + Ubuntu 22.04 + DPDK 22.07 为例,介绍裁剪编译、驱动加载、大页配置和网卡绑定。
实验环境:
- VMware Workstation 17
- Ubuntu 22.04,CPU 8 核,内存 4G,网卡 4 个
- DPDK 22.07
一、安装依赖
sudo apt-get install meson
sudo apt install python3-pyelftools
sudo apt-get install pkg-config
二、裁剪编译 DPDK
默认编译会编译所有驱动,速度很慢。虚拟机中大部分驱动用不到,可以在 meson build 前裁剪驱动列表。
修改 drivers/meson.build,subdirs 只保留:
'bus'
'mempool'
'net'
再分别裁剪:
drivers/bus/meson.build -> 只保留 'pci', 'vdev'
drivers/mempool/meson.build -> 只保留 'ring', 'stack'
drivers/net/meson.build -> 只保留 'e1000'(VMware 虚拟网卡使用 e1000)
编译安装:
wget https://fast.dpdk.org/rel/dpdk-22.07.tar.xz
tar xf dpdk-22.07.tar.xz
cd dpdk-22.07
meson build
cd build
ninja
ninja install
三、编译加载 igb_uio 驱动
3.1 编译 igb_uio
git clone http://dpdk.org/git/dpdk-kmods
cd dpdk-kmods/linux/igb_uio
make
3.2 加载驱动
modprobe uio
insmod igb_uio.ko intr_mode=legacy
四、配置大页内存
DPDK 需要大页内存供数据包缓冲区使用:
echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
验证分配情况:
grep -iE "mem|huge" /proc/meminfo
五、绑定网卡
5.1 前提:vfio-pci 与 IOMMU
生产环境推荐使用 vfio-pci 驱动,前提是:
- CPU 支持 VT-x、VT-d,BIOS 中开启相关特性。
- 内核启动参数添加
iommu=pt intel_iommu=on。 - 加载驱动:
modprobe vfio-pci。
无 IOMMU 的环境可以临时开启 unsafe 模式,或改用 igb_uio:
modprobe vfio-pci
lsmod | grep vfio-pci
# 无 IOMMU 时(不推荐生产使用)
echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
5.2 绑定网卡
绑定前先 down 网卡,记录原驱动以便恢复:
ifconfig ens34 down
ifconfig ens35 down
dpdk-devbind.py -b igb_uio ens34 ens35
# 检查绑定结果
dpdk-devbind.py -s
ls -l /sys/bus/pci/drivers/igb_uio/
5.3 解绑恢复
dpdk-devbind.py -u 02:02.0 02:03.0
dpdk-devbind.py -b e1000 02:02.0 02:03.0
ifconfig ens34 up
ifconfig ens35 up
六、运行 l2fwd 示例
cd examples/l2fwd/build/
./l2fwd -l 0-1 -- -p 0x3 -T 1
-l 0-1 指定使用的逻辑核,-p 0x3 表示启用端口 0 和端口 1。
七、使用 testpmd 验证
testpmd 是 DPDK 自带的交互式测试工具。
7.1 准备大页
mkdir -p /dev/hugepages
mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages
echo 512 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 512 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
7.2 启动 testpmd
sudo ./build/app/dpdk-testpmd -w 0000:82:00.0 -w 0000:82:00.1 -l 12,13,14 -n 4 -- -i
参数说明:
-w:指定 PCI 设备(白名单)。-l:指定逻辑核,一个核用于管理命令行,其余用于转发。-n:内存通道数。--:分隔 EAL 参数和应用参数。-i:进入交互模式。
7.3 常用交互命令
show config fwd # 查看转发配置
set fwd txonly # 只发送模式
set txpkts 1024 # 设置发送包大小
set fwd rxonly # 只接收模式
show port stats all # 查看全部端口统计
clear port stats all # 清空统计
八、总结
- 虚拟机中编译 DPDK 前先裁剪驱动,只保留需要的
e1000,编译速度大幅提升。 - 网卡绑定前提:驱动加载(igb_uio/vfio-pci)+ 大页内存 + 先 down 网卡。
- 绑定前记录原驱动和 PCI 地址,便于解绑恢复。
l2fwd验证数据通路,testpmd进行交互式转发和统计测试。
相关脚本
整理自 cyy-tag/bash-example 仓库: