Prhub

#17195 fix(hicache): add retry logic for MooncakeStore warmup

原始 PR 作者 chenkaiyue 合并时间 2026-04-28 09:50 文件变更 1 提交数 8 评论 11 代码增减 +23 / -2

执行摘要

MooncakeStore warmup 增加重试机制

从 PR body 中的错误日志可见,多 TP 进程中部分进程在 warmup 时 Transfer Engine 尚未完全就绪,导致 self.store.put 返回非零值并触发 AssertionError,进而使 Scheduler 进程崩溃退出。此竞态条件在分布式缓存初始化阶段常见,需要重试机制来容忍短暂的不一致状态。

建议维护者和部署者关注此 PR,它解决了实际生产中发现的稳定性问题。设计上对竞态条件的处理方式值得借鉴——通过有限重试+明确异常退出,在保证鲁棒性的同时避免了无限阻塞。同时,提前收集可观测信息(如 TP rank)是良好的运维实践。

讨论亮点

Review 中主要讨论了重试间隔的合适值和日志中包含 TP rank 的需求。stmatengss 建议将初始的2秒间隔缩短为1秒,chenkaiyue 同意并修改。此外,stmatengss 要求打印 TP rank,chenkaiyue 采纳并实现。

实现拆解

  1. 提前初始化 self.local_rank:在 __init__ 方法中将 self.local_rank 的赋值从原有位置(位于 warmup 之后)提前到 warmup() 调用之前,以便 warmup 日志中可以打印当前 TP rank,增强可观测性。
  2. 在 warmup 方法中引入重试循环:将原来的 assert self.store.put(...) == 0 替换为一个最多重试10次的循环,每次重试间隔1秒(经 review 确认)。若所有重试均失败,则抛出 RuntimeError 明确说明 Transfer Engine 可能未就绪。
  3. 保留后续的 assert 检查:重试成功后,仍保留 assert self.store.is_exist(warmup_key) == 1assert self.store.get(warmup_key) == warmup_value 来验证存储可用性。
    (无额外测试或配置变更。)
文件 模块 状态 重要度
python/sglang/srt/mem_cache/storage/mooncake_store/mooncake_store.py 存储后端 modified 6.56

关键符号

warmup

关键源码片段

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

唯一变更文件,包含了重试逻辑和初始化顺序调整两个关键改动。

def warmup(self):
    warmup_key = "sglang_mooncake_store_warmup_key" + uuid.uuid4().hex
    warmup_value = bytes(4 * 1024) # 4 KB
​
    # 重试逻辑:处理 Transfer Engine 启动的竞态条件
    max_retries = 10
    retry_delay = 1.0 # 单位:秒
​
    for attempt in range(max_retries):
        ret = self.store.put(warmup_key, warmup_value)
        if ret == 0:
            break
        logger.warning(
            f"[TP{self.local_rank}] Warmup put failed (attempt {attempt + 1}/{max_retries}), "
            f"ret={ret}, retrying in {retry_delay}s..."
        )
        time.sleep(retry_delay)
    else:
        # 所有重试均失败,抛出异常而不是断言
        raise RuntimeError(
            f"[TP{self.local_rank}] Warmup put failed after {max_retries} attempts, "
            "Transfer Engine might not be ready"
        )
​
    # 重试成功后验证基本读写能力
    assert self.store.is_exist(warmup_key) == 1
    assert self.store.get(warmup_key) == warmup_value

评论区精华

重试间隔值选择 设计

stmatengss 建议从 2 秒降低到 1 秒,chenkaiyue 询问 500ms 或 1s,stmatengss 确认 1 秒合适。

结论:确认使用 1 秒间隔。 · 已解决

日志中添加 TP rank other

stmatengss 建议打印 TP rank 以区分不同进程的失败日志,chenkaiyue 同意并实现。

结论:已添加 [TP{self.local_rank}] 前缀。 · 已解决

风险与影响

重试逻辑会暂时掩盖永久性服务故障(如 Transfer Engine 端口错误),直到10次重试耗尽才抛出异常。但这优于立即崩溃,因为原始行为在不同 TP 进程间表现不一致(部分成功、部分失败)。建议在更大规模部署中监控 warmup 阶段的成功率和重试次数,以便尽早发现底层配置问题。

直接影响 MooncakeStore 后端在分布式环境(尤其多 TP)下的启动成功率,避免因初始化竞争导致服务无法启动。影响范围局限在启用 HiCache 且使用 MooncakeStore 后端的场景。用户无需修改配置即可受益。

核心路径变更 竞态条件修复 外部服务依赖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论