当前位置: 首页 > news >正文

RDMA tx-depth 是什么?4 组实验告诉你怎么选

一、tx-depth 是什么?

1.1 一句话定义

tx-depth 是 RDMA QP 发送队列(Send Queue)的最大深度—— 一次能挂多少个"待发送请求"。

1.2 形象比喻

快递站的待派件堆积区

  • 区域大小 = tx-depth
  • 包裹 = 待发送的 RDMA write 请求
  • 快递员 = 网卡 DMA 引擎(异步派件)
  • 派件完成短信 = CQE(Completion Queue Entry)

对应关系

快递站RDMA QP
区域大小tx-depth
堆包裹post_send()
派件员网卡 DMA 引擎
派件短信CQE(完成通知)
收短信清空区域poll CQ

1.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 完成后网卡中断通知 CPU
  • CPU 看到 CQE 后才能复用那个 SQ 坑

1.4 为什么需要 tx-depth?

如果没有 tx-depth(= 1)

  • CPU 每次只能发 1 条 → 必须等 CQE 才能发下一条
  • 等待时间 = 网络往返延迟(μs 级)→ CPU 闲置
  • 带宽利用率 < 50%

有了 tx-depth(= 128)

  • CPU 连续发 128 条不等 CQE
  • 网卡 DMA 流水线处理 → 全程不空转
  • 带宽利用率 100%

这就是流水线(pipelining)的威力 —— CPU 和 DMA 解耦。


二、4 组实验:tx-depth 怎么影响 RDMA 性能

实验环境同上文:i3-6320 + 2 ×cx8 + 200GbE RoCE v2

2.1 实验 A:QP=4 msg=1MB,tx=64(太小)

ib_write_bw-dmlx5_1-x2-s1048576-D10-q4-t64\--report_gbits--cpu_util<server_ip>

结果

#bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] CPU_Util[%] 1048576 35515 0.00 50.97 0.006076 0.00

BW = 50.97 Gb/s(跟 tx=128 几乎一样)

为什么 tx=64 跟 tx=128 一样?

大包(1MB)+ 50 Gb/s 带宽 → 每包耗时 = 1MB / 50Gb/s =160 μs

  • tx=64 表示最多 64 个包在飞 → 总飞行时间 = 64 × 160 μs =10.24 ms
  • 10 秒测试窗口内能发 64 × 10000/10.24 ≈62,500 包
  • 实际 iterations = 35,515(远小于上限)→SQ 还没满

结论1MB 大包 + 50 Gb/s 下,tx=64 已经够用,再大也用不上


2.2 实验 B:QP=4 msg=1MB,tx=128(perftest 默认)

ib_write_bw-dmlx5_1-x2-s1048576-D10-q4-t128...

结果

1048576 36691 0.00 50.68 0.006042 0.00

BW = 50.68 Gb/s

对比 Exp A(tx=64)

txBW差异
6450.97baseline
12850.68-0.6%

0.6% 差异在测试误差范围内→ 大包 + tx=128 没优势也没劣势。


2.3 实验 C:QP=4 msg=1MB,tx=512(偏大)

ib_write_bw-dmlx5_1-x2-s1048576-D10-q4-t512...

结果

1048576 36118 0.00 50.85 0.006062 0.00

BW = 50.85 Gb/s(跟 tx=64/128 几乎一样)

为什么 tx=512 没提速?

i3-6320 L1-dcache = 32 KB。每个 SQ 坑(约 64 bytes)× 512 = 32 KB →正好打爆 L1-dcache

但因为是大包场景,CPU 访问 SQ 的频率低(160 μs 才访问一次),cache miss 的延迟被网络延迟掩盖了。


2.4 实验 D:QP=1 msg=4KB,tx=128 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.8045.4M甜蜜点
51272.9355.8M大了掉 6.3%
204873.8755.2M大了掉 5.0%

🐕 关键发现:4KB 小包场景下,tx=128 是甜蜜点,超过 128 反而慢 5-6%!

为什么小包 + tx 大反而慢?

  • 4KB @ 78 Gb/s = 每包410 ns
  • tx=128 → 总飞行时间 = 128 × 410 ns =52 μs(足够 CPU 在这期间干别的)
  • tx=2048 → SQ 占用 = 2048 × 64B =128 KB完全打爆 L1-dcache(32 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 BW,4KB 场景)

BW (Gb/s) 80 ┤ 78 ┤ ● ← tx=128 甜蜜点 (77.80) 76 ┤ 74 ┤ ● ● ← tx=512/2048 (-5%) 72 ┤ 70 ┤ 68 ┤ 66 ┤ 64 ┤ 62 ┤ 60 ┤ 58 ┤ 56 ┤ 54 ┤ 52 ┤ ● ← tx=64 也低(CPU 在等 CQE) 50 ┤ └─┬──┬──┬──┬──┬──┬─► tx-depth 64 128 256 512 1024 2048

3.3 现象归因

msg_size甜蜜点原因
大包(1MB)tx=64~512 都行每包耗时 160 μs,CPU 访问 SQ 频率低
小包(4KB)tx=128每包耗时 410 ns,CPU 频繁访问 SQ,cache miss 拖慢
超小包(256B)tx=128 还是更稳perftest 默认值就是经验最优

