一、问题动机
之前实验QP=1 + msg=4KB 是甜蜜点(77.68 Gb/s),bidirectional 4KB 总带宽 128.44 Gb/s。
但:生产环境 NCCL AllReduce 用的就是多个 QP 并发,QP=4 才是更真实的场景。如果在 QP=4 下做精细 msg_size 扫描,会复现 QP=1 的甜蜜点吗?还是有完全不同的曲线?
本文就是回答这个问题。
二、测试方法
固定参数:
- QP =4(生产环境典型配置)
- tx_depth = 128
- test_duration = 15 秒 / 每点
- 单向传输(默认模式)
扫描 msg_size:
1KB / 2KB / 4KB / 8KB / 16KB / 64KB / 128KB / 1MB (共 8 个点,2 的幂等比分布)工具组合:ib_write_bw+perf stat(同上文)
三、测试结果
3.1 完整数据表
| msg_size | BW (Gb/s) | MsgRate (Mpps) | IPC | L1_dc_miss | LLC_miss | ctx_switch | cpu_mig |
|---|---|---|---|---|---|---|---|
| 1KB | 52.46 | 6.404 | 2.000 | 137.7M | N/A | 164 | 2 |
| 2KB | 51.76 | 3.159 | 2.376 | 78.4M | N/A | 157 | 2 |
| 4KB | 52.39 | 1.599 | 2.697 | 42.0M | N/A | 235 | 3 |
| 8KB | 51.72 | 0.789 | 2.867 | 22.7M | N/A | 291 | 11 |
| 16KB | 50.05 | 0.382 | 2.758 | 24.5M | N/A | 334 | 2 |
| 64KB | 50.56 | 0.096 | 2.966 | 8.7M | N/A | 162 | 4 |
| 128KB | 50.83 | 0.048 | 3.004 | 5.6M | N/A | 226 | 5 |
| 1MB | 51.55 | 0.006 | 3.039 | 2.6M | N/A | 383 | 4 |
3.2 ASCII 图(BW vs msg_size)
BW (Gb/s) 53 ┤ ● ● 52 ┤ 51 ┤ ● ● 50 ┤ ● ● ● ● 49 ┤ └──┬──┬──┬──┬──┬──┬──┬──┬─► msg_size (对数) 1K 2K 4K 8K 16K 64K 128K 1M3.3 关键观察
| 维度 | 观察 |
|---|---|
| BW 极差 | 50.05 ~ 52.46 Gb/s,差距仅 4.8% |
| 峰值位置 | 1KB(52.46)+ 4KB(52.39)双峰 |
| 谷底位置 | 16KB(50.05) |
| 趋势 | msg_size 越大,BW 越稳定在 ~50 Gb/s(大包靠 DMA 走 PCIe,不靠 CPU) |
| L1 miss 趋势 | msg_size 越大,L1 miss 越少(大包数据局部性好) |
四、对比 QP=1 的扫描结果
| msg_size | QP=1 (Gb/s) | QP=4 (Gb/s) | QP=1 vs QP=4 |
|---|---|---|---|
| 1KB | 63.73 | 52.46 | +21.5%⭐ |
| 2KB | 75.01 | 51.76 | +44.9% |
| 4KB | 77.68 | 52.39 | +48.3%⭐⭐ |
| 8KB | 63.91 | 51.72 | +23.5% |
| 16KB | 50.01 | 50.05 | -0.1% |
| 64KB | 49.80 | 50.56 | -1.5% |
| 128KB | 50.72 | 50.83 | -0.2% |
| 1MB | 51.48 | 51.55 | -0.1% |
ASCII 图(QP=1 vs QP=4 对比):
BW (Gb/s) 80 ┤ ● ← QP=1 甜蜜点 (4KB) 75 ┤ ● 70 ┤ 65 ┤ ● 60 ┤ 55 ┤ 50 ┤● ● ● ● ● ← QP=1 大包平台 45 ┤ ● ● ● ● ● ← QP=4 整体水平 40 ┤ └──┬──┬──┬──┬──┬──┬──┬──┬─► msg_size 1K 2K 4K 8K 16K 64K 128K 1M五、根因分析
5.1 QP=1 vs QP=4 为什么差这么多?
小包场景(≤ 8KB):
- QP=1:CPU 单核串行处理一个 QP,每条消息从网卡 DMA → 内存 → 完成中断 → CPU 处理 → 下一条
- QP=4:CPU 必须在 4 个 QP 之间轮询,每次轮询需要 4 次内存访问(每个 QP 检查 CQ),CPU 调度开销巨大
- 小包本身耗时短(1KB @ 52 Gb/s = 150ns/包),CPU 调度开销占比相对较大
大包场景(≥ 64KB):
- QP=1 ≈ QP=4(51 vs 51 Gb/s):大包一次 DMA 耗时数微秒,CPU 调度开销占比几乎为零
- 瓶颈在DMA / PCIe / 内存带宽,不在 CPU
5.2 IPC 与 msg_size 的关系
| msg_size | IPC (QP=4) | 解释 |
|---|---|---|
| 1KB | 2.000 | 小包,CPU 频繁响应,IPC 低 |
| 4KB | 2.697 | |
| 16KB | 2.758 | |
| 64KB | 2.966 | |
| 1MB | 3.039⭐ | 大包 CPU 进入"等 DMA 完成"空闲,IPC 反而高 |
反直觉:大包 IPC 反而高。因为大包发送后 CPU 进入 wait for completion,CPU 利用率低但"忙的有效指令多"。
5.3 L1-dcache miss 走势
| msg_size | L1_dc_miss | 解释 |
|---|---|---|
| 1KB | 137.7M⭐ | 小包,每包都需要查 CQ,数据结构反复进出 L1 |
| 4KB | 42.0M | |
| 16KB | 24.5M | |
| 128KB | 5.6M | |
| 1MB | 2.6M | 大包,QPL 数据结构长时间驻留 L1 |
L1 miss 与 msg_size 强负相关:包越大,CPU 处理频率越低,cache 命中率越高。
六、综合判断
6.1 QP=4 场景下的"甜蜜点"在哪?
两个局部峰:1KB(52.46)和 4KB(52.39)。
但极差只有 4.8%——在工程误差范围内。QP=4 没有明显甜蜜点,消息大小几乎不影响 BW。
6.2 这意味着什么?
- NCCL AllReduce 等真实负载:QP 数量动态变化,但单 QP 流量在 ~50 Gb/s 是稳态
- 要突破 100 Gb/s 必须并行多个 QP(多连接并发)
- CPU 选型是 RDMA 性能的关键(i3 单核天花板 ~52 Gb/s,多核可叠加)
6.3 进一步优化方向
| 方向 | 预期 | 说明 |
|---|---|---|
| CPU 多核并行 | 4× 提升 | 4 个核每个跑一个 QP=4 进程 → 200+ Gb/s |
| PCIe Gen4/5 | 2× 提升 | 把单核带宽从 16 GB/s 提到 32 GB/s |
| 换 DDR5 | 1.5× 提升 | 内存频率翻倍,带宽提升 |
| inline data | <8% 提升 | 小包走 inline 省 PCIe DMA |
七、附录:完整 perf 数据(QP=4, msg=4KB 为例)
Performance counter stats for 'ib_write_bw -d mlx5_1 -x 2 -s 4096 -D 15 -q 4 -t 128 --report_gbits --cpu_util <server_ip>': 25,461,628 cache-misses # 58.601 % of all cache refs 43,433,000 cache-references 41,949,788 L1-dcache-load-misses 124,567 LLC-load-misses 1,876,432 LLC-store-misses 24,892 dTLB-load-misses 12,341 iTLB-load-misses 42,568,134,892 cycles 114,879,562,341 instructions # 2.70 insn per cycle 235 context-switches 3 cpu-migrations 16.272389913 seconds time elapsed八、写在最后
通过固定 QP=4 精细扫描 msg_size,验证了:
- QP=4 没有明显甜蜜点,BW 几乎不受 msg_size 影响(稳定在 ~50 Gb/s)
- CPU 单核天花板在 ~52 Gb/s,与 QP 数 / msg_size 关系不大
- 小包场景下 QP 数越少越好,大包场景下 QP 数无所谓
- 多核并行是突破 100+ Gb/s 的必由之路