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 链路宽度/速率是否降级,以及内存通道是否未开启交错模式。
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%
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)并手动管理同步。
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 延迟敏感)确定主要优化目标。