PCIe 中的 MRRS、MPS 和 RCB

PCIe 中的 MRRSMPS 和 RCB: 定义、作用、联系、区别、配置位置与作用对象

想象一下,PCIe 总线是一条多车道的高速公路系统,数据包(TLP)就是在上面行驶的车辆,而数据本身则是车辆运输的货物。我们的目标是让这个高速公路系统的通行效率达到最高,避免堵车和资源浪费。

1. MPS - 最大有效载荷大小 (Maximum Payload Size)

  • 生动定义: 一辆货车的最大载货容量。它规定了每一辆单独货车(TLP)的货厢最多能装多少货物(数据)。
  • 技术定义: 一个 事务层数据包 (TLP) 的“数据部分”(即 Payload)的最大允许大小。
  • 作用: 决定了发送方一次性能将多少有效数据封装到一个TLP包中。MPS过小会导致需要更多数量的TLP来传输大量数据,每个TLP的包头(开销)会造成总线带宽浪费。MPS过大会对接收端的缓冲区大小提出更高要求。因此,链路两端必须在支持范围内协商出一个最优值。
  • 配置位置
  1. 设备能力 (只读): 位于 PCIe 扩展配置空间的 Device Capabilities 寄存器的 Max_Payload_Size_Supported 字段。告诉你该设备硬件最大能支持多大的货车。
  2. 当前设置 (可读写): 位于 PCIe 扩展配置空间的 Device Control 寄存器的 Max_Payload_Size 字段。在链路训练时,Root Complex (RC) 会选择一个所有下游设备都支持的最小值,写入此处。一条链路上的所有设备,此值最终相同。

  • 作用于哪些 TLP: MPS 限制所有携带数据载荷 (Payload) 的 TLP。主要包括:
    • 存储器写请求 (MWr, Memory Write Request): 这是最直接受影响的TLP。
    • 带有数据的完成包 (CplD, Completion with Data): 响应读请求而返回的数据包。
    • 消息信号中断 (MSI, Message Signaled Interrupt): 本质上是一种带数据的写请求TLP。
    • 不携带数据的TLP不受影响,例如读请求 (MRd)、配置读写 (CfgRd/CfgWr)、无数据的完成包 (Cpl) 等。

  • 查看命令 (Linux)
    lspci -vvv -s <BDF> | grep -i "maxpayload"
  • # 示例输出:
  • # MaxPayload 128 bytes, MaxReadReq 512 bytes
  • # DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <4us, L1 <64us

2. MRRS - 最大读请求大小 (Maximum Read Request Size)

  • 生动定义: 一张取货单上一次能申请的最大货物量。它限制了采购员(RC/CPU)一次性能申请多少货物,但并不意味着对方会一次性送来。
  • 技术定义: 一个 读请求 TLP 所能请求的最大数据量
  • 作用: 当 RC/CPU 需要从设备读取数据时,会发出“读请求”TLP。MRRS 限制了此请求包中“长度”字段的最大值。如果 MRRS 设置过小,而需要读取的数据很大,就需要拆分成多个读请求,每个请求都需要等待对方回应,大大增加了延迟,严重制约读取性能。因此,将其设置为设备和支持的最大值(如4096B)是性能调优的关键步骤
  • 配置位置
    • 当前设置 (可读写): 位于 PCIe 扩展配置空间的 Device Control 寄存器的 Max_Read_Request_Size 字段。此值由系统软件 (BIOS 或操作系统驱动程序) 在初始化时为每个设备独立配置,彼此可以不同。

  • 作用于哪些 TLP: MRRS 仅作用于
    • 存储器读请求 (MRd, Memory Read Request)
    • 配置读请求 (CfgRd, Configuration Read Request)
    • 不直接限制对方返回数据的方式,对方返回数据时遵守的是 MPS 和 RCB 规则。

  • 查看命令 (Linux)
    lspci -vvv -s <BDF> | grep -i "maxread"
  • # 示例输出:
  • # MaxPayload 128 bytes, MaxReadReq 512 bytes

