一、PCIE 信息获取
lspci
是一个在 Linux 系统中使用的命令行工具,用于列出所有 PCI 总线及其连接的设备信息。PCI(Peripheral Component Interconnect)是一种用于连接计算机内部硬件设备的标准接口。lspci
命令通过读取系统的 PCI 配置空间来获取这些信息,并以用户友好的格式显示出来。
详细的使用方式可以通过man lspci查看。
以RTL8822CE设备为例进行以下讲解:
常用命令:
lspci -s 03:00.0 -vvv
lspci -s 03:00.0 -xxx
setpci
1.1 PCIe设备分配的资源
lspci -s 03:00.0 -vv | grep Region
PCIe Bar存储器空间操作:
busybox devmem 0xe0041000000
1.2 PCIe设备宽度与速度
pcie | 速度 | 编码格式 |
---|---|---|
PCIe 1.0 | 2.5GT/s | 8b/10b |
PCIe 2.0 | 5GT/s | 8b/10b |
PCIe 3.0 | 8GT/s | 128b/130b |
PCIe 4.0 | 16GT/s | 128b/130b |
PCIe 5.0 | 32GT/s | 128b/130b |
PCIe 6.0 | 64 GT/s | PAM4 |
吞吐量 = 传输速率 × 链路宽度 × 编码效率
- PCIe Gen4,8条lane的PCIe Device,编码是128b/130b,传输速率是16GT/s
吞吐量 = 16 * (128/130) * 8 = 126.03 Gbit/s = 15.754GB/s - RTL8822CE设备:Gen1、X1
吞吐量 = 2.5GT/s × 1 × 8/10 = 4 Gb/s ≈ 250MB/s
lspci -s 03:00.0 -vv |grep Width
1.3 PCIe Max Payload Size 和 Max Read Request
lspci -s 03:00.0 -vv | grep MaxPayload
二、PCIE 性能
PCIe(Peripheral Component Interconnect Express)中的Data Payload(数据负载)是指在PCIe传输层协议(Transaction Layer Protocol,TLP)中包含的实际数据部分。在PCIe通信中,TLP是用于在PCIe设备之间传输数据的基本单位,而Data Payload则是这些TLP中包含的实际要传输的数据。
Data Payload的影响因素:
- MPS(Max Payload Size)
- MRRS(Max Read Request Size)
- RCB(Read Completion Boundary)
前提条件是PCIe EP必须支持调整这些参数,并且PCIe 通信的两端经过的路径上的Switch节点也必须支持更大的值,否则也最终将协商为链路上设备支持的最大值中的最小的一个。
2.1 MPS(Max Payload Size)
MPS(Max Payload Size)是PCIe设备可以发送或接收的单个TLP中的最大数据负载量。MPS的大小会影响PCIe链路的带宽利用率和传输效率。较大的MPS可以减少TLP的数量,从而降低传输延迟并提高带宽利用率,但也会增加单个TLP的复杂性和处理时间。PCIe协议规定了MPS的最大值,但具体值可以由PCIe设备在初始化时通过协商确定。
2.1.1 MPS相关寄存器
在PCIe设备配置空间中,PCI Express Capability Structure包含Device Control寄存器和Device Capability寄存器。Device Capabilities寄存器记录了PCIe设备支持的MPS最大值,而Device Control寄存器保存了主机设置的MPS实际值。
-
Device Capabilities Register
-
Device Control Register
2.1.2 不同MPS值的影响
-
对传输效率的影响
- 较小MPS值:对于较大的数据量,如果MPS设置较小,那么数据只能被分割成多个TLP进行发送。这会增加传输开销,降低PCIe链路带宽的利用率。
- 较大MPS值:虽然较大的MPS值可以提高带宽利用率,但也会增加硬件处理数据包所需的内存和逻辑量。此外,如果MPS值设置得过大,而链路中某些设备的MPS能力值较低,那么实际传输时仍会受到这些设备的限制。
-
对实时性的影响
MPS参数的大小与实时性成反比。MPS越大,某个Function占用总线的时间可能越长,导致实时性降低。因此,对于实时性要求较高的PCIe设备,MPS参数不应设置过大。 -
对硬件设计的影响
在实际硬件设计中,MPS值的选择需要考虑到设备的处理能力、内存资源以及与其他设备的兼容性等因素。例如,在某些情况下,为了优化传输效率,可能会选择较大的MPS值;但在其他情况下,为了兼容较低能力的设备或满足实时性要求,可能会选择较小的MPS值。 -
对系统性能的影响
在系统中,如果存在多个PCIe设备,并且它们的MPS值不同,那么系统性能可能会受到影响。为了平衡多个PCIe设备之间的吞吐量并避免系统带宽被某些设备霸占,操作系统层面的PCIe驱动可能会配置MPS值。此外,不合理的MPS设置还可能导致数据通信时上报Malformed TLP
错误。
综上所述,MPS值在PCIe总线中起着至关重要的作用。不同的MPS值会对传输效率、实时性、硬件设计以及系统性能等方面产生影响。因此,在选择MPS值时需要根据具体的应用场景和设备特性进行综合考虑。
2.1.3 系统下修改MPS值
通过lspci -s 03:00.0 -v
得知扩展空间地址偏移是0x70,通过命令 setpci
修改寄存器。如果没有setpci
命令需要进行安装,命令为:sudo apt-get install pciutils
-
读取Device Capabilities Register
setpci -s 03:00.0 74.w
其中[2:0] = 0x0 ---------------------000b 128 bytes max payload size
-
读取Device Control Register
setpci -s 03:00.0 78.w
其中[7:5] = 0x0 ---------------------000b 128 bytes MPS
RTL88x2ce设备 Max Payload Size = 128 bytes ,主机设置的MPS实际值也是128 bytes
- 修改Device Control Register
假如想修改MPS实际值,改为:256 bytes,将[7:5] = 0x1
setpci -s 03:00.0 78.w=0x5030
2.2 MRRS(Max Read Request Size)
MRRS代表Max Read Request Size,即最大读请求大小。这是PCIe总线中的一个关键参数,它定义了PCIe设备在发起存储器读请求时,一次性能从目标设备中读取的最大数据量。
2.2.1 MRRS相关寄存器
在PCIe设备的配置空间中,PCI Express Capability Structure的Device Control寄存器用于设置和查询MRRS的值。通过修改该寄存器的相应位段,可以动态调整MRRS的大小,以满足不同应用场景下的性能需求。
2.2.2 MRRS的作用与影响
- 数据传输效率
MRRS限制了PCIe设备在单次读请求中能够获取的数据长度。若读请求的数据量超出了MRRS的限制,设备则需将请求拆分为多个较小的读请求TLP(Transaction Layer Packet)进行发送。因此,合理设置MRRS可以优化数据传输效率,减少拆分请求的开销。 - 系统性能
MRRS的设置对系统整体性能有重要影响。通过调整MRRS,可以最大化利用PCIe总线的带宽,减少读请求的次数和延迟,从而提升数据读取速度和系统吞吐量。 - 应用场景
在不同的应用场景中对MRRS的需求可能有所不同。- 在高性能存储系统中,通过合理设置MRRS可以提升SSD的读取效率和系统整体性能;
- 在基于PCIe的网络接口卡(NIC)中,优化MRRS可以更有效地利用网络资源,降低数据传输延迟;
- 在图形处理领域,精细调整MRRS可以确保图形数据的快速传输,提升图形处理性能。
综上所述,MRRS作为PCIe总线中的关键参数,在数据传输和系统性能优化中发挥着重要作用。通过合理设置和管理MRRS,可以提升系统整体性能,满足高性能计算、数据存储、网络通信等领域的需求。
2.2.3 系统下修改MRRS值
- 读取Device Control Register
setpci -s 03:00.0 78.w
其中[14:12] = 0x5 ---------------------101b 4096 bytes maximum Read Request size
- 修改Device Control Register
假如想修改MRRS实际值,改为:2048 bytes,将[14:12] = 0x4
2.3 RCB(Read Completion Boundary)
RCB(Read Completion Boundary,读取完成边界)是PCI Express(PCIe)总线中的一个重要参数,它指定了在完成PCIe内存读取请求时可以返回的数据包的最大对齐字节边界。它的作用确保读取响应(Completion)数据包中包含的数据不会跨过特定的对齐边界,从而维持PCIe系统的稳定性和数据完整性,并优化数据在不同的设备间的高效传输。
2.3.1 RCB相关寄存器
RCB的值通常可配置为64字节或128字节。在PCIe规范中,Root Complex(RC)的RCB可以为64字节或128字节,默认值为64字节;而Endpoint(EP)、Bridge、Switch等其他设备的RCB只能为128字节。
RCB的值可以通过PCIe配置空间中的相关寄存器进行设置。例如,在PCI_EXPRESS_LINK_CONTROL_REGISTER寄存器中,有一个位用于指示RCB的值。如果该位为清除位,则RCB为64字节;如果设置了该位,则RCB为128字节。
2.3.2 RCB对数据传输的影响
- 64字节RCB
较小的RCB设置会导致更频繁的数据包传输。这在某些情况下可能提高小数据块传输的效率,因为对于需要低延迟的应用,较小的数据包可能意味着更快的响应时间。 - 128字节RCB
较大的RCB设置减少了数据包传输的频率,有利于大量数据的传输效率。在数据吞吐量要求较高的应用场合,较大的RCB可以减少系统的总体开销,提高数据传输速度。
2.2.3 系统下修改RCB值
- 修改Link Control Register
假如想修改RCB值,改为:128 bytes,将[3] = 0x1
setpci -s 03:00.0 80.w=0048
如何选择合适的RCB值
- RC(Root Complex)的RCB可以为64字节或128字节,默认值为64字节。
- EP(Endpoint)、Bridge、Switch等其他设备的RCB固定为128字节。
- 根据系统需求和设备特性,选择合适的RCB值。
比如:对于需要低延迟的应用,较小的RCB值(如64字节)可能更合适;而对于数据吞吐量要求较高的应用,较大的RCB值(如128字节)可能更有利于提高传输效率。