返回案例库

精选案例 · Agent / 实践案例

Rust 多路径 RDMA 网络模拟器

可读标题 · 基于原文内容整理

原题:PB23030756 投稿 · AI 辅助编程案例

这个案例围绕「PB23030756 投稿 · AI 辅助编程案例」记录了一条真实 AI 实践线索,正文重点集中在「一、项目简介」「架构亮点:可插拔协议抽象」,适合先按任务意图阅读再判断复用。

案例速读

README 标题「PB23030756 投稿 · AI 辅助编程案例」下已经出现运行/配置路径、脚本或接口线索、结果证据,正文重点集中在「一、项目简介」「架构亮点:可插拔协议抽象」,比纯概念介绍更适合进入精选阅读流。 这篇案例的阅读价值在于,它把真实任务、模型辅助过程和可迁移做法放在同一个上下文里,读者可以从 「PB23030756 投稿 · AI 辅助编程案例」、「一、项目简介」、「架构亮点:可插拔协议抽象」、「四阶段开发」 进入正文。

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

原文内容

PB23030756 投稿 · AI 辅助编程案例

姓名: 刘奕康 学号: PB23030756 项目: strack-sim —— Rust 多路径 RDMA 网络模拟器


一、项目简介

这是一个用 Rust 从零搭建的可插拔协议网络模拟器,核心定位是支撑 AI/ML 集群网络中多路径 RDMA 传输协议的研究。

架构亮点:可插拔协议抽象

项目并非 STrack 专属。底层定义了通用的 Protocol trait,目前已有两套独立的协议实现:

协议实现 核心特性 用途
STrack Packet Spraying + 路径黑名单 + SACK Bitmap + 选择性重传 复现 NSDI’24 方案
SimpleTCP 单路径 + 慢启动/Congestion Avoidance + 快速重传 + RTO 验证 trait 通用性 + TCP 限制对比

如需新增协议(如 DCQCN、HPCC、Swift),只需实现 Protocol trait 即可接入完整仿真框架。

四阶段开发

阶段 内容 代码量
1️⃣ DES 引擎:EventQueue(BinaryHeap 最小堆)+ Simulator ~200 行
2️⃣ 物理层与拓扑:Packet / Link / Switch + Fat-Tree / Leaf-Spine ~500 行
3️⃣ 可插拔协议栈:Protocol trait + STrack + SimpleTCP + 拥塞控制 ~800 行
4️⃣ 流量生成与指标采集:Incast / AllReduce / AllToAll + 混合流量 + SimSummary ~600 行

总计源码约 3000+ 行(不含测试和示例),26 个测试全部通过。


二、AI 辅助编程体验

整个项目从零到完成,AI 在多个维度深度参与。

1. 架构设计:AI 作参谋,我拍板

项目初期我在两种架构间犹豫:基于 htsim 风格的 handler 注册模式 vs 集中式事件分发模式。

AI 帮我分析了两种方式的优劣:

  • Handler 注册模式:干净但 Rust 的 borrow checker 会让人头疼
  • 集中式 SimRunner:虽然后期 dispatch 函数会膨胀,但避免了生命周期问题

最终选了集中式,事实证明是对的——后续迭代中频繁修改多个实体状态,集中分发省了大量 borrow checker 斗争的时间。

2. 代码生成:AI 写模式化代码,我写核心逻辑

AI 最适合处理那些有模式但不复杂的代码:

拓扑生成(Fat-Tree 索引计算)

// AI 生成的 k-ary Fat-Tree 索引计算
// 我需要手工验算每个索引对不对
for k in 0..k/2 {
    for s in 0..k/2 {
        let core = core_start + c * k/2 + s;
        let pod = pod_start + p * k/2 + c;
        let agg = agg_start + p * k/2 + (c + k/2) % k;
        // ...
    }
}

这类嵌套循环的索引计算,手写容易 off-by-one,AI 生成后人工验算一遍效率高很多。

测试用例生成:项目的 26 个测试中,约 70% 由 AI 生成或辅助生成,尤其是一些参数组合的边界情况测试。

3. 调试与修复:AI 价值最大的地方

几个印象深刻的 AI 协助调试案例:

🔴 死锁定位:Incast 场景下模拟器卡死,我手动追踪了两小时无果。把事件时间线给 AI 看,它指出是 TxTickPacketArrive 在同一时间戳的调度顺序问题——ACK 被调度到了 DATA 前面,导致死锁。在 Event 结构里加 seq 字段解决。