3. RCB - 接收端缓存边界 (Receive Completion Boundary)

  • 生动定义: 仓库卸货平台的储物箱规格和摆放规则。它要求送来的货物必须从每个储物箱的起始位置开始整齐堆放,以便高效管理。
  • 技术定义: 一个固定的硬件设计特性,规定了接收端缓冲区(通常与CPU缓存行对齐)的大小。PCIe协议要求,任何完成包 (Completion TLP) 的起始地址必须对齐到RCB的整数倍上。
  • 作用: 优化接收端(通常是CPU/RC)处理数据的方式。如果数据包起始地址对齐在缓存行起始处,CPU可以最高效地写入数据。如果不对齐,一个数据包可能横跨两个缓存行,需要两次内存操作,降低效率。
  • 配置位置
    • 硬件固定: 对于 Root Complex (RC),RCB 的值由 CPU 和芯片组设计决定,通常是 64 字节(与常见CPU缓存行大小一致)。这是一个硬件特性,通常对软件不可见或只读。
    • 链路提示: 在 PCIe 链路的两个端口之间的 Link Control 2 寄存器中,有一个 Receive Completion Boundary (RCB) 位,用于向上游设备建议 RCB 的值(0 表示 64B,1 表示 128B)。设备会遵循此建议来组织其发出的完成包。

  • 作用于哪些 TLP: RCB 仅作用于
    • 带有数据的完成包 (CplD, Completion with Data): 这是最主要的作用对象。
    • 它影响了设备在组织Completion TLP时对数据的拆分策略,即使数据量小于MPS,为了满足地址对齐要求,也可能被拆成更小的包。

  • 查看命令 (Linux): 查看RCB较为困难,通常需要查阅芯片组文档。有时可通过以下命令窥见链路建议:
    lspci -vvv -s <BDF> | grep -A 5 -i "lnkctl2"

三者的联系与区别

特性全称层级本质关注方向
MPSMaximum Payload Size事务层链路两端协商的结果发送数据包的大小可变(128B-4096B)
MRRSMaximum Read Request Size事务层由软件为设备设置的值请求数据的大小可变(128B-4096B)
RCBReceive Completion Boundary物理/链路层硬件固定的设计特性接收数据时的对齐固定(通常64B/128B)

相互作用与联系:

1. MRRS 与 MPS 的配合

    • 当CPU发出一个大的读请求(大小为MRRS)后,设备在返回数据时,会将这个大数据拆分成若干个TLP返回,每个TLP的Payload大小不能超过MPS
    • 例子: MRRS = 2048B, MPS = 512B。一个读请求会被拆成4个Completion TLP返回,每个包带512B数据。

2. MPS 与 RCB 的配合

    • 虽然MPS可以很大,但设备在组织Completion TLP时,其起始地址必须遵守RCB对齐规则。这有时会导致一个大的有效载荷被拆成更小的包来满足对齐要求,即使它没有超过MPS。
    • 例子: 需要返回的数据从地址0x100开始(0x100是64字节对齐吗?0x100除以64=4,正好是整数倍,是对齐的)。但如果RCB=128B,而0x100除以128=2,也是对齐的。如果地址是0x110,除以128不是整数,就不满足128B的RCB对齐。设备可能需要做一些处理来满足这个对齐要求。

3. 性能调优

    • 理想情况: MRRS >= MPS >= RCB。并且MPS是RCB的整数倍。
    • 这样能确保大的读请求不会被拆分成过多的子请求,同时返回的数据包既能充分利用链路带宽,又能保证接收端处理的高效性。
    • 如果MRRS设置过低,会成为系统读性能的瓶颈。在PCIe设备(尤其是NVMe SSD)调优中,将MRRS设置为最大值(如4096)是提升性能的关键步骤之一。

三者的协同工作流程:一个完整的比喻

假设你(CPU)想从大型仓库(NVMe SSD)调取一批货物(数据)。

  1. MRRS (你的采购权限): 你查看公司规定,你的权限(MRRS)是一次最多申请 4096件 货物。你于是开出一张最大的“取货单”(读请求TLP),申请4096件货。
  2. MPS (仓库的货车容量): 仓库收到你的取货单,但他们有自己的规定:一辆货车最多只能装 1024件 货物(MPS)。于是,他们需要把你的大订单拆成4次运输,安排 4辆货车4个CplD TLP)来送货,每辆车装1024件。
  3. RCB (你的卸货平台规则): 你的卸货平台(CPU缓存)有严格规定:所有货物必须从 每个64号储物格的开头RCB = 64B)开始摆放。仓库工人在装车时(组织CplD TLP)就知道这个规矩。他们会检查每批1024件货物的起始地址,确保其符合你的对齐要求。如果某批货的地址不对齐,他们甚至可能把这批货再拆成更小的几批(例如,先送64件对齐的,再送960件),以确保每一辆货车到达时,你都能最高效地卸货。

