帮你快速理解、总结文档立即下载

使用 DPDK 测试

最近更新时间:2026-08-21 10:35:31
本文档已由 AI 辅助审校
我的收藏

操作场景

DPDK(Data Plane Development Kit)是一组用于快速数据包处理的库与驱动集合,通过轮询模式驱动(PMD)绕过内核协议栈,可显著提升网络转发性能,广泛应用于自研网关、负载均衡、NFV、DDoS 清洗、高性能代理等场景。
本文介绍如何在腾讯云云服务器(Cloud Virtual Machine,CVM)Linux 实例上,自建 DPDK 运行环境并通过 DPDK 方法进行云服务器高吞吐网络性能测试。

操作步骤

步骤一:环境准备与安装

本章将引导您完成 DPDK 测试环境的搭建,包括下载源码、解压、安装依赖库及编译。

环境准备

云服务器需要公网访问能力,您可在创建云服务器时选择分配公网 IP,或在云服务器创建后为其配置 弹性公网 IP
云服务器配置多张网卡,建议使用 eth0 测试,使用其余网卡进行远程登录。
相关操作需要系统 root 权限下进行,请提前申请相关权限。
以下操作指引适用于 TencentOS 3.0及以上操作系统。
准备2台测试服务器,分别为接收端和发送端。
如何创建实例,请参见 通过购买页创建实例

下载并解压 DPDK 源码包

使用 wget 命令从官方仓库下载 DPDK 23.11 源码压缩包并解压。
说明:
后续操作请在 DPDK 解压后目录中进行。
wget https://fast.dpdk.org/rel/dpdk-23.11.tar.gz
tar -xf dpdk-23.11.tar.gz
cd dpdk-23.11

安装依赖库与编译

安装必要的依赖库和编译工具。
安装 numactl-devel 依赖库(需要 root 权限)。
yum install numactl-devel -y
安装 Python 构建工具。
pip3 install meson ninja pyelftools
使用 meson 进行项目构建(设置最大逻辑核心数为1024)。
meson build -Dmax_lcores=1024
使用 ninja 编译项目。
ninja -C build
注意:
如果您使用的测试服务器为标准型 SA4之后的实例类型且 CPU 为最高规格,请参见 特殊场景处理,增加相关配置步骤。

步骤二:内核驱动模块绑定

DPDK 需要绑定专用的内核驱动模块接管网卡设备。

下载 UIO 模块

从 DPDK 官方仓库克隆内核模块代码:
git clone http://dpdk.org/git/dpdk-kmods
或使用 git 协议(备选)。
git clone git://dpdk.org/dpdk-kmods

编译 UIO 模块

进入 igb_uio 目录并进行编译。
cd ./dpdk-kmods/linux/igb_uio
make

加载 UIO 模块

加载 uioigb_uio 内核模块(需要 root 权限)。
modprobe uio
insmod ./dpdk-kmods/linux/igb_uio/igb_uio.ko

查询并记录网卡 PCI 地址

绑定网卡前,需要获取并记录目标网卡的 PCI 地址。执行以下命令查看并记录所有网卡设备信息:
ethtool -i eth0 | grep bus-info


绑定网卡到 UIO 驱动

使用 DPDK 提供的工具绑定网卡到 igb_uio 驱动。
1. 关闭网卡。
注意:
关闭网卡前,请检查当前是否通过其他弹性网卡的 IP 远程登录云服务器, 若使用 eth0 远程登录,将导致连接中断。
ifconfig eth0 down
2. 绑定网卡到 igb_uio 驱动(注意替换为实际 PCI 地址)。
./usertools/dpdk-devbind.py --bind=igb_uio 0000:02:01.0 #0000:02:01.0 需要替换为您实际的网卡 PCI 地址

步骤三:大页内存配置

DPDK 使用大页内存(Huge Pages)来提高内存访问效率。配置大页内存是运行 DPDK 的必要前提。
执行以下命令分配大页内存(此处以 2MB 大页为例,分配 8192 个页面,共约 16GB):
echo 8192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

步骤四:运行性能测试

DPDK 性能测试采用 RX-TX 双机模式:一台服务器作为接收端(RX),另一台服务器作为发送端(TX)。
说明:
RX 接收端,TX 发送端。两台服务器需分别执行对应的命令。
RX 接收端执行命令如下:
C=4; Q=32; ./build/app/dpdk-testpmd -l 0-47 --proc-type primary --file-prefix bench -a 0000:1b:00.0 -- --burst=128 --nb-cores=$C --txd=4096 --rxd=4096 --txq=$Q --rxq=$Q --forward-mode=rxonly --stats-period=1
TX 发送端执行命令如下:
C=4; Q=32; S=10.31.0.80; D=10.31.0.240; ./build/app/dpdk-testpmd -l 0-47 --proc-type primary --file-prefix bench -a 0000:1b:00.0 -- --burst=128 --nb-cores=$C --tx-ip $S,$D --txonly-multi-flow --txpkts=64 --txd=4096 --rxd=4096 --txq=$Q --rxq=$Q --forward-mode=txonly --stats-period=1

参数详细说明

参数
说明
-a 0000:1b:00.0
指定要使用的网卡 PCI 地址,需根据实际环境替换。
--tx-ip S,D
TX 端发包的目标 IP 地址,按云服务器网卡地址替换。
--txonly-multi-flow
启用多流发送模式(不设置则只发送单条流)。
--txpkts=64
报文长度(字节,包含 MAC 头),测试 PPS 场景建议 64。
-l 0-47
指定使用的 CPU 核心编号范围,按需调整,跨 NUMA 场景可 查看队列跨 NUMA 分布 获取。
--txq / --rxq = $Q
发送/接收队列数量,可通过 ethtool -l eth0 | grep Combined 查看。
--nb-cores=$C
实际参与测试的 CPU 核心数,推荐 2 ≤ C ≤ Q。
--stats-period=1
每秒输出一次统计信息。
测试结果示例如下,左侧为 RX 接收端,右侧为 TX 发送端:


步骤五:测试环境恢复

测试完成后,建议将环境恢复到初始状态,释放资源并避免影响其他服务。

恢复网卡驱动

使用 dpdk-devbind.py 工具将网卡还原到默认驱动:
./usertools/dpdk-devbind.py -b virtio-pci 0000:00:08.0 # 注意:0000:00:08.0 需替换为实际 PCI 地址
如果上述命令无法正常工作,可手动执行以下命令解除 vfio-pci 绑定。
echo 0000:1b:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind #0000:1b:00.0按需替换
echo virtio-pci > /sys/bus/pci/devices/0000\\:1b\\:00.0/driver_override #设置 driver_override 为 virtio-pci
echo 0000:1b:00.0 > /sys/bus/pci/drivers/virtio-pci/bind #重新绑定到 virtio-pci

恢复大页内存

将大页内存数量归零。
echo 0 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
重新启用网卡。
ifconfig eth1 up

特殊场景处理

如果您使用的测试服务器为标准型 SA4之后的实例类型且 CPU 为最高规格,需要增加以下配置步骤。

查看队列跨 NUMA 分布

说明:
对于多路 CPU 的服务器,需要确保 DPDK 使用的 CPU 核心与网卡位于同一个 NUMA 节点上,否则性能会大幅下降。
1. 下载查看脚本。
wget https://lag-dpdk-1326316016.cos.ap-guangzhou.myqcloud.com/dpdk_core_advisor.sh
2. 运行查看跨队列 NUMA 分布脚本。
sh dpdk_core_advisor.sh eth0
如返回结果显示队列跨 NUMA 分布,请安装 lag_dpdk.patch


安装 lag_dpdk.patch

1. 下载 lag_dpdk.patch 补丁脚本。
wget https://lag-dpdk-1326316016.cos.ap-guangzhou.myqcloud.com/lag_dpdk.patch
2. 应用补丁。
git apply lag_dpdk.patch
# 等效命令(二选一即可)
patch -p1 < lag_dpdk.patch
3. 重新编译。
meson build -Dmax_lcores=1024
ninja -C build

使用 VFIO 驱动(可选)

UIO 与 VFIO 均可用于将 PCIe 设备交由 DPDK 用户态驱动直接访问。UIO 适用于简单裸机或传统部署场景,VFIO 适用于虚拟化、容器化、多租户及 DMA 隔离场景,可根据实际需求选择。本步骤可替代 步骤二:内核驱动模块绑定

使用限制

云服务器 CVM 仅支持 no-IOMMU 模式下的 VFIO。CVM 基于 KVM 虚拟化,不向虚拟机内部暴露 IOMMU(vIOMMU),这是选择驱动方案时的关键约束。
驱动方案
普通 CVM 是否可用
说明
VFIO(标准模式,依赖 IOMMU)
不支持
CVM 无 IOMMU 透传,无法创建 IOMMU group。
VFIO(no-IOMMU 模式)
支持(推荐)
需开启 enable_unsafe_noiommu_mode
具体限制如下:
CVM 内 /sys/kernel/iommu_groups/ 目录为空,不存在任何 IOMMU group。在内核启动参数中添加 intel_iommu=onamd_iommu=on 不会生效,底层无 IOMMU 硬件透传,无需修改 GRUB。因此标准 VFIO 无法完成设备绑定。
VFIO 方案采用 no-IOMMU 模式,通过内核模块参数 vfio.enable_unsafe_noiommu_mode=1 启用。
no-IOMMU 模式自 Linux 内核 4.5 起提供(CONFIG_VFIO_NOIOMMU),实例内核版本需不低于 4.5。该参数在大多数发行版上默认关闭,需手动开启。TencentOS Server 3.3 及之后版本默认开启。
若业务必须使用 IOMMU 或 SR-IOV 直通能力,请参见 裸金属云服务器
注意:
no-IOMMU 模式被内核标记为 "unsafe",该模式关闭了 IOMMU 提供的 DMA 隔离保护。请评估风险后,仅在受信的单租户 guest 环境内使用。

操作步骤

步骤一:VFIO 驱动模块初始化

sudo modprobe vfio

# 开启 no-IOMMU 模式(TencentOS Server 3.3+ 默认为 Y,可跳过本行)
echo 1 | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

sudo modprobe vfio-pci

# 验证,应输出 Y
cat /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
将 no-IOMMU 模式固化到模块配置,确保重启后自动生效:
echo "options vfio enable_unsafe_noiommu_mode=1" | sudo tee /etc/modprobe.d/vfio.conf

步骤二:VFIO 驱动模块绑定

使用 DPDK 提供的工具绑定网卡到 vfio 驱动。
1. 关闭网卡。
注意:
关闭网卡前,请检查当前是否通过其他弹性网卡的 IP 远程登录云服务器, 若使用 eth0 远程登录,将导致连接中断。
ifconfig eth0 down
2. 绑定网卡到 igb_uio 驱动(注意替换为实际 PCI 地址)。
./usertools/dpdk-devbind.py --bind=vfio-pci 0000:02:01.0 #0000:02:01.0 需要替换为您实际的网卡 PCI 地址