RDMA tx-depth 是什么?4 组实验告诉你怎么选 一、tx-depth 是什么1.1 一句话定义tx-depth 是 RDMA QP 发送队列Send Queue的最大深度—— 一次能挂多少个待发送请求。1.2 形象比喻快递站的待派件堆积区区域大小 tx-depth包裹 待发送的 RDMA write 请求快递员 网卡 DMA 引擎异步派件派件完成短信 CQECompletion Queue Entry对应关系快递站RDMA QP区域大小tx-depth堆包裹post_send()派件员网卡 DMA 引擎派件短信CQE完成通知收短信清空区域poll CQ1.3 工作流程CPU 网卡DMA │ │ │ post_send(req1) │ ├─────────────────────────────────►│ │ post_send(req2) │ ← 同时在飞 (in-flight) ├─────────────────────────────────►│ │ post_send(req3) │ ← SQ 还有位置 ├─────────────────────────────────►│ │ ... │ │ │ DMA 到对端 │ ├──────────► │ ... 直到 tx-depth 个坑占满 │ │ │ │ ←──── CQE(req1 完成) ──────────│ 通知 CPU 释放坑 │ post_send(req4) │ CPU 立刻补新坑 ├─────────────────────────────────►│ │ │关键点post_send是非阻塞的CPU 不等 DMA 完成立刻返回CQE 是异步的DMA 完成后网卡中断通知 CPUCPU 看到 CQE 后才能复用那个 SQ 坑1.4 为什么需要 tx-depth如果没有 tx-depth 1CPU 每次只能发 1 条 → 必须等 CQE 才能发下一条等待时间 网络往返延迟μs 级→ CPU 闲置带宽利用率 50%有了 tx-depth 128CPU 连续发 128 条不等 CQE网卡 DMA 流水线处理 → 全程不空转带宽利用率 100%这就是流水线pipelining的威力 —— CPU 和 DMA 解耦。二、4 组实验tx-depth 怎么影响 RDMA 性能实验环境同上文i3-6320 2 ×cx8 200GbE RoCE v22.1 实验 AQP4 msg1MBtx64太小ib_write_bw-dmlx5_1-x2-s1048576-D10-q4-t64\--report_gbits--cpu_utilserver_ip结果#bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] CPU_Util[%] 1048576 35515 0.00 50.97 0.006076 0.00BW 50.97 Gb/s跟 tx128 几乎一样为什么 tx64 跟 tx128 一样大包1MB 50 Gb/s 带宽 → 每包耗时 1MB / 50Gb/s 160 μs。tx64 表示最多 64 个包在飞 → 总飞行时间 64 × 160 μs 10.24 ms10 秒测试窗口内能发 64 × 10000/10.24 ≈62,500 包实际 iterations 35,515远小于上限→SQ 还没满结论1MB 大包 50 Gb/s 下tx64 已经够用再大也用不上。2.2 实验 BQP4 msg1MBtx128perftest 默认ib_write_bw-dmlx5_1-x2-s1048576-D10-q4-t128...结果1048576 36691 0.00 50.68 0.006042 0.00BW 50.68 Gb/s对比 Exp Atx64txBW差异6450.97baseline12850.68-0.6%0.6% 差异在测试误差范围内→ 大包 tx128 没优势也没劣势。2.3 实验 CQP4 msg1MBtx512偏大ib_write_bw-dmlx5_1-x2-s1048576-D10-q4-t512...结果1048576 36118 0.00 50.85 0.006062 0.00BW 50.85 Gb/s跟 tx64/128 几乎一样为什么 tx512 没提速i3-6320 L1-dcache 32 KB。每个 SQ 坑约 64 bytes× 512 32 KB →正好打爆 L1-dcache。但因为是大包场景CPU 访问 SQ 的频率低160 μs 才访问一次cache miss 的延迟被网络延迟掩盖了。2.4 实验 DQP1 msg4KBtx128 vs 512 vs 2048关键对比4KB 小包——这次差异显形fortxin6412851210242048;doib_write_bw-dmlx5_1-x2-s4096-D15-q1-t$tx...done结果tx-depthBW (Gb/s)L1_dc_miss评价6450.97N/A太小12877.80⭐45.4M甜蜜点51272.9355.8M大了掉 6.3%204873.8755.2M大了掉 5.0% 关键发现4KB 小包场景下tx128 是甜蜜点超过 128 反而慢 5-6%为什么小包 tx 大反而慢4KB 78 Gb/s 每包410 nstx128 → 总飞行时间 128 × 410 ns 52 μs足够 CPU 在这期间干别的tx2048 → SQ 占用 2048 × 64B 128 KB→完全打爆 L1-dcache32 KB每次post_send()都要查 SQ → L1 miss → 访问 L2/L3 →延迟从 1ns 涨到 12ns。小包 410 ns/包3% 延迟放大 1% 带宽损失与实测吻合。三、4 组实验汇总3.1 总表#msg_sizetxQPBW (Gb/s)现象A1MB64450.97大包SQ 没用满B1MB128450.68默认没区别C1MB512450.85SQ 装满 L1但访问频率低D4KB128177.80小包甜蜜点D’4KB512172.93小包SQ 打爆 L1开始掉速D’’4KB2048173.87同上更严重3.2 ASCII 图tx-depth vs BW4KB 场景BW (Gb/s) 80 ┤ 78 ┤ ● ← tx128 甜蜜点 (77.80) 76 ┤ 74 ┤ ● ● ← tx512/2048 (-5%) 72 ┤ 70 ┤ 68 ┤ 66 ┤ 64 ┤ 62 ┤ 60 ┤ 58 ┤ 56 ┤ 54 ┤ 52 ┤ ● ← tx64 也低CPU 在等 CQE 50 ┤ └─┬──┬──┬──┬──┬──┬─► tx-depth 64 128 256 512 1024 20483.3 现象归因msg_size甜蜜点原因大包1MBtx64~512 都行每包耗时 160 μsCPU 访问 SQ 频率低小包4KBtx128每包耗时 410 nsCPU 频繁访问 SQcache miss 拖慢超小包256Btx128 还是更稳perftest 默认值就是经验最优四、tx-depth 选择决策树你的应用场景是什么 │ ├── 大文件传输msg ≥ 64KB │ │ │ └── tx64 就够 │ perftest 默认 128 也行几乎没差别 │ ├── 中等消息msg 4KB ~ 64KB ← NCCL AllReduce 典型场景 │ │ │ └── tx128perftest 默认就是最优 │ 调大反伤 L1 cache │ ├── 小消息控制平面msg ≤ 1KB │ │ │ └── tx128 也行 │ 如果 batch 大 1000可以试 tx64 省 cache │ └── 延迟极敏感金融交易、风控 │ └── tx32 或更小 减少 SQ 占用CPU 访问更快 但带宽利用率会下降 20-30%五、生产环境 RDMA 应用的最佳实践5.1 NCCL AllReduce最常见 RDMA 应用参数推荐值原因QP 数NCCL 自动通常 NIC 数 × 通道数跟硬件拓扑强相关tx-depthNCCL 内部默认一般 32-128已经过调优改 tx-depth不建议NCCL 已经按 GPU NIC 配比调好5.2 自写 RDMA 应用structibv_qp_init_attrattr{.cap{.max_send_wr128,// ← tx-depthperftest 默认.max_recv_wr128,.max_send_sge1,.max_recv_sge1,},.qp_typeIBV_QPT_RC,.sq_sig_all0,};// 创建 QP 后可以动态调整在某些驱动支持// 但通常创建后固定5.3 监控 tx-depth 是否够用# 看 SQ 占用cat/sys/class/infiniband/mlx5_0/ports/1/counters/sq_watermark# 看 completion queue 积压perfstat-ecs_unc_arfs_cycles_ok# CX8 专用六、tx-depth vs 相关概念概念全称关系tx-depthTX queue depthSQ 容量发送方rx-depthRX queue depthRQ 容量接收方CQ moderationCompletion Queue moderation多少个 CQE 触发一次中断降低中断开销inline sizeInline data size小包走 SQ 寄存器省 PCIe DMAMTUMaximum Transmission Unit物理包大小与 tx-depth 无关七、一句话总结tx-depth 是发送队列深度—— 让 CPU 和 DMA 解耦的流水线窗口。太小浪费带宽太大打爆 L1 cache。perftest 默认的128 在大多数场景下是甜蜜点生产环境NCCL已经调好不要瞎改。八、附录测试环境 复现测试机i3-6320 2 × cx8200GbE RoCE v2OFED26.01工具ib_write_bwperf stat复现命令# Exp D小包 tx 扫描fortxin6412851210242048;doib_write_bw-dmlx5_0-x2-s4096-D15-q1-t$tx--report_gbitssleep2perfstat-ecache-misses,cache-references,L1-dcache-load-misses\ib_write_bw-dmlx5_1-x2-s4096-D15-q1-t$tx\--report_gbitsserver_ipdone