最终:通过MRRS、MPS、RCB三者的协同,这次大规模的数据传输得以高效、有序地完成。任何一个环节配置不当,都可能成为性能瓶颈。

总结与对比表格

特性全称比喻作用对象配置位置本质
MPSMaximum Payload Size货车容量带Payload的TLP (MWr, CplD, MSI)Device Capabilities (能力)
Device Control (当前设置)
链路协商的发送规则
MRRSMaximum Read Request Size取货单权限读请求TLP (MRd, CfgRd)Device Control (当前设置)软件设置的请求规则
RCBReceive Completion Boundary卸货平台规则完成包TLP (CplD)硬件固定 / Link Control 2 (建议)硬件固定的接收对齐特性

理解这三者,尤其是它们的作用对象和配置位置,对于诊断和优化PCIe设备(如高性能SSD、GPU和网卡)的性能至关重要。

PCIe总线架构中,Endpoint (EP) 设备的 **Max Read Request Size (MRRS)** **Max Payload Size (MPS)** 是两个关键的性能参数,它们分别控制设备能够发起的最大读请求数据量设备能够接收的最大数据包有效载荷大小。当这两个参数配置不一致时,可能会导致性能下降或系统稳定性问题。 ### MPS(Max Payload Size)详解 MPS字段定义了设备可以接收的TLP(Transaction Layer Packet)中有效载荷的最大大小。其值在设备控制寄存器(Device Control Register)中设置,具体取值如下: ``` 000: 128 Bytes 001: 256 Bytes 010: 512 Bytes 011: 1024 Bytes 100: 2048 Bytes 101: 4096 Bytes ``` 设备在发送TLP时,必须确保其Payload不超过接收端设备的MPS设置,否则会导致数据包被拒绝或丢弃[^3]。 ### MRRS(Max Read Request Size)详解 MRRS决定了设备能够发起的最大读请求数据量。其值通常也配置在设备控制寄存器中,表示每次读请求的最大数据长度。例如,如果MRRS设置为2048字节,设备最多可以发起一次读取2048字节的请求。 ### MRRSMPS不一致的潜在问题 1. **MRRS > MPS**:如果设备发起的读请求长度大于其自身或目标设备的MPS,会导致TLP分片(TLP Splitting),即一个大的读请求被拆分成多个TLP发送。这会增加传输延迟系统开销,降低性能。 2. **MRRS < MPS**:虽然不会导致TLP拆分,但可能会限制设备的数据读取效率,尤其是在需要高吞吐量的应用场景下。 ### 解决MRRSMPS不一致的操作建议 #### 1. **确保MRRS不超过MPS** 通常建议将MRRS设置为不超过MPS的值,以避免TLP拆分。例如,如果MPS设置为512字节,则MRRS不应超过512字节。 #### 2. **路径协商机制** PCIe链路在初始化阶段会进行链路训练能力协商。在此过程中,Root Complex (RC) 会收集所有设备的能力信息,并为整个路径选择一个统一的MPS值,通常选择路径中最小的MPS值作为最终配置值[^2]。因此,在系统设计中,应确保EP设备的MPS配置与系统整体一致。 #### 3. **设备驱动配置** 在设备驱动中,可以通过访问PCIe配置空间的Device Control Register来设置MRRSMPS。例如,使用`pci_write_config_word`函数来配置: ```c // 示例:设置MPS为512字节,MRRS为512字节 u16 ctrl; pci_read_config_word(pdev, pos, &ctrl); ctrl = (ctrl & ~0x0700) | (0x02 << 8); // MPS = 512B (0x02) ctrl = (ctrl & ~0x00E0) | (0x02 << 5); // MRRS = 512B (0x02) pci_write_config_word(pdev, pos, ctrl); ``` #### 4. **BIOS/UEFI配置** 在某些平台上,MPSMRRS的设置可以在BIOS/UEFI中进行全局配置。系统启动时,BIOS会根据硬件能力设置这些参数,确保所有设备的兼容性。 #### 5. **性能调优** 在高性能应用场景(如NVMe SSD)中,较大的MPSMRRS可以提升吞吐量。但需权衡延迟缓冲区资源占用。建议通过实际性能测试来选择最优配置。 ### 总结 MRRSMPS的合理配置对PCIe设备的性能至关重要。MRRS不应超过MPS,且整个链路上的MPS设置应以最低能力设备为准。通过驱动、BIOS配置以及链路协商机制,可以有效解决MRRSMPS不一致的问题,提升系统性能稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值