Prhub

#32029 [Fix] Unify pinned host pool release on graceful shutdown

原始 PR 作者 hnyls2002 合并时间 2026-07-23 03:29 文件变更 7 提交数 1 评论 3 代码增减 +29 / -5

执行摘要

统一优雅关闭时的 pinned host 内存释放路径

来自 PR body:Follow-up to #31746: route the userspace release of pinned host buffers through a single BasePrefixCache.release_host_resources() interface, covering UnifiedRadixCache / HiMambaRadixCache / HostPoolGroup-backed pools and the decode offload manager, which were previously left to slow kernel-side unpinning at process reclaim.

值得精读,因为展示了如何通过抽象基类统一资源释放路径,是良好的代码重构范例。关注点在于是否所有涉及 host pool 的缓存都已覆盖。

讨论亮点

该 PR 没有 review 评论或讨论。

实现拆解

  1. 在基类 BasePrefixCache 中添加默认实现(python/sglang/srt/mem_cache/base_prefix_cache.py):新增 release_host_resources 方法,默认为空(幂等),供子类重写。
  2. UnifiedRadixCache 实现(python/sglang/srt/mem_cache/unified_radix_cache.py):新增 release_host_resources 方法,在 host_pool_group 不为 None 时调用其 destroy 方法。同时初始化时增加 self.host_pool_group = None 属性。
  3. HiRadixCache 实现(python/sglang/srt/mem_cache/hiradix_cache.py):新增 release_host_resources 方法,销毁 token_to_kv_pool_host。
  4. HiMambaRadixCache 实现(python/sglang/srt/mem_cache/hi_mamba_radix_cache.py):新增 release_host_resources 方法。
  5. HostPoolGroup 支持(python/sglang/srt/mem_cache/memory_pool_host.py):给 HostPoolGroup 新增 destroy 方法,遍历所有 entry 并调用其 host_pool.destroy。
  6. decode offload 管理器(python/sglang/srt/disaggregation/decode_kvcache_offload_manager.py):新增 release_host_resources 方法,销毁 decode_host_mem_pool。
  7. 修改调度器入口(python/sglang/srt/managers/scheduler.py):将原来 scheduler.release_host_resources 中手动获取 host_pool 并销毁的逻辑替换为统一调用 self.tree_cache.release_host_resources(),同时新增对 decode_offload_manager 的 release_host_resources 调用,使所有释放逻辑集中。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py 调度器 modified 6.19
python/sglang/srt/mem_cache/unified_radix_cache.py 缓存层 modified 6.1
python/sglang/srt/mem_cache/base_prefix_cache.py 缓存层 modified 5.66
python/sglang/srt/mem_cache/hiradix_cache.py 缓存层 modified 5.66
python/sglang/srt/mem_cache/memory_pool_host.py 缓存层 modified 5.29
python/sglang/srt/disaggregation/decode_kvcache_offload_manager.py 解耦部署 modified 5.22
python/sglang/srt/mem_cache/hi_mamba_radix_cache.py 缓存层 modified 5.22

关键符号

BasePrefixCache.release_host_resources UnifiedRadixCache.release_host_resources HiRadixCache.release_host_resources HiMambaRadixCache.release_host_resources HostPoolGroup.destroy DecodeKVCacheOffloadManager.release_host_resources Scheduler.release_host_resources

关键源码片段

python/sglang/srt/managers/scheduler.py core-logic

调度器的 release_host_resources 是核心调用入口,本次将其改为委托给 tree_cache 和 decode_offload_manager,统一了资源释放逻辑。

def release_host_resources(self) -> None:
    # Release pinned host buffers in userspace on graceful shutdown; see
    # HostKVCache.destroy. Called from run_scheduler_process's finally.
    if self.hisparse_coordinator is not None:
        self.hisparse_coordinator.destroy()
    # 统一委托给 tree_cache 和 decode_offload_manager 的 release_host_resources
    self.tree_cache.release_host_resources()
    if self.decode_offload_manager is not None:
        self.decode_offload_manager.release_host_resources()

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  • 回归风险:调度器的 release_host_resources 方法从手动销毁 host_pool 改为委托给 tree_cache.release_host_resources,若某个缓存子类未正确实现该方法,可能导致 pinned 内存未释放,但基类提供了空默认实现,不会崩溃。
  • 未覆盖场景:如果未来新增其他缓存类型或 host pool 变体,需要同步实现 release_host_resources,否则可能遗漏。
  • 并发安全:destroy 方法通常在优雅关闭时单线程调用,不存在竞态问题。
  • 对用户:无明显功能变化,但优雅关闭时释放 pinned 内存的速度提升(从依赖内核进程回收变为主动用户态释放),减少关闭延迟。
  • 对系统:统一了多个缓存组件的资源释放逻辑,降低维护成本。
  • 对团队:新增接口需要在未来新增缓存类型时实现,但默认空实现保证了向前兼容。
缺少测试覆盖 需确保子类全部实现

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论