Amazon Linux 2023 DPDK 配置指南
简介
DPDK (Data Plane Development Kit) 是一套用于快速数据包处理的开源库和驱动程序集合。通过绕过内核网络栈,DPDK 可以在用户态实现高性能的数据包处理,广泛应用于网络功能虚拟化(NFV)、软件定义网络(SDN)、高频交易等场景。
DPDK主要特性:
- 用户态数据包处理,绕过内核网络栈
- 支持零拷贝、批量处理等优化技术
- 与 AWS ENA (Elastic Network Adapter) 驱动完全兼容
- 支持多核并行处理
本指南详细介绍如何在 Amazon Linux 2023 上安装配置 DPDK,并在 c7i, c5n 实例上完成验证,相关环境信息如下:
- AMI: Amazon Linux 2023
- Kernel: 6.1.156-177.286.amzn2023.x86_64
- GCC: 11.5.0
- DPDK 版本: 22.11 LTS / 23.11 LTS
前提条件
- 支持 ENA的EC2 实例类型(所有5代及以上的 Nitro 系统实例都支持 ENA 等)
- Amazon Linux 2023 AMI
- 至少 2 个网络接口 (eth0 用于 SSH,eth1+ 用于 DPDK)
配置步骤
1. 安装依赖包
# 更新系统
sudo dnf update -y
# 安装开发工具和依赖 (大部分已预装)
sudo dnf install -y git gcc openssl-devel kernel-devel bc numactl-devel \
make net-tools vim pciutils iproute wget python3 python3-pip \
elfutils-libelf-devel libatomic
2. 下载和构建 DPDK
# 下载 DPDK LTS 版本
cd /tmp
wget https://fast.dpdk.org/rel/dpdk-22.11.tar.xz
tar xf dpdk-22.11.tar.xz
cd dpdk-22.11
# 安装 Python 构建工具
pip3 install meson ninja pyelftools
# 配置和构建 (使用现代 meson/ninja 方式)
# 注意: 禁用有问题的驱动避免编译错误
# - GVE: Google Cloud 专用驱动,AWS 不需要
# - ionic: AMD Pensando 专用硬件驱动,AWS EC2 使用 ENA 驱动
meson setup build -Ddisable_drivers=net/gve,net/ionic -Dexamples=helloworld
cd build
ninja
# 编译时间约 5-6 分钟
3. 配置系统
3.1 配置 Hugepages
# 配置 hugepages (512 个 2MB 页面 = 1GB)
echo 512 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# 永久配置 (可选)
echo "vm.nr_hugepages=512" | sudo tee -a /etc/sysctl.conf
验证配置
# 检查 hugepages 配置
cat /proc/meminfo | grep -i huge
预期结果:
# HugePages_Total 应该显示 512
HugePages_Total: 512
HugePages_Free: 512
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 1048576 kB
3.2 加载内核模块 (用于网络接口绑定)
# 加载必要的内核模块
sudo modprobe uio
sudo modprobe uio_pci_generic # 虚拟化实例使用
sudo modprobe vfio-pci # 裸金属实例使用
# 确认模块加载
lsmod | grep -E "uio|vfio"
3.3 运行helloworld示例应用(可选)
# helloworld 示例已在编译时包含 (-Dexamples=helloworld)
cd /tmp/dpdk-22.11/build
# 查找 helloworld
find . -name '*helloworld*' -executable -type f
# 运行 helloworld (需要 hugepages)
sudo ./examples/dpdk-helloworld
预期结果:
# 可以看到 "hello from core X" 消息,表示 DPDK 成功初始化并在多个 CPU 核心上运行
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 0
4. 绑定网络接口到 DPDK
⚠️注意: 绑定网络接口会使其脱离内核控制,无法用于正常网络通信。请确保:
至少保留一个接口用于 SSH 管理(通常是 eth0/ens5)
- 只绑定用于 DPDK 测试的额外接口
4.1 查看当前网络接口状态
cd /tmp/dpdk-22.11
# 检查设备绑定工具
ls -la usertools/dpdk-devbind.py
# 查看所有网络接口
./usertools/dpdk-devbind.py --status
预期结果:
# 应该看到 ENA 网络接口被正确识别
4.2 绑定接口到 DPDK
驱动说明:
- 裸金属实例 (c7i.metal, c5n.metal 等): 使用
vfio-pci(支持 MSI-X 中断) - 虚拟化实例 (c7i.large, c5n.large 等): 使用
uio_pci_generic(IOMMU 受限)
# 关闭接口
sudo ip link set ens6 down
# 裸金属实例: 绑定到 vfio-pci
sudo ./usertools/dpdk-devbind.py --bind=vfio-pci 0000:00:06.0
# 虚拟化实例: 绑定到 uio_pci_generic
sudo ./usertools/dpdk-devbind.py --bind=uio_pci_generic 0000:00:06.0
# 验证绑定状态
./usertools/dpdk-devbind.py --status
预期结果:
4.3 解绑接口(恢复到内核驱动)
# 解绑并恢复到 ENA 驱动
sudo ./usertools/dpdk-devbind.py --bind=ena 0000:00:06.0
# 或者使用 --unbind 然后让内核自动重新绑定
sudo ./usertools/dpdk-devbind.py --unbind 0000:00:06.0
# 验证恢复状态
./usertools/dpdk-devbind.py --status
4.4 使用绑定的接口运行 DPDK 应用
# 使用 testpmd 测试绑定的接口
cd /tmp/dpdk-22.11/build/app
# 基础测试(使用绑定的接口)
sudo ./dpdk-testpmd -l 0-1 -n 4 -- -i
# 在 testpmd 提示符下输入命令:
# testpmd> show port info all # 显示端口信息
# testpmd> start # 开始转发
# testpmd> stop # 停止转发
# testpmd> quit # 退出
已知限制
- 虚拟化实例 IOMMU 限制: c7i.large 等虚拟化实例的 IOMMU 功能受限,testpmd 端口配置可能失败(MSI-X 中断不支持)
- 建议: 对于完整的 DPDK 网络应用测试,推荐使用裸金属实例(如 c7i.metal)以获得完整的 IOMMU 和 vfio-pci 支持
故障排除
需注意事项
- 驱动兼容性: 必须禁用 GVE (Google Cloud) 和 ionic (AMD Pensando) 驱动
- GVE: Google Cloud 专用,与 AL2023 内核头文件冲突
- ionic: AMD Pensando 专用硬件,__le64 类型定义冲突
- AWS EC2 只需要 ENA 驱动,已包含在编译中
- 示例编译: 在初始编译时使用
-Dexamples=helloworld包含示例 - 网络接口要求: 需要至少 2 个网络接口进行完整测试
常见问题
GVE 驱动编译错误:
# 解决方案: 在 meson setup 时禁用 GVE 驱动(Google Cloud 专用) meson setup build -Ddisable_drivers=net/gve,net/ionicionic 驱动编译错误 (__le64 类型冲突):
# 解决方案: 禁用 ionic 驱动(AMD Pensando 专用硬件) # AWS EC2 使用 ENA 驱动,不需要 ionic meson setup build -Ddisable_drivers=net/gve,net/ionichelloworld 编译失败:
# 解决方案: 在初始编译时就包含示例 meson setup build -Ddisable_drivers=net/gve,net/ionic -Dexamples=helloworld网卡绑定失败 (vfio-pci):
# 错误: Cannot bind to driver vfio-pci: [Errno 22] Invalid argument # 原因: 虚拟化实例 IOMMU 受限 # 解决方案: 使用 uio_pci_generic 驱动 sudo modprobe uio_pci_generic sudo ip link set ens6 down sudo ./usertools/dpdk-devbind.py --bind=uio_pci_generic 0000:00:06.0接口绑定警告 (interface is active):
# 警告: routing table indicates that interface is active # 解决方案: 先关闭接口再绑定 sudo ip link set ens6 down sudo ./usertools/dpdk-devbind.py --bind=uio_pci_generic 0000:00:06.0
参考资料: