2. PCIe基础回顾

做PCIe DMA性能调优,第一步不是改驱动参数,而是把PCIe的“地基”重新对齐。DMA传输性能的上限,往往在拓扑、链路宽度、事务类型和配置空间枚举阶段就已经被决定。本节把与DMA调优最相关的五个基础点串成一条线:拓扑决定路径,分层协议决定开销,事务类型决定语义,配置空间决定能力,枚举流程决定系统实际看到的设备形态。

一、PCIe拓扑结构:DMA数据实际走的路

PCIe是点对点、基于交换的树形拓扑,不是共享总线。一个典型系统由Root Complex(RC)、Switch、Endpoint(EP)组成。RC连接CPU与内存子系统,是DMA访问内存的入口;Switch负责端口扩展与路由;EP是网卡、NVMe、GPU等真正发起或接收DMA的设备。

对DMA调优而言,关键结论有三点:第一,EP到RC之间的链路宽度和速率决定理论带宽,例如Gen3 x8约7.88GB/s,Gen4 x16约31.5GB/s;第二,跨Switch跳数越多,延迟越大,拥塞风险越高;第三,同一Switch下EP之间的P2P DMA不经过RC,路径更短,但需要ACS等配置配合。调优前应先确认设备挂载位置与链路能力。

# 查看PCIe链路速率与宽度
lspci -vv -s 01:00.0 | grep -E "LnkCap|LnkSta"
# 输出示例
LnkCap: Port #0, Speed 16GT/s, Width x16
LnkSta: Speed 16GT/s, Width x16

二、分层协议:DMA开销从哪里来

PCIe协议分为三层:事务层(Transaction Layer)、数据链路层(Data Link Layer)、物理层(Physical Layer)。事务层生成TLP(Transaction Layer Packet),承载读写请求与完成;数据链路层负责ACK/NAK、重传与CRC;物理层完成编码、串并转换与链路训练。

DMA性能调优主要关注事务层。每个TLP都有头部开销,包括序列号、地址、长度、属性等字段。Payload越大,头部占比越低,效率越高。因此增大Max Payload Size(MPS)和Max Read Request Size(MRRS)通常能提升大块DMA效率。但MPS受路径上所有设备的最小值限制,必须全链路一致才能生效。

调优提示:MPS与MRRS不是越大越好。过大可能增加延迟、占用缓冲,甚至触发某些设备的兼容性问题。建议以实际带宽测试为准,逐步调整。

三、事务类型:DMA读写语义与完成机制

PCIe事务类型主要包括:Memory Read、Memory Write、Configuration Read/Write、I/O Read/Write、Message。DMA场景中最核心的是Memory Read和Memory Write。

  • Memory Write(Posted):写请求不需要完成包,EP发出后即认为完成,效率高,适合大块数据搬运。
  • Memory Read(Non-Posted):读请求必须等待Completion with Data返回,存在往返延迟,受RC缓冲与并发度影响大。
  • Completion:完成包携带数据或状态,可能拆分,受RCB(Read Completion Boundary)影响。

因此,DMA读性能通常比写性能更难优化。提升读性能的手段包括:增大MRRS、增加未完成请求数量、使用多个队列并行、确保Completion不被过度拆分。

四、配置空间与枚举流程:系统如何“看见”设备

每个PCIe功能都有4KB配置空间,前256字节为PCI兼容区,后为PCIe扩展区。关键寄存器包括Vendor ID、Device ID、Class Code、BAR、Command、Status、Capabilities等。BAR决定设备寄存器或内存窗口映射到系统地址空间的位置。

枚举流程由RC发起:扫描总线号,读取Vendor ID判断设备是否存在,分配Bus号、Device号、Function号,配置BAR,设置Command寄存器使能Memory Space与Bus Master。Bus Master使能是DMA能工作的前提,若未置位,设备无法发起DMA。

# 查看配置空间关键字段
lspci -vv -s 01:00.0 | grep -E "Control:|Status:|Memory at|Capabilities"
# 关注 Bus Master 是否使能
Control: I/O- Mem+ BusMaster+ Serr+

五、核心要点对比清单

基础点关键对象对DMA性能的影响调优关注
拓扑结构RC / Switch / EP决定路径长度与理论带宽链路速率、宽度、跳数
分层协议TLP / DLLP / PHY头部开销影响有效带宽MPS、MRRS、Payload
事务类型Memory Read/Write读延迟高,写吞吐高并发度、Completion拆分
配置空间BAR / Command决定地址映射与使能Bus Master、Memory Space
枚举流程RC扫描与分配决定系统实际设备形态Bus号、BAR分配、资源冲突

六、案例与误区复盘

某NVMe盘在Gen4 x4下实测DMA读带宽只有2.1GB/s,远低于预期。排查发现:链路实际协商为Gen2 x4,原因是主板插槽与CPU通道共享;同时MPS被限制在128B,MRRS为256B。修正插槽位置并统一MPS到512B后,带宽提升到5.6GB/s。这个案例说明:拓扑与配置空间是性能的第一道门槛。

常见误区:只盯着驱动队列深度,却忽略链路协商结果与MPS/MRRS。若链路降速或Bus Master未使能,任何软件调优都无效。

复盘建议:调优前先执行“三查”——查链路状态、查配置空间、查枚举结果。把这三项作为基线,再进入驱动与队列层面的优化,才能避免在错误的地基上反复调整。

PCIe拓扑、分层协议与DMA路径关系图 CPU + Root Complex 内存控制器 / IOMMU 枚举发起者 PCIe Switch 端口扩展 / 路由 增加跳数与延迟 Endpoint: NVMe SSD Gen4 x4 / DMA读写 Endpoint: 网卡 Gen3 x8 / 多队列DMA 上行链路 下行端口 PCIe分层协议与TLP开销 事务层 TLP: 头 + Payload 数据链路层 ACK/NAK + CRC 物理层 编码 / 链路训练 TLP结构:Header(12~16B) + Data Payload(0~4096B) + ECRC/LCRC Payload越大,头部开销占比越低;MPS/MRRS决定单次传输效率 DMA数据路径:EP → Switch → RC → 内存