头图

本文为达坦科技DatenLord新系列文章【开源周报】的第四篇。

设立这一系列的初衷,是为了更透明地分享达坦科技开源项目的成长轨迹。在这里,我们不仅会同步项目近期的核心开发进展与技术突破,更将通过路线图为您揭示未来的演进方向。

📍 项目地址与参与

GitHub 仓库:https://github.com/open-rdma/open-rdma-driver

我们诚挚邀请所有对高性能网络、Rust系统编程或RDMA技术感兴趣的朋友点击链接关注、支持我们的项目。开源的力量源于社区。您的每一次关注、讨论或代码贡献,都是项目前进的重要动力。期待与您携手,共建更完善的高性能基础设施生态。

01、本周进展

本周核心目标:修复上周发现的关键bug,完善RCCL测试框架

本周主要围绕修复上周发现的问题展开工作,成功解决了NCCL重复注册MR问题和Post Recv WR时找不到QP的问题,同时通过重构提升了代码的类型安全性和可维护性。

  1. 修复NCCL重复注册MR问题 (commit: 04b3d53)

问题背景:

  • 上周发现NCCL会注册两个映射到同一个物理页的MR
  • 导致同一个物理页面被重复pin/unpin
  • 影响硬件的MTT和PGT管理逻辑

解决方案:

  • 实现了MrRegionManager来跟踪和管理内存区域的页面pinning
  • 通过记录已注册的内存区域,避免重复pinning同一物理页面
  • 在MTT和context层集成MR region manager
  • 在virt_to_phy模块中添加虚拟地址对齐检查

实现细节:

  • 新增rdma_utils/mr_region_manager.rs模块(496行代码)
  • 修改mem/pa_va_map.rs,优化断言格式,提高可读性
  • 更新rdma_utils/mtt.rs和verbs/ctx.rs,集成MR region manager

效果:

  • 成功解决了NCCL重复注册MR导致的问题
  • 确保每个物理页面只被pin一次
  • 为RCCL测试扫清了重要障碍
  1. 引入编译时类型安全的地址类型 (commit: 5704dfc, 5f3c80f)

背景:

  • 原有代码使用运行时对齐检查和手动位操作
  • 容易出现对齐错误,且错误只能在运行时发现

重构内容:

  • 引入AlignedVirtAddr〈N〉和AlignedPhysAddr〈N〉泛型类型
  • 将运行时对齐检查提升为编译时类型保证
  • 消除手动位操作,提高代码安全性

影响范围:

  • mem/mod.rs:更新内存管理接口
  • mem/virt_to_phy.rs:使用类型安全的地址转换
  • verbs/ctx.rs:使用对齐地址类型

意义:

  • 提供编译时页对齐保证,减少运行时错误
  • 提高代码可维护性和可读性
  • 为后续开发提供更安全的类型基础
  1. 修复Post Recv WR时找不到QP问题 (commit: 1ff3dcd)

问题描述:

  • 上周发现在post接收WR时系统提示找不到对应的QP
  • QP已经成功注册,但在某些状态下无法找到

根因分析:

  • RDMA规范允许在QP处于INIT状态时post接收WR
  • 但原有实现只支持在RTS状态post接收
  • NCCL会在INIT状态下就post接收WR

解决方案:

  • 在verbs/ctx.rs中添加pending_post_recv_queue
  • 当QP处于INIT状态时,将post_recv请求暂存到队列中
  • 当QP转换到RTR状态后,自动处理队列中的pending请求

实现细节:

  • 修改verbs/ctx.rs,新增62行代码
  • 支持在INIT状态下接受post_recv调用
  • 实现状态转换时的自动pending请求处理
  1. 完善测试框架 (commit: 1968be2)

新增测试:

  • write_imm.c:RDMA Write with Immediate测试(565行)
  • nccl_pattern_test.c:模拟NCCL通信模式的测试(546行)
  • run_dual_sim_test.sh:支持双仿真器的测试脚本(94行)

测试脚本优化:

  • 新增test_write_imm_sim.sh和test_nccl_pattern_sim.sh
  • 重构test_send_recv_sim.sh,改进错误处理
  • 更新test_nompi.sh,支持新的测试模式

发现的问题:

  • 通过NCCL模式测试发现了新的bug(具体问题需要进一步调试)
  • 为下周的问题修复提供了测试基础

02、解决的关键问题

  1. NCCL重复注册MR问题

问题:NCCL会注册映射到同一物理页的多个MR

解决:通过MrRegionManager避免重复pin/unpin

状态:已完全修复

  1. Post Recv WR时找不到QP问题

问题:在post接收WR时找不到已注册的QP

解决:添加pending_post_recv_queue支持INIT状态下的post_recv

状态:已完全修复

  1. 代码类型安全问题

问题:运行时对齐检查容易出错

解决:引入编译时类型安全的对齐地址类型

状态:已完成重构

03、遗留问题

  1. 仿真器高压稳定性问题

状态:上周发现,本周未处理

现象:

