Prhub

#21404 fix mamba cache leak when adder fails to add a matched req.

原始 PR 作者 strgrb 合并时间 2026-03-30 16:45 文件变更 1 提交数 2 评论 13 代码增减 +7 / -0

执行摘要

修复 Mamba 缓存内存泄漏问题,确保调度器在添加请求失败时正确释放资源。

作者在运行中遇到内存泄漏错误,日志显示'token_to_kv_pool_allocator memory leak detected',并关联到Issue 18300。通过调试,发现泄漏发生在MambaRadixCache和PrefillAdder交互过程中:当请求匹配Mamba资源后,若adder未能将其添加到运行队列,已分配的mamba_pool_idx未被释放,导致内存泄漏。PR body中详细描述了泄漏的步骤和影响。

建议技术管理者和scheduler模块开发者精读此PR,了解Mamba缓存泄漏的根因和修复策略,以及review中关于资源管理封装的设计讨论。关注_get_new_batch_prefill_raw函数的修改点,以掌握调度器中的资源释放时机。

讨论亮点

review中主要有两个讨论线程:

  1. gemini-code-assist[bot]建议将资源清理逻辑封装到req对象的方法中,以提高代码可维护性和封装性;作者未明确采纳,但讨论提供了设计权衡视角。
  2. hzh0425质疑是否在请求已添加但其他条件失败时应避免释放资源,作者通过第二个commit添加检查是否已添加来解决此正确性问题,确保只在未添加时释放资源。讨论最终达成一致,PR被批准。

实现拆解

修改集中在python/sglang/srt/managers/scheduler.py文件的_get_new_batch_prefill_raw函数中。关键改动包括:

  1. 在循环中添加一个检查,判断请求是否已成功添加到adder.can_run_list;
  2. 如果请求未添加且mamba_pool_idx不为None,则调用tree_cache.req_to_token_pool.mamba_pool.free释放资源,并将req.mamba_pool_idx设为None。这通过两个commit演进:第一个commit添加基础释放逻辑,第二个commit根据review反馈增加添加检查以避免误释放。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py scheduler modified 6.0

关键符号

_get_new_batch_prefill_raw

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

资源清理逻辑封装 设计

gemini-code-assist[bot] 建议将资源释放逻辑移到 req 对象的方法中,以改善代码封装和维护性。

结论:作者未采纳此建议,但讨论提供了设计洞察,强调了资源管理与对象所有权的权衡。 · 已解决

添加检查的正确性 正确性

hzh0425 询问是否在请求已添加但其他条件失败时应避免释放资源,作者通过添加检查是否已添加来解决此疑虑。

结论:作者在第二个 commit 中添加了检查逻辑,确保只在请求未添加时释放资源,review 者认可此修改。 · 已解决

风险与影响

主要风险是回归风险:新增的释放逻辑可能在某些边界条件下错误释放或未释放资源,影响调度器正确性。由于修改位于核心调度路径_get_new_batch_prefill_raw,可能引入性能开销或副作用。缺少专项单元测试覆盖此场景,依赖现有CI测试,但review中未提及测试补充。风险可控,因为变更针对特定泄漏点且经过review验证。

直接影响是修复内存泄漏,提升系统内存使用效率和稳定性,避免因泄漏导致的运行时错误或崩溃。对用户透明,改善服务可靠性。对开发者影响较小,代码变更集中且简单,但为scheduler模块的资源管理提供了参考模式。影响范围限于调度器和缓存交互,不涉及外部接口。

核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论