3. PCIe协议关键术语
做PCIe吞吐测试,第一步不是急着跑带宽,而是先把协议里的“名词地图”建立起来。因为测试中看到的每一个数字、每一次报错、每一段抓包记录,背后都对应着特定的协议对象。如果分不清TLP和DLLP,就可能把事务层的问题误判成链路层问题;如果不理解Lane与Link的区别,就无法解释为什么x4链路协商成了x2;如果不清楚Root Complex、Switch、Endpoint的角色,就不知道数据到底经过了哪些跳数。本节把这些核心术语放在一张拓扑与层次结合的图中,帮助你在后续测试中快速定位问题层级。
一、从拓扑角色理解:RC、Switch、Endpoint
PCIe是一棵树形拓扑,根在CPU侧,叶子是功能设备。三个关键角色决定了数据流向和测试路径:
- Root Complex(RC,根复合体):位于CPU与PCIe拓扑之间,是主机侧的“总入口”。它产生配置空间访问、发起内存读写请求,并管理中断。吞吐测试中,RC侧的DMA引擎、内存带宽、RC内部端口数量都会直接影响实测值。
- Endpoint(EP,端点):真正的功能设备,如NVMe SSD、网卡、GPU。它是事务的最终发起者或完成者。测试时EP的DMA能力、队列深度、最大载荷大小(MPS)是关键参数。
- Switch(交换机):用于扩展拓扑,把一个上游端口扩展为多个下游端口。Switch内部有虚拟PCI桥,会引入额外延迟和跳数。多卡测试中,数据经过Switch时吞吐可能下降,需要单独测量每一跳。
二、从协议层次理解:TLP、DLLP、Ordered Set
PCIe协议分为事务层、数据链路层和物理层。三层各自有独立的“语言”,测试中必须区分:
| 术语 | 所属层次 | 主要作用 | 测试关注点 |
|---|---|---|---|
| TLP(Transaction Layer Packet) | 事务层 | 承载内存读写、配置、消息等事务 | MPS、Max Read Request、Tag数量、完成超时 |
| DLLP(Data Link Layer Packet) | 数据链路层 | ACK/NAK、流控信用、电源管理 | 重传次数、信用更新、链路稳定性 |
| Ordered Set | 物理层 | 链路训练、时钟补偿、电气空闲退出 | 链路速率、宽度协商、误码率 |
TLP是吞吐测试的主角,因为它携带真实数据。DLLP不携带用户数据,但它决定TLP能否可靠送达;如果DLLP频繁NAK,TLP就会重传,有效吞吐下降。Ordered Set则发生在链路训练阶段,决定链路能否以预期速率和宽度建立。三者关系可以用一句话概括:Ordered Set建链路,DLLP保可靠,TLP传数据。
三、Lane与Link:宽度和速率的基础
Lane(通道)是物理层的最小双向传输单元,一对差分线组成一个Lane。PCIe链路可以由1、2、4、8、16个Lane组成,分别记为x1、x2、x4、x8、x16。Link(链路)是两个PCIe端口之间的逻辑连接,由若干Lane绑定而成。Link的带宽等于单Lane速率乘以Lane数量。
例如,PCIe 3.0单Lane速率为8 GT/s,编码效率约98.5%,x4链路的理论单向带宽约为3.94 GB/s。测试中如果发现x4设备只跑出x2的带宽,首先要检查Link Status寄存器中的协商宽度,而不是怀疑EP性能。
# 查看链路宽度和速率(Linux示例)
lspci -vv -s 01:00.0 | grep -E "LnkCap|LnkSta"
# 输出示例:
# LnkCap: Port #0, Speed 8GT/s, Width x4
# LnkSta: Speed 8GT/s, Width x2 (downgraded)
四、核心原理:数据从RC到EP的完整路径
以一次NVMe读请求为例,数据路径如下:RC发起内存读请求TLP,经过Root Port进入Switch上游端口,Switch根据地址路由到下游端口,最终到达EP。EP返回Completion TLP,携带数据回到RC。整个过程由DLLP保证每一跳的可靠传输,由Ordered Set维持物理链路同步。吞吐测试测量的就是这条路径上单位时间内成功传输的有效数据量。
五、案例场景:一次吞吐不达标的排查
某服务器上NVMe SSD标称PCIe 4.0 x4,实测顺序读只有1.8 GB/s,远低于预期。排查步骤:
- 用
lspci -vv查看LnkSta,发现协商宽度为x2,速率为16 GT/s。说明物理层Link宽度不足,问题在Ordered Set训练阶段或插槽/金手指。 - 检查主板插槽和SSD金手指,发现SSD插入了一个共享x4的M.2插槽,实际只分配了x2。更换到独立x4插槽后,LnkSta变为x4。
- 再次测试,吞吐提升到约6.5 GB/s。继续检查TLP层,发现MPS为128字节,而EP支持256字节。调整MPS后,吞吐进一步提升到约6.9 GB/s。
- 最后观察DLLP重传计数,确认没有异常NAK。至此,吞吐达标。
六、误区与复盘
- 误区一:把TLP当DLLP。抓包工具中TLP和DLLP的格式不同,DLLP没有事务层头。如果误把DLLP流控信用当成数据吞吐,会得出错误结论。
- 误区二:忽略Ordered Set。链路训练失败时,Ordered Set会反复发送。测试前应确认链路已进入L0状态,否则后续TLP测试没有意义。
- 误区三:只看Link不看Lane。一个x8 Link可能由两个x4 Link聚合,测试报告要明确是单Link还是多Link聚合带宽。
- 误区四:混淆RC和EP的职责。RC发起请求,EP响应。吞吐测试中如果RC侧DMA引擎不足,EP再快也无法发挥。
复盘时建议建立一张“术语-层次-测试点”对照表:TLP对应事务层,关注MPS和Tag;DLLP对应链路层,关注重传和信用;Ordered Set对应物理层,关注速率和宽度;Lane和Link是物理连接的基础;RC、Switch、EP是拓扑角色。把这五组概念记牢,后续的吞吐测试、抓包分析和故障定位都会事半功倍。