INFO cocotb: ImmAssert failed in mkBsvTopWithoutHardIpInstance.topLevelDmaChannelMux @time=18331000: "/home/peng/projects/rdma_all/open-rdma-rtl/src/FullyPipelineChecker.bsv", line 118, column 25
INFO cocotb: -- DataStream checkFullyPipeline Failed:
name = mkTopLevelDmaChannelMux muxInst write, lastBeatCnt=9140, curBeatCnt=9163, delta=23

后续计划:

调研cocotb仿真器行为,确认是否是仿真器代码问题
调试硬件RTL代码,检查流水线控制逻辑
分析高压场景下的时序和竞争条件

  1. NCCL Pattern测试中发现的新bug
time=20679000: genFirstBeat  -> isFirst: True,  isLast: False
time=20681000: genSecondBeat -> isFirst: False, isLast: False
time=20683000: genThirdBeat  -> isFirst: False, isLast: False
... (之后没有继续生成,缺少isLast=True的结尾beat)  ✗ 异常 

状态:本周新发现

问题描述: 通过nccl_pattern_test发现RTL仿真器输出了异常的以太网数据流。经分析RTL simulator log,发现Ethernet Packet Generator输出了有头无尾的stream。

异常现象: 第一个数据包只生成了开头,没有isLast标记:

time=20679000: genFirstBeat  -> isFirst: True,  isLast: False
time=20681000: genSecondBeat -> isFirst: False, isLast: False
time=20683000: genThirdBeat  -> isFirst: False, isLast: False
... (之后没有继续生成,缺少isLast=True的结尾beat)  ✗ 异常

但第二个数据包生成了完整的以太网帧(有头有尾):

time=20747000: genFirstBeat  -> isFirst: True,  isLast: False
time=20749000: genSecondBeat -> isFirst: False, isLast: False
time=20751000: genThirdBeat  -> isFirst: False, isLast: False
... (中间的payload beats)
time=20837000: genMoreBeat   -> isFirst: False, isLast: True   ✓ 正常结束 
初步分析:
  • Ethernet Packet Generator在处理第一个数据包时状态机出现异常
  • 第一个包未能正常完成,缺少结尾标记,但第二个包恢复正常
  • 可能是初始状态或首包处理逻辑存在问题
  • 需要进一步调查RTL中的数据包生成状态机和初始化逻辑

后续计划:

调试nccl_pattern_test,定位具体问题
分析问题根因并修复

04、下周规划

短期任务(最高优先级)

  1. 调试并修复NCCL Pattern测试中发现的bug
  • 运行nccl_pattern_test定位问题
  • 分析问题根因
  • 实现修复方案
  1. 完成RCCL sim模式基础测试
  • 验证所有修复的正确性
  • 运行完整的RCCL测试套件
  • 确保基础功能稳定
  1. 解决仿真器高压稳定性问题
  • 深入分析checkFullyPipeline失败的根因
  • 调研cocotb仿真器行为
  • 如果是RTL问题,与硬件团队协作修复

中期任务

  1. 完善测试框架
  • 增加更多NCCL模式的测试用例
  • 实现测试结果自动验证机制
  • 添加性能基准测试
  1. 推进RCCL完整功能支持
  • 在所有bug修复完成后,验证RCCL完整功能
  • 支持更多collective操作测试

长期任务

  1. Driver 重构
  • 优化代码架构,提升可维护性
  • 重构核心模块,使得模块对外接口更为简洁同时正确处理错误
  1. GPU 内存注册支持
  • 调研 dma-buf 内核接口的实现细节
  • 设计内核模块中的 GPU 内存映射机制
  • 实现 ibv_reg_dmabuf_mr verbs 支持

05、本周总结

本周主要聚焦于修复上周发现的关键问题:

成果:

  • 成功解决了NCCL重复注册MR问题,实现了MrRegionManager
  • 修复了Post Recv WR时找不到QP的问题,支持INIT状态下的post_recv
  • 进行了一个小重构,引入编译时类型安全保证
  • 完善了测试框架,添加了NCCL模式测试

挑战:

  • 仿真器高压稳定性问题暂未处理
  • 通过新增测试发现了新的bug,可能是rtl硬件代码导致的,需要进一步调试

达坦科技始终致力于打造高性能AI+Cloud基础设施平台,积极推动AI应用的落地。达坦科技通过软硬件深度融合的方式,提供AI推理引擎和高性能网络,为AI应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对AI+Cloud的需求。

公众号:达坦科技DatenLord

DatenLord官网:

https://datenlord.github.io/zh-cn/

知乎账号:

https://www.zhihu.com/org/da-tan-ke-ji

B站:

https://space.bilibili.com/2017027518

邮箱:info@datenlord.com

如果您有兴趣加入达坦科技Rust前沿技术交流群、硬件敏捷开发和验证方法学讨论群或AI Infra 交流群,请添加小助手微信:DatenLord_Tech


Datenlord
14 声望11 粉丝

DatenLord专注打造新一代云原生高性能存储平台,实现跨云、跨数据中心之间数据高速访问,从而极大提升存储系统的可扩展性,满足企业客户海量数据跨地域高速访问需求,在互联网、金融、电信、能源等不同行业均有广...