概述

DPDK(Data Plane Development Kit)是 Intel 开源的高性能数据包处理框架,通过用户态驱动绕过内核协议栈,实现网卡零拷贝和轮询模式,大幅提升网络吞吐性能。

本文记录 DPDK 的安装步骤以及网卡接管配置流程。


一、环境准备

1.1 系统要求

  • Linux 内核 3.7+
  • 支持的网络设备(Intel 网卡为主)
  • 关闭 IOMMU 或配置 VFIO

1.2 关闭内核网络服务

1
2
3
4
5
6
# 停止 NetworkManager
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager

# 卸载网卡驱动(以 igb_uio 为例)
sudo modprobe -r igb

二、安装 DPDK

2.1 方式一:包管理器安装(推荐)

1
2
3
4
5
# Ubuntu/Debian
sudo apt-get install dpdk dpdk-dev

# CentOS/RHEL
sudo yum install dpdk dpdk-devel

2.2 方式二:源码编译

1
2
3
4
5
6
7
8
9
10
11
# 下载源码
wget https://fast.dpdk.org/rel/dpdk-22.11.tar.xz
tar -xf dpdk-22.11.tar.xz
cd dpdk-22.11

# 配置编译
meson build -Ddrivers=enabled
ninja -C build

# 安装
sudo ninja -C build install

三、网卡接管配置

3.1 绑定网卡到 UIO/VFIO 驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 加载 UIO 驱动
sudo modprobe uio
sudo modprobe uio_pci_generic

# 或使用 VFIO(推荐,更安全)
sudo modprobe vfio
sudo modprobe vfio-pci

# 查看网卡 PCI 地址
lspci | grep -i ethernet
# 输出示例:0000:03:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection

# 绑定网卡(假设 PCI 地址为 0000:03:00.0)
sudo dpdk-devbind.py --bind=vfio-pci 0000:03:00.0

# 验证绑定状态
dpdk-devbind.py --status

3.2 配置大页内存

1
2
3
4
5
6
7
8
9
10
# 临时配置(重启失效)
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

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

# 挂载大页
sudo mkdir -p /mnt/huge
sudo mount -t hugetlbfs nodev /mnt/huge

3.3 配置环境变量

1
2
3
4
# 添加到 ~/.bashrc 或 /etc/profile
export RTE_SDK=/usr/share/dpdk
export RTE_TARGET=x86_64-native-linuxapp-gcc
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

四、验证测试

4.1 运行 DPDK 示例程序

1
2
3
4
5
# 测试轮询模式
sudo ./build/examples/helloworld -l 0-3 -n 4

# 测试数据包转发
sudo ./build/examples/l2fwd -l 0-3 -n 4 -- -p 0x3

4.2 查看网卡状态

1
2
3
4
5
6
# 使用 dpdk-devbind 查看
dpdk-devbind.py --status

# 使用 testpmd 查看
sudo testpmd -l 0-3 -n 4 -- -i
testpmd> show port info 0

五、常见问题

5.1 网卡绑定失败

1
2
3
4
5
# 检查内核驱动是否卸载
lsmod | grep igb

# 强制解绑
echo 0000:03:00.0 > /sys/bus/pci/drivers/igb/unbind

5.2 大页内存不足

1
2
# 增加大页数量
echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

5.3 VFIO 权限问题

1
2
3
4
5
# 添加用户到 vfio 组
sudo usermod -aG vfio $USER

# 或修改权限
sudo chmod 666 /dev/vfio/*

六、恢复网卡到内核驱动

1
2
3
4
5
6
7
8
# 解绑 DPDK 驱动
sudo dpdk-devbind.py --unbind 0000:03:00.0

# 重新绑定内核驱动
sudo dpdk-devbind.py --bind=igb 0000:03:00.0

# 重启网络服务
sudo systemctl start NetworkManager

参考资源