3、吞吐测试基础:吞吐量定义、测试指标、常用测试工具与场景设计
在 DMA 传输优化中,吞吐测试是判断优化是否有效的核心手段。很多工程师在调优时只关注“传输完成时间”或“CPU 占用率”,却忽略了吞吐量本身是一个受多因素耦合影响的系统指标。理解吞吐量的定义、掌握正确的测试指标、选择合适的工具并设计贴近真实业务的场景,是后续所有 DMA 优化工作的前提。
一、吞吐量的定义与计算模型
吞吐量(Throughput)指单位时间内系统成功传输的有效数据量,通常用 MB/s 或 GB/s 表示。在 DMA 场景中,必须区分三个容易混淆的概念:
- 理论峰值带宽:由总线位宽和时钟频率决定,例如 PCIe Gen3 x8 理论带宽约 7.877 GB/s。
- 有效吞吐量:扣除协议开销、握手、重传后实际传输的用户数据速率。
- 应用层吞吐量:经过驱动、文件系统、内存拷贝后,应用真正拿到的数据速率。
三者之间往往存在数倍差距。DMA 优化的目标,就是缩小“应用层吞吐量”与“理论峰值带宽”之间的差距。其基本计算关系为:
有效吞吐量 = 传输数据总量 / 传输总耗时
传输总耗时 = 启动开销 + 数据搬运时间 + 中断/完成处理时间
数据搬运时间 = 数据量 / 实际总线带宽
关键认知:当数据量较小时,启动开销和中断处理时间占比高,吞吐量上不去;当数据量足够大时,吞吐量趋近于总线实际带宽。因此测试必须覆盖不同数据块大小。
二、吞吐测试的核心指标
仅看一个“MB/s”数字远远不够。完整的吞吐测试应同时采集以下指标,才能定位瓶颈:
| 指标 | 含义 | 典型观测方式 |
|---|---|---|
| 平均吞吐量 | 总数据量除以总时间 | 测试工具汇总输出 |
| 瞬时吞吐量 | 按时间窗口统计的速率波动 | perf、iostat 采样 |
| 传输延迟 | 单次 DMA 从启动到完成的时间 | 时间戳打点、ftrace |
| CPU 占用率 | CPU 参与数据搬运的比例 | top、pidstat |
| 中断次数 | 单位时间内 DMA 完成中断数量 | /proc/interrupts |
| 总线利用率 | 实际带宽占理论带宽的比例 | 硬件性能计数器 |
其中,CPU 占用率与吞吐量的比值最能反映 DMA 效率。理想情况下,DMA 传输应让 CPU 占用率接近零,吞吐量接近总线带宽。
三、常用测试工具与命令
不同层级需要不同工具。以下命令可直接用于 DMA 吞吐测试环境:
# 1. 内存到内存 DMA 吞吐(基于 dmaengine 的 dmatest)
echo 1 > /sys/module/dmatest/parameters/run
cat /sys/module/dmatest/parameters/run
# 2. 块设备顺序读吞吐
fio --name=seqread --rw=read --bs=1M --size=2G --direct=1 --iodepth=32
# 3. 网络 DMA 吞吐(PCIe 网卡)
iperf3 -c 192.168.1.100 -t 30 -P 4
# 4. 实时观测中断与 CPU
watch -n 1 'cat /proc/interrupts | grep dma'
pidstat -u 1
fio 的 --direct=1 绕过页缓存,能真实反映 DMA 路径性能;--iodepth 控制并发深度,用于测试 DMA 描述符队列的承载能力。
四、场景设计:从理想模型到真实业务
吞吐测试场景必须分层设计,否则容易得出“实验室很好、上线就崩”的结论。建议按以下四类场景递进:
- 理想场景:大块连续数据、单通道、无竞争,用于测量 DMA 上限。
- 分块场景:按 4KB、64KB、1MB 等不同块大小测试,找出吞吐量拐点。
- 并发场景:多通道 DMA 同时工作,观察总线仲裁与带宽分配。
- 混合场景:DMA 传输与 CPU 计算、网络中断、存储 IO 同时发生,模拟真实负载。
下面这张图展示了吞吐测试场景的分层结构与关键观测点:
五、常见误区与复盘要点
误区一:只测大块数据,忽略小块。小块传输时启动开销和中断处理占主导,吞吐量可能只有峰值的 10%。
误区二:用带缓存的读写测 DMA。页缓存会掩盖真实 DMA 路径,必须使用 O_DIRECT 或 --direct=1。
误区三:忽略中断合并。中断次数过多会导致 CPU 频繁上下文切换,吞吐量反而下降。
误区四:单次测试下结论。DMA 吞吐受温度、频率调节、总线竞争影响,需多次采样取稳定值。
误区二:用带缓存的读写测 DMA。页缓存会掩盖真实 DMA 路径,必须使用 O_DIRECT 或 --direct=1。
误区三:忽略中断合并。中断次数过多会导致 CPU 频繁上下文切换,吞吐量反而下降。
误区四:单次测试下结论。DMA 吞吐受温度、频率调节、总线竞争影响,需多次采样取稳定值。
复盘时建议记录以下清单:测试块大小、并发深度、CPU 占用率、中断次数、平均吞吐量与瞬时吞吐量波动范围。只有把这些数据放在一起对比,才能判断优化是真正提升了 DMA 效率,还是仅仅把开销转移到了其他环节。