🔴 全局 PID 冲突:不同协议实例(STrack / SimpleTCP)各自从 1 开始编号 packet_id,在全局 packet_buf 中冲突导致诡异错误。AI 建议在 SimRunner 中加一个 global_pid 生成器,handle_tx_tick 中重写所有出包的 id。这个建议是项目中最关键的修复。

🔴 周期 TxTick 必要性:当 cwnd 满时仅靠 ACK 触发 txTick 是不够的——丢包后永远无 ACK。AI 建议未完成流定期 tick(25us)检查 RTO,解决了"卡死"问题。

4. 协议实现:AI 写实现,我来 review

SimpleTCP 实现:AI 生成了完整的慢启动、拥塞避免、快速重传、RTO 超时的逻辑框架。我重点 review 了 ECN 响应和 cwnd 更新逻辑,发现并修正了一处在快速恢复阶段 cwnd 增长的边界条件错误。

STrack SACK Bitmap:64-bit bitmap 表示乱序接收状态,位运算部分 AI 生成后我模拟了几个场景验证正确性。


三、成果展示

Incast 场景实测(512KB × 15 sender → 1 receiver)

指标 ECMP STrack 改善
仿真总时长 874 μs 762 μs -12.8%
FCT P50 816.6 μs 704.7 μs -13.7%
FCT P99 848.3 μs 735.9 μs -13.3%
总发送包数 7752 8652 +11.6%
总重传包数 72 972 +1250%

STrack 在 FCT 上有约 13% 的改善,代价是更多重传——这是 Packet Spraying 的预期行为:负载被分散到更多 spine 上,单个链路瞬时拥塞反而更激烈。

不同工作负载下的对比

FCT 对比 在不同负载强度下,STrack(蓝色)的 FCT 普遍优于 ECMP(橙色)

拥塞对比 ECMP 与 STrack 的丢包/重传/ECN 标记分布对比

链路利用率 STrack 通过 Packet Spraying 实现了更均衡的链路利用率分布

TCP 限制场景

在 TCP 限制对比实验中,项目使用 SimpleTCP 协议实现验证了更广泛的传输层设计空间:

FCT 柱状图 不同配置下的 FCT 柱状图对比

FCT 散点图 逐流 FCT 的散点分布

重传比例 不同方案的重传比例对比

包类型分布 各类包(DATA/ACK/NACK)的分布情况


四、经验总结

AI 擅长什么

  1. 调试效率提升最显著:全局 PID 冲突这类 bug,自己排查可能半天,AI 几分钟定位到根因
  2. 模式化代码生成:拓扑索引、测试用例、结构体样板代码,AI 写了我 review,效率翻倍
  3. 边界情况验证:协议实现中的各种 corner case,AI 比我一个人想得更全面

AI 不擅长什么

  1. 全局架构设计:整体架构(模块划分、事件流设计、抽象层次)必须自己定,AI 给的方案太泛
  2. 生成的代码需要 review:尤其是索引计算、位运算、状态机转换,AI 容易 off-by-one
  3. 不能替代核心理解:不理解协议本质就无法判断 AI 生成的拥塞控制逻辑是否正确

核心心得

你是架构师,AI 是高效的码农和调试助手。 不要指望 AI 设计系统,但让它帮你写实现、找 bug、写测试,效率提升非常可观。


五、项目结构

strack-sim/                  ← 项目根目录
├── Cargo.toml               Rust 项目配置
├── src/
│   ├── lib.rs               crate 入口
│   ├── core/                DES 引擎(阶段一)
│   ├── network/             物理层(阶段二)
│   ├── topology/            拓扑生成(阶段二)
│   ├── nic/                 协议栈(阶段三)
│   │   ├── protocol.rs      Protocol trait ← 可插拔抽象
│   │   ├── strack.rs        STrack 协议实现
│   │   └── tcp.rs           SimpleTCP 协议实现
│   ├── traffic/             流量生成(阶段四)
│   ├── monitor/             指标采集(阶段四)
│   └── sim_runner.rs        端到端仿真主循环
├── examples/                端到端示例
├── tests/                   集成测试(26 个全部通过)
├── output/                  分析图表输出
└── docs/                    设计文档

返回顶部