PCIe配置优化:提升系统性能的关键步骤
PCIe配置优化:提升系统性能的关键步骤
PCIe(Peripheral Component Interconnect Express)是现代计算机系统中用于连接高速外设的关键接口技术。其性能直接影响到系统的整体运行效率。本文将深入探讨PCIe的关键配置参数,包括宽度、速度、最大负载大小和最大读取请求等,并提供具体的验证和调整方法,帮助读者优化系统性能。
PCIe属性详解
PCIe宽度
PCIe宽度决定了设备可并行用于通信的PCIe通道数。宽度标记为xA,其中A是通道数(例如,x8表示8通道)。具体支持多少通道取决于厂商的设备和它们的型号。
要验证PCIe宽度,可以使用命令lspci
。例如,在PCI 04.00.0地址上安装了Mellanox适配器:
# lspci -s 04:00.0 -vvv | grep Width
LnkCap: Port #0, Speed 8GT/s, Width x8, ASPM not supported, Exit Latency L0s unlimited, L1 unlimited
LnkSta: Speed 8GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
如您所见,PCIe报告了已通信的设备功能(在LnkCap下),以及它们的当前状态(在LnkSta下),这是实际的PCIe设备属性。
PCIe速度
PCIe速度以GT/s为单位,代表“每秒十亿次交易”。与PCIe宽度一起确定了最大PCIe带宽(速度*宽度)。为了验证PCIe速度,可以使用命令lspci
。
# lspci -s 04:00.0 -vvv | grep Speed
LnkCap: Port #0, Speed 8GT/s, Width x8, ASPM not supported, Exit Latency L0s unlimited, L1 unlimited
LnkSta: Speed 8GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt
与宽度参数类似,设备能力和状态都会被报告。PCIe速度被标识为“代”,其中2.5GT/s称为“gen1”,5GT/s称为“gen2”,8GT/s称为“gen3”,16GT/s称为“gen4”。
注意:除了支持的速度之外,各代之间的主要区别在于数据包的编码开销。对于第1代和第2代,在PCIe上发送的每个数据包都有20%的PCIe标头开销。这在第3代中得到了改进,其中开销减少到1.5% (2/130)。有关更多详细信息,请参阅下面的实际PCIe带宽计算。
PCIe最大负载大小
PCIe最大负载大小确定PCIe数据包或PCIe MTU的最大大小(类似于网络协议)。这意味着较大的PCIe事务被分解为PCIe MTU大小的数据包。此参数仅由系统设置,取决于芯片组架构(例如x86_64、Power8、ARM等)。
您可以使用命令lspci
(在DevCtl下指定)查看PCIe最大负载大小。
lspci -s 04:00.0 -vvv | grep DevCtl: -C 2
DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited
ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+
DevCtl: Report errors: Correctable- Non-Fatal+ Fatal+ Unsupported-
RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+ FLReset-
MaxPayload 256 bytes, MaxReadReq 4096 bytes
PCIe最大读取请求
PCIe最大读取请求确定允许的最大PCIe读取请求。由于必须为传入响应准备缓冲区,PCIe设备通常会跟踪待处理的读取请求的数量。PCIe最大读取请求的大小可能会影响待处理请求的数量(当使用大于PCIe MTU的数据获取时)。
同样,使用命令lspci
来查询Max Read Request值。
# lspci -s 04:00.0 -vvv | grep MaxReadReq
MaxPayload 256 bytes, MaxReadReq 4096 bytes
与此处讨论的其他参数相反,可以在运行时使用命令setpci
更改PCIe最大读取请求:首先,查询该值以避免覆盖其他属性:
# setpci -s 04:00.0 68.w
5936
第一个数字是PCIe最大读取请求。设置选Max Read Request:
# setpci -s 04:00.0 68.w=2936
该值应使用命令lspci
更新:
# lspci -s 04:00.0 -vvv | grep MaxReadReq
MaxPayload 256 bytes, MaxReadReq 512 bytes
可接受的值为:0-128B、1-256B、2-512B、3-1024B、4-2048B和5-4096B。
计算PCIe带宽限制
如前所述,PCIe功能可能会影响网络适配器的性能。最好了解PCIe引入的带宽限制。下面是理论计算和几个例子。
最大可能的PCIe带宽是通过乘以PCIe宽度和速度来计算的。从这个数字中,我们减少了大约1Gb/s的纠错协议和PCIe标头开销。开销由PCIe编码(有关详细信息,请参阅PCIe速度)和PCIe MTU确定:
最大PCIe带宽 = 速度 * 宽度 * (1 - 编码) - 1Gb/s。
例如,具有x8宽度的第3代PCIe设备将被限制为:
最大PCIe带宽 = 8G * 8 * (1 - 2/130) - 1G = 64G * 0.985 - 1G = ~62Gb/s。
另一个示例 - 具有x16宽度的第2代PCIe设备将被限制为:
最大PCIe带宽 = 5G * 16 * (1 - 1/5) - 1G = 80G * 0.8 - 1G = ~63Gb/s。
注意:PCIe事务包括网络数据包有效负载和标头,因此在计算网络流量的PCIe限制时需要考虑它们。PCIe最大读取请求和最大负载大小可能会由于PCIe整体增加和相同负载的待处理事务而导致事务速率限制。