四、tx-depth 选择决策树

你的应用场景是什么? │ ├── 大文件传输(msg ≥ 64KB) │ │ │ └── tx=64 就够 │ perftest 默认 128 也行,几乎没差别 │ ├── 中等消息(msg 4KB ~ 64KB) ← NCCL AllReduce 典型场景 │ │ │ └── tx=128(perftest 默认)就是最优 │ 调大反伤 L1 cache │ ├── 小消息控制平面(msg ≤ 1KB) │ │ │ └── tx=128 也行 │ 如果 batch 大(> 1000)可以试 tx=64 省 cache │ └── 延迟极敏感(金融交易、风控) │ └── tx=32 或更小 减少 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_wr=128,// ← tx-depth(perftest 默认).max_recv_wr=128,.max_send_sge=1,.max_recv_sge=1,},.qp_type=IBV_QPT_RC,.sq_sig_all=0,};// 创建 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 DMA
MTUMaximum Transmission Unit物理包大小(与 tx-depth 无关)

七、一句话总结

tx-depth 是发送队列深度—— 让 CPU 和 DMA 解耦的"流水线窗口"。太小浪费带宽,太大打爆 L1 cache。perftest 默认的128 在大多数场景下是甜蜜点,生产环境(NCCL)已经调好,不要瞎改


八、附录:测试环境 & 复现

测试机:i3-6320 + 2 × cx8(200GbE RoCE v2)
OFED:26.01
工具ib_write_bw+perf stat

复现命令

# Exp D:小包 + tx 扫描fortxin6412851210242048;doib_write_bw-dmlx5_0-x2-s4096-D15-q1-t$tx--report_gbits&sleep2perfstat-ecache-misses,cache-references,L1-dcache-load-misses\ib_write_bw-dmlx5_1-x2-s4096-D15-q1-t$tx\--report_gbits<server_ip>done
http://www.cnnetsun.cn/news/3230763.html

相关文章:

  • 浏览器扩展 vs Tampermonkey 脚本:5个维度对比网页去广告方案选型
  • 大数据计算机毕设之基于 Django 大数据的出游路线与景区推荐系统的设计与实现 基于时序数据分析的旅游景区趋势推荐系统(完整前后端代码+说明文档+LW,调试定制等)
  • 线控刹车3方案实测对比:电推杆 vs 液压推杆 vs ESP破解(附300N推力数据)
  • ROS Noetic 下 3 款 2D 激光 SLAM 算法实测:Gmapping vs Hector vs Cartographer 建图精度与速度对比
  • 自动驾驶传感器融合实战:4类传感器(摄像头/激光/毫米波/超声波)数据对齐与融合策略
  • KMS_VL_ALL_AIO终极指南:Windows与Office智能激活深度解析
  • 4款主流无人机仿真平台对比 2024:Gazebo vs Flightmare vs RotorS vs AirSim
  • 激光SLAM退化场景应对:3种多传感器融合方案(LiDAR/IMU/UWB)实测分析
  • ONNX Runtime CPU推理3大误区:线程数≠核心数,实测对比揭示真实加速比
  • 后端开发者必读:API设计中的常见误区
  • PyTorch DataLoader的pin_memory与num_workers调优:从原理到性能基准
  • 什么是大模型API网关?2026年开发者必知的概念入门指南
  • Transformer与CNN初始化对比:3类网络架构下的He/Xavier初始化效果实测
  • 元学习 vs 微调:CDFSL 场景下3种策略选择与2个关键超参分析
  • 基于STM32单片机空气质量监测 温湿度 光照 无线传输报警系统213(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • DDPG+HER 算法实战:目标导向RL在2D网格世界的80%成功率调优
  • 揭秘Mermaid实时编辑器:5分钟创建专业图表的技术革命
  • ComfyUI幻术工作流:AI图像隐藏技术与实战指南
  • BsMax:从3ds Max到Blender的终极平滑过渡指南 - 保留肌肉记忆的完整解决方案
  • 3款点云补全网络对比:PF-Net vs PCN vs TopNet 在 ShapeNet 上的 F-Score 评测
  • Seedance 2.0与豆包大模型本地部署:AI短视频生成完整指南
  • DQN vs Double DQN vs Dueling DQN:3大改进算法在CartPole环境下的性能对比评测
  • VGG-16 迁移学习实战:乳腺超声图像3分类,Kaggle数据集准确率超92%
  • 知识蒸馏温度系数 T 调参实战:从 0.1 到 10.0 对模型精度影响分析
  • 3种相机标定方法对比:张正友法、Tsai两步法与OpenCV自标定API
  • Kruskal-Wallis H 检验实战:Python scipy.stats 与 R kruskal.test 结果对比与解读
  • LabVIEW弹性VI标签消失问题
  • COCO/YOLO/VOC 3种数据集格式互转:1个脚本与5个关键参数配置
  • Wind API vs 自动化抓取:3 种数据获取方案性能与合规性深度对比
  • 【Copilot vs Cursor终极对决】:20年IDE工具专家实测12项核心指标,谁才是2024开发者生产力核弹?