Prhub

#24277 [HiCache] enable ssd offload support for mooncake store

原始 PR 作者 stmatengss 合并时间 2026-05-14 14:07 文件变更 3 提交数 6 评论 7 代码增减 +91 / -10

执行摘要

为 Mooncake 存储后端添加 SSD 卸载支持

在 Mooncake 存储后端中,当 KV 缓存数据超过 DRAM 容量时,可以将溢出数据卸载到本地 SSD,从而提供更大的缓存容量。该功能需要在 SGLang 侧暴露配置项。PR 讨论中作者提到:'In most cases, enabling SSD offloading isn't necessary, so it remains an optional setting for the user.'

建议读者关注其中向后兼容的 try-except 降级处理模式,这种为可选新功能安全适配旧版本的方法在成熟项目中很有价值。同时,由于缺少单元测试对降级路径的覆盖,建议在 future 工作中补充。

讨论亮点

Gemini Code Assist bot 指出两个问题:

1) 即使 SSD 卸载未启用也会向 setup() 传递 enable_ssd_offload 参数,导致旧版本 Mooncake 触发不必要的警告;
2) setup() 调用的参数列表重复。最终代码中,只在启用时传入额外参数,且通过 kwargs 动态构造,避免了重复;第一个问题已修复。未发现其他未解决的讨论。

实现拆解

  1. python/sglang/srt/environ.py 中新增两个环境变量 MOONCAKE_ENABLE_SSD_OFFLOADMOONCAKE_OFFLOAD_FILE_STORAGE_PATH,默认分别为 FalseNone

  2. MooncakeStoreConfig dataclass 中增加 enable_ssd_offloadssd_offload_path 字段,并在三个配置加载路径(from_fileload_from_envload_from_extra_config)中读取对应值。

  3. 修改 MooncakeStore.__init__ 中的 setup() 调用:仅当 enable_ssd_offloadTrue 时才向 self.store.setup() 传入关键字参数;通过 try-except TypeError 捕获旧版本 Mooncake 不支持参数的情况,自动删除不支持的参数后重试,并打印警告。

  4. README.md 中新增 SSD 卸载的说明,列出三种配置方法(extra config、JSON config file、环境变量)及注意事项。

文件 模块 状态 重要度
python/sglang/srt/mem_cache/storage/mooncake_store/mooncake_store.py 缓存层 modified 7.0
python/sglang/srt/environ.py 环境变量 modified 4.82
python/sglang/srt/mem_cache/storage/mooncake_store/README.md 文档 modified 3.32

关键符号

MooncakeStore.__init__ MooncakeStoreConfig.from_file MooncakeStoreConfig.load_from_env MooncakeStoreConfig.load_from_extra_config

关键源码片段

python/sglang/srt/mem_cache/storage/mooncake_store/mooncake_store.py core-logic

核心逻辑修改:新增配置字段、修改 setup 调用并加入版本兼容降级逻辑。

# 构建传给 setup 的额外参数(仅在启用 SSD 卸载时)
setup_kwargs = {}
if self.config.enable_ssd_offload:
    setup_kwargs["enable_ssd_offload"] = True
if self.config.ssd_offload_path is not None:
    setup_kwargs["ssd_offload_path"] = self.config.ssd_offload_pathwhile True:
    try:
        # 调用 Mooncake 分布式存储的 setup 方法
        ret_code = self.store.setup(
            client_hostname,
            self.config.metadata_server,
            per_tp_global_segment_size,
            DEFAULT_LOCAL_BUFFER_SIZE, # 零拷贝接口不需要 local buffer
            self.config.protocol,
            device_name,
            self.config.master_server_address,
            transfer_engine,
            **setup_kwargs, # 动态传入 SSD 卸载参数
        )
        break # 成功则跳出循环
    except TypeError as e:
        # 旧版本 Mooncake 可能不支持某些参数
        unsupported_kwargs = [key for key in list(setup_kwargs) if key in str(e)]
        if not unsupported_kwargs:
            # 如果错误不是由已知参数引起,重新抛出
            raise
        logger.warning(
            "The installed Mooncake version does not support the "
            f"{', '.join(unsupported_kwargs)} parameter(s) in setup(). "
            "Retrying without {', '.join(unsupported_kwargs)}. "
            "Please upgrade Mooncake to enable SSD offload support."
        )
        # 移除不支持的参数后重试
        for key in unsupported_kwargs:
            setup_kwargs.pop(key, None)
if ret_code:
    raise RuntimeError(f"Failed to setup Mooncake store, error code: {ret_code}")

评论区精华

SDK 版本兼容性与代码重复 设计

Gemini Code Assist bot 指出 try-except 语句在 SSD 卸载未启用时也传递参数会导致旧版本误报,同时 setup 参数列表重复。

结论:最终实现只在启用时构建 setup_kwargs 并动态传入,避免了不必要的警告和参数列表重复。 · 已解决

风险与影响

主要风险在于版本兼容性判断:TypeError 字符串匹配判断哪些参数不支持(unsupported_kwargs = [key for key in list(setup_kwargs) if key in str(e)])可能因错误信息格式不同而误判,导致真正的 TypeError 被掩盖。此外,用户可能不清楚底层 Mooncake 版本是否支持 SSD 卸载,警告信息可能被忽略。建议在今后增加版本检测或更严格的异常区分。

影响范围仅限于使用 Mooncake 作为 HiCache 存储后端的用户。新功能默认关闭,不会影响现有行为。启用后可在缓存溢出时利用本地 SSD 扩展 L3 容量,适用于内存受限但 SSD 充足的场景。对非 Mooncake 用户无影响。团队需注意新增环境变量与其他配置的命名空间一致。

缺少测试覆盖 版本兼容性判断依赖字符串匹配

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论