返回案例库

精选案例 · Agent / 实践案例

STrack-Sim · 多路径 RDMA 网络模拟器

这个案例围绕「STrack-Sim · 多路径 RDMA 网络模拟器」记录了一条真实 AI 实践线索,正文重点集中在「🎯 项目目标」「📊 实测结果(Incast 场景)」,适合先按任务意图阅读再判断复用。

案例速读

README 标题「STrack-Sim · 多路径 RDMA 网络模拟器」下已经出现运行/配置路径、脚本或接口线索、结果证据,正文重点集中在「🎯 项目目标」「📊 实测结果(Incast 场景)」,比纯概念介绍更适合进入精选阅读流。 这篇案例的阅读价值在于,它把真实任务、模型辅助过程和可迁移做法放在同一个上下文里,读者可以从 「STrack-Sim · 多路径 RDMA 网络模拟器」、「🎯 项目目标」、「📊 实测结果(Incast 场景)」、「📦 项目结构」 进入正文。

  • 建议重点看 可参考其中的运行与配置路径、包含可迁移的命令、脚本或接口线索、已有结果或观测证据可用于判断复用价值。结合 Agent / 实践案例 和「任务驱动用户、AI 实践者」这一受众定位,它更适合作为任务检索后的精读材料,而不是只看一句短摘要后快速跳过。
  • 正文目录和原始材料仍然是判断依据;导读只帮助你更快定位阅读重点。
看点
STrack-Sim · 多路径 RDMA 网络模拟器
读者
任务驱动用户、AI 实践者
复用
可参考其中的运行与配置路径
结构
12 个目录入口

原文内容

STrack-Sim · 多路径 RDMA 网络模拟器

一个用 Rust 从零搭建的 STrack 协议专属离散事件模拟器,用于研究 AI/ML 集群环境下多路径 RDMA 的性能表现。 四个阶段全部完成 ✅:DES 引擎 + 拓扑层 + STrack 协议栈 + 流量/Monitor + 端到端对比示例。


🎯 项目目标

复现并对比下列方案在 Fat-Tree / Leaf-Spine 拓扑下的表现:

方案 负载均衡 拥塞响应 恢复机制
RoCEv2 + ECMP 哈希分流(单路径/流) DCQCN 风格降窗 超时重传
STrack Packet Spraying 先切路再降窗 SACK Bitmap

针对的核心痛点:

  1. ECMP 哈希冲突导致链路利用率只能跑到 30–50%;
  2. RoCEv2 依赖无损以太网,bit error 回退开销不可接受;
  3. 硬件卸载场景下多路径状态难以维护。

📊 实测结果(Incast 场景)

实验设置:4 Leaf × 8 Spine × 4 host/leaf = 16 hosts,15 个 sender 同时向 host 0 发送 512 KB

┌─────────── ECMP baseline ────────────         ┌─────────── STrack ────────────────────
│ 完成流数            15                         │ 完成流数            15
│ 仿真总时长          874 us                     │ 仿真总时长          762 us   ✅ -12.8%
│ FCT P50             816.6 us                   │ FCT P50             704.7 us ✅ -13.7%
│ FCT P99             848.3 us                   │ FCT P99             735.9 us ✅ -13.3%
│ 总发送包数          7752                       │ 总发送包数          8652
│ 总重传包数          72                         │ 总重传包数          972
│ ECN 标记总数        4182                       │ ECN 标记总数        5134
└──────────────────────────────────────         └──────────────────────────────────────

可以看到 STrack 在 FCT 上有 ~13% 的明显改善,代价是更多重传——符合 Packet Spraying 的预期行为。


📦 项目结构

strack-sim/
├── Cargo.toml
├── README.md
├── docs/
│   └── design.md          ← 四阶段完整设计文档
├── src/
│   ├── lib.rs             ← crate 入口
│   ├── core/              ✅ 阶段一:DES 引擎
│   │   ├── event.rs         · Event + EventKind
│   │   ├── queue.rs         · EventQueue (BinaryHeap min-heap)
│   │   └── simulator.rs     · Simulator + Handler
│   ├── network/           ✅ 阶段二:物理层
│   │   ├── packet.rs        · Packet(含 ECN + SACK bitmap)
│   │   ├── link.rs          · Link + LinkRegistry
│   │   └── switch.rs        · Switch + Port + RoutingTable + ECN
│   ├── topology/          ✅ 阶段二:拓扑生成
│   │   ├── leaf_spine.rs    · 2 层 Leaf-Spine
│   │   └── fat_tree.rs      · k-ary Fat-Tree
│   ├── nic/               ✅ 阶段三:STrack 协议栈
│   │   ├── tx.rs            · TxNic (Spraying + CWND + RTO)
│   │   ├── rx.rs            · RxNic (Reorder + SACK Bitmap)
│   │   └── cc.rs            · CongestionMode (Ecmp / Strack)
│   ├── traffic/           ✅ 阶段四:流量生成
│   │   ├── incast.rs        · N-to-1 多对一拥塞
│   │   ├── all_reduce.rs    · Ring AllReduce
│   │   └── all_to_all.rs    · 全员两两交换
│   ├── monitor/           ✅ 阶段四:指标采集
│   │   └── mod.rs           · FlowFct + SimSummary
│   └── sim_runner.rs      ✅ 端到端仿真主循环
├── examples/
│   ├── des_demo.rs        · 阶段一:纯 DES 引擎演示
│   └── incast_compare.rs  · 端到端:ECMP vs STrack 对比
├── benches/
│   └── des_bench.rs       · DES 引擎吞吐基准
├── tests/
│   ├── integration_des.rs · 百万级 DES 事件
│   └── integration_e2e.rs · 端到端 Incast 完整性
└── logs/                  · 运行时日志输出目录

