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 支持
 

故障排除

需注意事项

  1. 驱动兼容性: 必须禁用 GVE (Google Cloud) 和 ionic (AMD Pensando) 驱动
    • GVE: Google Cloud 专用,与 AL2023 内核头文件冲突
    • ionic: AMD Pensando 专用硬件,__le64 类型定义冲突
    • AWS EC2 只需要 ENA 驱动,已包含在编译中
  2. 示例编译: 在初始编译时使用 -Dexamples=helloworld 包含示例
  3. 网络接口要求: 需要至少 2 个网络接口进行完整测试

常见问题

  1. GVE 驱动编译错误:

    # 解决方案: 在 meson setup 时禁用 GVE 驱动(Google Cloud 专用)
    meson setup build -Ddisable_drivers=net/gve,net/ionic
    
  2. ionic 驱动编译错误 (__le64 类型冲突):

    # 解决方案: 禁用 ionic 驱动(AMD Pensando 专用硬件)
    # AWS EC2 使用 ENA 驱动,不需要 ionic
    meson setup build -Ddisable_drivers=net/gve,net/ionic
    
  3. helloworld 编译失败:

    # 解决方案: 在初始编译时就包含示例
    meson setup build -Ddisable_drivers=net/gve,net/ionic -Dexamples=helloworld
    
  4. 网卡绑定失败 (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
    
  5. 接口绑定警告 (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
    

 

参考资料: 

Blog: 如何在 AWS EC2 实例中使用 DPDK 

Github: NEOAdvancedTechnology DPDK on EC2 Tutorial

Previous Post
No Comment
Add Comment
comment url