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受路径上所有设备的最小值限制,必须全链路一致才能生效。
三、事务类型: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。这个案例说明:拓扑与配置空间是性能的第一道门槛。
复盘建议:调优前先执行“三查”——查链路状态、查配置空间、查枚举结果。把这三项作为基线,再进入驱动与队列层面的优化,才能避免在错误的地基上反复调整。