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 从文件读取命令(命令行模式)
testpmd 启动流程与参数传递 启动命令 ./dpdk-testpmd EAL 参数解析:-l, -n, --socket-mem, --proc-type 应用参数解析:--portmask, --nb-cores, --rxd 端口初始化:探测、配置、启动 进入交互模式 (testpmd>)

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
testpmd 交互模式命令分类 端口管理 port start/stop port config show port info clear port stats 转发控制 start / stop set fwd <mode> show fwd stats set rxq / txq 统计查看 show port stats show fwd stats read rxpkt / txpkt 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 启动时,端口初始化经历以下关键阶段:

  1. EAL 初始化: 分配大页内存、初始化 PCI 总线、绑定逻辑核。
  2. 端口探测: 扫描 PCI 设备,识别绑定到 DPDK 驱动的物理端口。
  3. 端口配置: 根据启动参数设置描述符环大小、队列数、卸载功能等。
  4. 端口启动: 调用 rte_eth_dev_start() 使端口进入运行状态。
  5. 转发线程初始化: 在每个转发核上创建转发线程,准备接收和发送数据包。
testpmd 端口初始化五阶段 EAL 初始化 大页 + PCI 端口探测 扫描 PCI 设备 端口配置 队列 + 卸载 端口启动 rte_eth_dev_start 转发线程 启动 各阶段关键检查点 1. EAL 初始化:确认大页内存分配成功,无 PCI 扫描错误 2. 端口探测:使用 show port info all 确认端口 ID 和 MAC 地址 3. 端口配置:检查 rxd/txd 大小、队列数是否符合预期 4. 端口启动:确认端口状态为 UP,无链路错误

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,确认端口状态和转发统计正常,即可开始性能测试。