4. testpmd基础入门
testpmd 是 DPDK 官方提供的用户态数据包转发测试工具,也是性能基准测试中最常用的流量收发与配置验证平台。本章将系统讲解 testpmd 的三种运行模式、核心启动参数、端口初始化流程以及交互式控制方法,为后续使用 pktgen 与 testpmd 联合进行性能测试打下坚实基础。
4.1 testpmd 概述与运行模式
testpmd 本质上是一个基于 DPDK 框架的以太网数据包转发应用,支持多队列、RSS、流分类、硬件卸载等特性的配置与验证。其运行模式分为以下三种:
| 模式 | 启动方式 | 适用场景 | 特点 |
|---|---|---|---|
| 交互模式 | 直接运行 testpmd,进入 CLI 交互界面 | 调试、单步配置、快速验证 | 实时输入命令,即时查看结果 |
| 命令行模式 | 通过 --cmdline-file 或管道传入命令 |
自动化测试、脚本集成 | 非交互式,批量执行预定义命令 |
| 自动转发模式 | 启动时指定 --auto-start 或转发参数 |
持续性能测试、吞吐量测量 | 启动后自动开始转发,无需人工干预 |
实践建议: 初次接触 testpmd 时,优先使用交互模式进行端口配置和转发验证;确认配置正确后,再切换到命令行模式或自动转发模式进行批量测试。
4.2 testpmd 启动命令与核心参数
testpmd 的启动命令遵循 DPDK 应用的标准格式:EAL 参数在前,应用参数在后。以下是一个典型的启动示例:
# 基本启动命令(交互模式)
./dpdk-testpmd -l 0-3 -n 4 -- -i --portmask=0x3 --nb-cores=2
# 参数说明:
# -l 0-3 :绑定逻辑核 0~3
# -n 4 :每个 NUMA 节点分配 4 个内存通道
# -- -i :进入交互模式
# --portmask=0x3 :启用端口 0 和端口 1
# --nb-cores=2 :使用 2 个转发核
下表列出了 testpmd 启动时最常用的核心参数及其作用:
| 参数 | 示例值 | 说明 |
|---|---|---|
-i |
— | 进入交互模式(默认) |
--portmask |
0x3 |
位掩码指定启用的物理端口 |
--nb-cores |
2 |
用于数据转发的逻辑核数量 |
--rxd / --txd |
1024 |
接收/发送描述符环大小 |
--mbuf-size |
2048 |
mbuf 缓冲区大小(字节) |
--forward-mode |
io |
转发模式:io / mac / flowgen 等 |
--auto-start |
— | 启动后自动开始转发 |
--cmdline-file |
cmds.txt |
从文件读取命令(命令行模式) |
4.3 交互模式与常用命令
交互模式是 testpmd 最灵活的操作方式。启动后进入 testpmd> 提示符,可实时输入命令进行端口管理、转发控制、统计查看等操作。
4.3.1 端口初始化与启动
端口初始化是 testpmd 使用的基础步骤,通常包括以下操作:
# 1. 查看所有可用端口
testpmd> show port info all
# 2. 启动指定端口(端口 0 和 1)
testpmd> port start 0
testpmd> port start 1
# 3. 启动所有端口
testpmd> port start all
# 4. 停止端口
testpmd> port stop 0
# 5. 重置端口统计
testpmd> clear port stats all
注意: 端口启动前必须确保物理端口已绑定到 DPDK 驱动(如 igb_uio、vfio-pci),否则 testpmd 无法探测到端口。可使用
dpdk-devbind.py -s 检查当前绑定状态。
4.3.2 转发控制命令
启动端口后,通过以下命令控制数据转发:
| 命令 | 功能 | 示例 |
|---|---|---|
start |
启动数据包转发 | testpmd> start |
stop |
停止数据包转发 | testpmd> stop |
set fwd <mode> |
设置转发模式 | testpmd> set fwd mac |
show fwd stats all |
显示所有端口的转发统计 | testpmd> show fwd stats all |
show port stats <port_id> |
显示指定端口的统计信息 | testpmd> show port stats 0 |
4.3.3 常用配置命令
# 设置转发模式为 io(纯 IO 转发,不修改 MAC)
testpmd> set fwd io
# 设置转发模式为 mac(修改源/目的 MAC)
testpmd> set fwd mac
# 设置每个转发核的队列数
testpmd> set rxq 4
testpmd> set txq 4
# 设置 RSS 哈希类型
testpmd> port config 0 rss all
# 查看当前配置
testpmd> show config
4.4 命令行模式与自动化
命令行模式允许将 testpmd 命令写入文件,通过 --cmdline-file 参数批量执行,适用于自动化测试场景。
# 创建命令文件 cmds.txt
cat > cmds.txt << EOF
port start all
set fwd mac
start
show fwd stats all
stop
EOF
# 以命令行模式启动
./dpdk-testpmd -l 0-3 -n 4 -- --cmdline-file=cmds.txt
关键区别: 交互模式下命令逐条输入并立即执行;命令行模式下所有命令按顺序执行,执行完毕后 testpmd 自动退出。命令行模式适合集成到 CI/CD 或自动化测试框架中。
4.5 端口初始化流程详解
testpmd 启动时,端口初始化经历以下关键阶段:
- EAL 初始化: 分配大页内存、初始化 PCI 总线、绑定逻辑核。
- 端口探测: 扫描 PCI 设备,识别绑定到 DPDK 驱动的物理端口。
- 端口配置: 根据启动参数设置描述符环大小、队列数、卸载功能等。
- 端口启动: 调用
rte_eth_dev_start()使端口进入运行状态。 - 转发线程初始化: 在每个转发核上创建转发线程,准备接收和发送数据包。
4.6 常见问题与排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 端口未显示 | 端口未绑定 DPDK 驱动 | 使用 dpdk-devbind.py -b igb_uio 0000:xx:00.0 绑定 |
| 端口启动失败 | 内存不足或描述符环配置过大 | 增大 --socket-mem 或减小 --rxd/--txd |
| 转发无流量 | 端口未启动或转发模式错误 | 执行 port start all 并检查 set fwd 模式 |
| 统计信息不更新 | 转发线程未启动 | 执行 start 命令启动转发 |
快速验证流程: 启动 testpmd 后,依次执行
show port info all → port start all → set fwd io → start → show fwd stats all,确认端口状态和转发统计正常,即可开始性能测试。