2. testpmd 基础操作:启动、参数与模式

testpmd 是 DPDK 生态中最核心的交互式流量生成与调试工具。掌握 testpmd 的启动方式、命令行参数以及两种运行模式(交互模式与脚本模式),是后续进行 RSS 配置、队列映射和流规则调试的前提。本章将系统梳理 testpmd 的基础操作,确保你能够快速搭建调试环境。

2.1 启动 testpmd:典型命令行与参数解析

testpmd 的启动命令通常包含 DPDK 通用 EAL 参数和 testpmd 应用层参数。以下是一个典型的 4 队列、2 端口的启动示例:

./dpdk-testpmd -l 0-3 -n 4 -- -i --portmask=0x3 --nb-cores=2 --rxq=4 --txq=4

参数分为两段:-l 0-3 -n 4 属于 EAL 参数,-- -i --portmask=0x3 ... 属于 testpmd 应用参数。下表列出最常用的参数及其含义:

参数类别 参数示例 含义说明
EAL 核心绑定 -l 0-3 绑定逻辑核 0~3 给 DPDK 使用
EAL 内存通道 -n 4 指定内存通道数(通常与 NUMA 节点对应)
EAL 大页内存 --socket-mem=1024 每个 socket 预留 1024 MB 大页内存
应用模式 -i 进入交互模式(interactive mode)
端口掩码 --portmask=0x3 启用 port 0 和 port 1(二进制 0b11)
转发核心数 --nb-cores=2 使用 2 个核心进行数据包转发
接收队列数 --rxq=4 每个端口创建 4 个接收队列
发送队列数 --txq=4 每个端口创建 4 个发送队列
调试建议: 在流规则调试阶段,建议始终使用 -i 交互模式启动,并显式指定 --rxq 和 --txq 数量,确保队列资源与后续 RSS 配置对齐。

2.2 交互模式:实时控制与状态查询

交互模式是 testpmd 最常用的工作方式。启动后进入 testpmd> 提示符,支持数百条运行时命令。以下是与 RSS 和队列映射强相关的核心命令分类:

  • 端口与队列信息: show port info all、show port stats all、show rxq info 0 0
  • RSS 配置: port config 0 rss all、port config 0 rss ip、show port 0 rss-hash
  • 流规则操作: flow create 0 ingress ...、flow list 0、flow destroy 0 rule 0
  • 转发控制: start、stop、set fwd io、set fwd mac

下图展示了交互模式下,从启动到流规则验证的典型操作流程:

testpmd 交互模式操作流程 testpmd 交互模式典型操作流程 启动 testpmd 配置 RSS 哈希 创建流规则 启动转发 (start) 验证队列映射 关键验证命令 show port stats all show rxq info 0 0
交互模式优势: 支持实时修改 RSS 哈希类型、动态创建/删除流规则、即时查看队列统计,非常适合流规则调试阶段的反复试验。

2.3 脚本模式:自动化批量执行

当调试流程稳定后,可以将一系列 testpmd 命令写入脚本文件,通过 -f 参数批量执行。脚本模式适用于回归测试、自动化验证和持续集成场景。

脚本文件每行一条 testpmd 命令,支持注释(以 # 开头)。以下是一个 RSS 配置脚本示例:

# RSS 配置脚本:rss_setup.txt
port config 0 rss all
port config 1 rss all
show port 0 rss-hash
show port 1 rss-hash
start

启动方式:

./dpdk-testpmd -l 0-3 -n 4 -- -f rss_setup.txt --portmask=0x3 --rxq=4 --txq=4

脚本模式与交互模式的核心差异如下表:

对比维度 交互模式 (-i) 脚本模式 (-f)
适用场景 调试、探索、实时验证 自动化测试、批量部署、CI 集成
命令输入方式 键盘实时输入 从文本文件逐行读取
动态调整能力 强,可随时修改参数 弱,需修改脚本后重新启动
输出捕获 终端直接查看 可重定向到日志文件分析
典型启动参数 ./dpdk-testpmd ... -- -i ./dpdk-testpmd ... -- -f script.txt

2.4 常用调试命令速查

以下命令在后续 RSS 和流规则调试中会频繁使用,建议熟记:

  • show port info <port_id> — 查看端口能力,包括支持的 RSS 哈希类型、队列数上限
  • show port rss-hash <port_id> — 查看当前端口的 RSS 哈希配置
  • show rxq info <port_id> <queue_id> — 查看指定接收队列的详细配置(如 RSS 是否生效)
  • port config <port_id> rss <hash_types> — 配置 RSS 哈希类型(如 all、ip、tcp)
  • flow list <port_id> — 列出端口上所有已创建的流规则
  • set fwd <mode> — 设置转发模式(io、mac、rxonly 等)
常见陷阱: 在交互模式下修改 RSS 配置后,必须执行 stop 再 start 才能使新配置生效。流规则创建后,如果 RSS 配置发生变化,部分硬件需要重新创建流规则才能正确映射队列。

2.5 启动参数与队列映射的关联

testpmd 启动时的 --rxq 和 --txq 参数直接决定了后续 RSS 和流规则可用的队列资源。下图展示了启动参数如何影响最终的队列映射拓扑:

启动参数与队列映射拓扑 启动参数 → 队列资源 → 流规则映射 启动参数 --rxq=4 --txq=4 --nb-cores=2 --portmask=0x3 队列资源池 Port 0: RXQ 0-3 Port 0: TXQ 0-3 Port 1: RXQ 0-3 Port 1: TXQ 0-3 流规则映射结果 RSS 哈希 → 队列组 流规则 → 指定队列 队列 0-3 绑定到 core 1 队列 4-7 绑定到 core 2 核心原则:启动时分配的队列数量决定了流规则可操作的队列范围,超出范围的队列 ID 将被硬件拒绝

理解这一拓扑关系至关重要:流规则中的 queue 动作指定的队列 ID,必须在启动时 --rxq 声明的范围内。例如,若启动时 --rxq=4,则流规则只能指定 queue 0~3,指定 queue 4 将导致规则创建失败。