🚀 快速开始

环境要求

  • Rust 1.74+
  • macOS / Linux

编译

cd ~/Desktop/strack-sim
cargo build --release

运行测试(26 个测试,全部通过)

cargo test --release

预期:

  • 21 个单元测试(core / network / nic / topology 模块)
  • 1 个 DES 引擎集成测试(百万级事件)
  • 3 个端到端集成测试(Incast 场景)
  • 1 个文档测试

运行端到端演示(核心成果)

cargo run --release --example incast_compare

输出 ECMP vs STrack 在同一 Incast 场景下的对比指标。

运行 DES 引擎演示

cargo run --release --example des_demo

性能:~12–25 M events/sec(取决于场景)

跑性能基准

cargo bench

🧭 四阶段开发蓝图(实现状态)

✅ 阶段一:离散事件引擎

  • [x] Event + EventKind(含 PacketArrive/Depart/Timeout/Stop/Custom)
  • [x] EventQueueBinaryHeap + 反向 Ord 实现最小堆)
  • [x] Simulator(时钟 + Handler 注册 + step/run/run_until)
  • [x] FIFO 稳定性(同时间戳事件保插入顺序)
  • [x] 单元测试 + 集成测试 + 基准

✅ 阶段二:网络拓扑与物理层

  • [x] Packet:含 ECN、SACK base/bits、path_hint、depart_time
  • [x] Link:带宽 + 传播延迟,整数运算无浮点误差
  • [x] Switch:FIFO 队列 + ECN 标记 + buffer 上限丢包 + 路由表(ECMP 多路径)
  • [x] LeafSpine:参数化生成 + 完整路由
  • [x] FatTree:k-ary 三层完整实现

✅ 阶段三:NIC + STrack 协议栈

  • [x] TxNic
    • 流量分段(应用层字节 → MTU 包)
    • Packet Spraying(轮询挑选可用路径)
    • CWND 维护 + AIMD 加性增加
    • ECN 响应:先切路(路径黑名单 50us)再降窗
    • RTO 超时重传(100us)
  • [x] RxNic
    • Reorder Buffer(基于 next_expected + 64-bit bitmap)
    • 累计 ACK + SACK Bitmap
    • 乱序时发送 NACK 触发选择性重传
  • [x] CongestionModeEcmp baseline 与 Strack 双模式

✅ 阶段四:流量生成与指标

  • [x] Incast:N-to-1 拥塞场景
  • [x] RingAllReduce:经典 ring 模式
  • [x] AllToAll:全员两两交换
  • [x] Monitor:FCT、ECN 标记、丢包、最大队列深度、平均链路利用率
  • [x] SimSummary:CSV/JSON 可序列化(serde::Serialize

✅ 端到端集成

  • [x] SimRunner:集中式仿真主循环,处理所有事件类型
  • [x] incast_compare 示例:ECMP vs STrack 一键对比
  • [x] 实测 FCT 改善 ~13%(512 KB Incast)

📝 关键设计要点

1. 引擎与网络解耦

core/ 不依赖任何网络概念,可独立测试与替换为其他 DES 实现。

2. 集中式仿真主循环

没有使用 Simulator 的 handler 注册(borrow checker 太严),改为 SimRunner 集中分发事件。这允许在事件处理中自由读写所有实体状态。

3. 全局唯一 packet id

多个 TxNic 的本地 packet_id 在全局 packet_buf 中会冲突,因此 SimRunner 维护一个全局 PID 生成器,重写所有出包的 id。

4. RTO 与持续 TxTick

当 cwnd 满时仅靠 ACK 触发的 TxTick 不够(丢包后永远无 ACK),所以未完成流会定期 tick(25us)检查 RTO 超时并重传。

5. 可复现

所有随机数走 rand_pcg + 显式 seed(拓扑里仍然是确定性,不需要随机)。


📚 参考资料

  • STrack 论文“STrack: A Reliable Multipath Transport for AI/ML Clusters” (Meta NSDI’24)
  • RoCEv2 / DCQCNRFC 8888
  • htsim:UCL 的 C++ DES 网络模拟器
  • ns-3:研究级网络模拟器

📄 许可证

MIT License · 2026 · kiwios-cn

返回顶部