3. DMA 性能指标:带宽、延迟、传输效率、CPU 卸载率、Cache 一致性开销

DMA(Direct Memory Access)的性能直接影响高速外设(如网卡、NVMe SSD、GPU)与内存之间的数据搬运效率。评估 DMA 性能不能只看“快不快”,需要从带宽、延迟、传输效率、CPU 卸载率以及 Cache 一致性开销五个维度进行量化分析。以下逐一拆解每个指标的定义、测量方法及优化方向。

3.1 带宽(Bandwidth)

DMA 带宽指单位时间内 DMA 引擎能够搬运的数据量,通常以 GB/s 或 Gbps 为单位。它是衡量 DMA 吞吐能力的首要指标。

  • 理论带宽:由总线协议(如 PCIe 4.0 x16 单向约 32 GB/s)和 DMA 控制器时钟频率决定。
  • 有效带宽:实际测量值,受内存控制器瓶颈、总线竞争、DMA 描述符处理开销等因素影响。
  • 测量方法:使用 perf stat -e dma:* 或专用微基准测试工具(如 dmabench)统计传输总字节数与耗时。
优化提示: 当有效带宽远低于理论带宽时,优先检查 PCIe 链路宽度/速率是否降级,以及内存通道是否未开启交错模式。
DMA 带宽对比:理论 vs 有效 理论带宽 32 GB/s 有效带宽 22 GB/s 损耗 ~31% 瓶颈因素 • 内存控制器 • 总线竞争 • 描述符开销

3.2 延迟(Latency)

DMA 延迟指从 CPU 发起 DMA 请求(如写描述符、触发 doorbell)到数据传输完成并产生中断之间的时间。低延迟对实时性要求高的场景(如存储 NVMe、网络 RDMA)至关重要。

延迟类型 典型值范围 影响因素
描述符提交延迟 100 ns – 1 µs MMIO 写操作、总线事务
DMA 传输延迟 1 µs – 10 µs 内存访问延迟、PCIe TLP 大小
中断上报延迟 1 µs – 5 µs 中断控制器、CPU 中断响应
注意: 延迟测量需要高精度时间戳(如 rdtsc 或 PMU 周期计数器),避免被调度或中断干扰。使用 perf record -e dma:*/period=1000/ 可以采样 DMA 事件的时间戳。

3.3 传输效率(Transfer Efficiency)

传输效率定义为 有效数据字节数 / 总总线传输字节数。DMA 传输中,协议开销(如 PCIe TLP 头、CRC、内存对齐填充)会降低效率。

  • 理想情况:大块连续传输(如 4 KB 以上),效率接近 95% 以上。
  • 低效场景:小粒度分散传输(如 64 字节),效率可能低于 50%。
  • 优化手段:合并描述符、使用 SG(Scatter-Gather)列表、调整 DMA 引擎的 burst size。
计算公式: 传输效率 = (Payload 字节数) / (Payload 字节数 + 协议头字节数 + 填充字节数) × 100%
不同传输粒度下的效率对比 64B: 42% 256B: 68% 4KB: 95% 0% 50% 100% 效率提升关键 • 增大 burst size • 合并小描述符 • 地址对齐

3.4 CPU 卸载率(CPU Offload Ratio)

CPU 卸载率衡量 DMA 在多大程度上替代了 CPU 的数据搬运工作。计算公式为:

CPU 卸载率 = (1 - (CPU 参与 DMA 管理的时间 / 总传输时间)) × 100%
  • 高卸载率(> 90%):CPU 仅负责提交描述符和响应中断,数据搬运完全由 DMA 引擎完成。
  • 低卸载率(< 50%):CPU 频繁参与数据拷贝(如 PIO 模式)、轮询状态寄存器,导致 DMA 优势丧失。
  • 测量方法:使用 perf stat -e cycles,instructions,dma:* 对比有无 DMA 时的 CPU 占用率。
实践建议: 在网卡驱动中启用 NAPI 和 GRO 可以进一步降低 CPU 参与数据包处理的比例,提升卸载率。

3.5 Cache 一致性开销(Cache Coherency Overhead)

DMA 直接访问内存,而 CPU 可能已经在 Cache 中缓存了同一块数据。当 DMA 写入内存后,CPU 必须保证 Cache 与内存一致,这会产生额外的 snoop 或 invalidation 开销。

一致性协议 开销来源 典型影响
snoop 过滤 DMA 写操作触发总线 snoop,检查所有 CPU 核的 Cache 增加 10–30% 内存访问延迟
Cache 行失效 DMA 写入后,CPU 下次访问需重新从内存加载 Cache miss 率上升
非一致性 DMA 使用 dma_alloc_coherent 分配非 Cache 内存 避免 snoop,但 CPU 访问该区域变慢
关键权衡: 使用一致性 DMA 内存(dma_alloc_coherent)消除了 Cache 一致性问题,但 CPU 访问该内存时无法利用 Cache,性能可能下降。对于 CPU 频繁读写的共享数据,建议使用流式 DMA 映射(dma_map_single)并手动管理同步。
DMA 与 Cache 一致性交互开销 CPU Core 0 CPU Core 1 L1/L2 Cache 主内存 DMA 设备 snoop 开销项 • snoop 延迟 • Cache 失效 • 总线竞争 • 同步屏障 • 内存屏障

3.6 五维指标综合评估表

以下表格汇总了五个 DMA 性能指标的定义、测量工具及优化方向,便于在实际调优中快速对照。

指标 定义 测量工具/方法 优化方向
带宽 单位时间传输字节数 perf stat -e dma:*、dmabench 增大 burst size、开启内存交错
延迟 从请求到完成的时间 rdtsc、PMU 周期计数 减少 MMIO 次数、使用中断合并
传输效率 有效数据 / 总线总传输 PCIe 计数器、逻辑分析仪 合并描述符、地址对齐
CPU 卸载率 1 - (CPU 管理时间 / 总时间) perf stat -e cycles,instructions 启用 NAPI、使用硬件队列
Cache 一致性开销 snoop 与失效导致的额外延迟 perf stat -e cache-misses 选择合适 DMA 映射类型、手动同步
核心原则: 五个指标相互关联,优化时需权衡。例如,提高带宽可能增加 Cache 一致性开销;降低延迟可能牺牲传输效率。建议根据业务场景(吞吐优先 vs 延迟敏感)确定主要优化目标。