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 仓库: