4. 性能指标定义

在 PCIe 读写性能基准测试中,最容易出现的错误不是工具用错,而是指标口径混淆。有人把带宽当成吞吐量,有人用 IOPS 比较不同块大小的设备,有人只看平均值忽略尾延迟,最终得出“A 卡比 B 卡快三倍”的错误结论。本节把七个核心指标拆开定义,并说明它们之间的换算关系与测试约束。

核心关系:带宽是链路理论能力,吞吐量是实际完成的数据搬运速率,IOPS 是每秒完成的 I/O 次数,延迟是单次请求的端到端时间,队列深度决定并发压力,有效载荷与开销共同决定“有效吞吐”占“线路吞吐”的比例。

一、七个指标的精确定义

带宽(Bandwidth)指 PCIe 链路在物理层可提供的理论最大数据传输能力,由链路宽度(x1/x4/x8/x16)和速率(Gen1~Gen5)共同决定。例如 PCIe 4.0 x16 的单向理论带宽约为 31.5 GB/s,这是编码后的线路速率,不是应用层可用速率。

吞吐量(Throughput)指单位时间内实际成功传输的有效数据量,通常以 GB/s 或 MB/s 表示。吞吐量永远小于等于带宽,差距来自协议开销、TLP 头、DLLP、ACK/NAK、流控信用等待以及主机侧瓶颈。

IOPS(Input/Output Operations Per Second)指每秒完成的 I/O 请求次数,强调“次数”而非“字节数”。IOPS 必须绑定块大小才有意义:4KB 随机读 100 万 IOPS 与 128KB 顺序读 100 万 IOPS 是完全不同的负载。

延迟(Latency)指一个请求从发出到收到完成响应的时间,单位通常是微秒或纳秒。延迟要区分平均值、P50、P99、P99.9 和最大值,尾延迟往往比平均值更能反映真实体验。

队列深度(Queue Depth, QD)指同时未完成的 I/O 请求数量。QD=1 是串行模型,延迟≈服务时间;QD 增大后 IOPS 上升但延迟也上升,直到设备内部并行度饱和。

有效载荷(Payload)指 TLP 中真正承载用户数据的字节数,PCIe 最大有效载荷由 MPS(Max Payload Size)决定,常见 128B、256B、512B。

开销(Overhead)包括 TLP 头、ECRC、序列号、DLLP、物理层编码以及 ACK 等非用户数据部分。开销直接压缩有效吞吐。

PCIe 性能指标关系与 TLP 有效载荷/开销分解 链路带宽 Gen × Lane 决定 PCIe 4.0 x16 ≈ 31.5 GB/s 实际吞吐量 有效数据 / 时间 受开销与瓶颈影响 通常为带宽 60%~85% IOPS 每秒 I/O 次数 必须绑定块大小 4K 随机读 1M IOPS 延迟 端到端响应时间 关注 P99 / P99.9 μs 级 队列深度 QD 并发未完成请求数 QD↑ → IOPS↑ 延迟↑ 核心换算关系 吞吐量 = IOPS × 块大小 IOPS = QD ÷ 平均延迟(Little's Law) TLP 有效载荷与开销分解(以 256B MPS 为例) TLP 头 16B ECRC 4B 有效载荷 Payload 256B(MPS 决定) LCRC 4B 序列号 2B 物理层编码 128b/130b 有效载荷占比 ≈ 256 / 282 ≈ 90.8% 开销越大,有效吞吐越低;MPS 越大,有效载荷占比越高,但受设备支持上限约束

二、指标之间的换算与约束

七个指标不是孤立的,它们通过两条基本公式耦合:

吞吐量 = IOPS × 块大小
IOPS   = 队列深度 ÷ 平均延迟        (Little's Law)

示例:QD=32,平均延迟 80μs
IOPS = 32 / 0.00008 = 400,000 IOPS
若块大小 4KB,则吞吐量 = 400,000 × 4KB ≈ 1.6 GB/s

这条公式解释了为什么“提高 QD 能提升 IOPS”:在延迟不变的前提下,并发越多,单位时间完成的请求越多。但延迟不会一直不变,当设备内部队列饱和后,继续加 QD 只会让延迟线性上升,IOPS 不再增长,这就是饱和点。

三、有效载荷与开销对吞吐量的影响

PCIe 传输的不是裸数据,而是 TLP 包。一个 TLP 由头、可选 ECRC、有效载荷、LCRC、序列号组成,再经过物理层 128b/130b 编码。以 256B MPS 为例,有效载荷占比约 90.8%;若 MPS 只有 128B,占比降到约 82%。这意味着同样链路带宽下,MPS 设置不同,实测吞吐量可能相差 8% 以上。

指标 单位 决定因素 测试注意点
带宽 GB/s Gen × Lane 理论值,不可直接当实测目标
吞吐量 GB/s 有效数据 / 时间 需说明块大小与读写方向
IOPS 次/秒 QD、延迟、块大小 必须绑定块大小与随机/顺序
延迟 μs / ns 路径、队列、设备处理 报告 P50/P99/P99.9,不只看均值
队列深度 个 测试工具配置 需扫描 QD 曲线找饱和点
有效载荷 Byte MPS 设置 确认两端设备支持的最大 MPS
开销 Byte / % TLP 头、编码、ACK 用有效载荷占比评估效率

四、案例:同一设备为何测出三种“带宽”

某 NVMe SSD 在 PCIe 4.0 x4 平台上测试,三份报告分别给出 6.8 GB/s、5.9 GB/s 和 3.2 GB/s。排查后发现:

  • 6.8 GB/s 是线路带宽,由 Gen4 x4 计算得出,属于理论值;
  • 5.9 GB/s 是顺序读吞吐量,块大小 128KB,QD=32,接近设备上限;
  • 3.2 GB/s 是4KB 随机读吞吐量,IOPS 约 78 万,受随机访问和开销影响明显下降。

三个数字都没有错,错的是把它们放在同一张对比表里。基准测试报告必须同时标注:链路配置、块大小、读写比例、队列深度、随机/顺序、有效载荷设置。

常见误区:用 IOPS 直接比较两块盘而不说明块大小;只看平均延迟忽略 P99;把理论带宽当作实测目标;忽略 MPS 与开销导致吞吐量差异;QD 只测一个点就下结论。

五、复盘:建立指标口径清单

每次测试前先固定以下口径,才能保证数据可复现、可对比:

  1. 链路:Gen 速率、Lane 宽度、MPS 设置;
  2. 负载:块大小、读写比例、随机/顺序、QD 扫描范围;
  3. 指标:吞吐量、IOPS、平均延迟、P99 延迟、有效载荷占比;
  4. 环境:CPU 主频、内存带宽、驱动版本、是否开启 IOMMU;
  5. 报告:明确区分理论带宽、实测吞吐量与有效吞吐。

把这七个指标的定义和换算关系固化下来,后续的 fio、perf、PCIe 协议分析才有统一的比较基准,也才能从“跑出一个数”升级为“解释这个数为什么是这样”。