Prhub

#24466 Silence noisy health-check race log in TokenizerManager

原始 PR 作者 cctry 合并时间 2026-05-06 12:06 文件变更 1 提交数 1 评论 1 代码增减 +4 / -0

执行摘要

压制 health-check 竞态条件日志噪音

在 /health_generate 端点中,健康检查请求不等待最终输出,只要收到调度器/解码器的任何响应即视为服务器健康。因此在高负载下,健康检查响应经常在其 rid 已被移除后到达,_handle_batch_output 会警告 'Received output for rid=... but the state was deleted...' 这是良性的但在繁忙 pod 上噪音很大。

该 PR 值得合并,是一个小但实用的改进,减少运维噪音。

讨论亮点

无 review 讨论。

实现拆解

  1. 在 tokenizer_manager.py 中导入常量 HEALTH_CHECK_RID_PREFIX。
  2. 在 _handle_batch_output 方法中,当 rid 对应的 state 为 None 时,增加检查:若 rid 以 HEALTH_CHECK_RID_PREFIX 开头,则直接跳过,不记录错误日志。
  3. 其他 rid 仍按原有逻辑记录错误。
  4. 该模式与已有的 _handle_abort_req 一致。
文件 模块 状态 重要度
python/sglang/srt/managers/tokenizer_manager.py 管理器 modified 4.43

关键符号

_handle_batch_output

关键源码片段

python/sglang/srt/managers/tokenizer_manager.py dependency-wiring

核心变更文件,修改了 _handle_batch_output 方法以静默健康检查竞态日志。

# python/sglang/srt/managers/tokenizer_manager.py
# 在 _handle_batch_output 中处理 rid 对应的 state 为 None 的情况时
# 增加对健康检查请求的特判,避免输出竞态条件导致的错误日志from sglang.srt.constants import HEALTH_CHECK_RID_PREFIX # 新增导入async def _handle_batch_output(self, recv_obj):
    for i, rid in enumerate(recv_obj.rids):
        state = self.rid_to_state.get(rid, None)
        if state is None:
            # 已知竞态:/health_generate 在收到任何消息后立即移除 rid
            # 以更新 last_receive_tstamp,因此健康检查响应可能在其 rid 已被删除后到达
            if rid.startswith(HEALTH_CHECK_RID_PREFIX):
                # 这是预期行为,静默跳过
                continue
            logger.error(
                f"Received output for {rid=} but the state was deleted in TokenizerManager."
            )
            continue
        # 后续处理正常状态 ...

评论区精华

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

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

风险与影响

风险极低。变更仅添加了条件跳转和一行 import,不影响其他路径的逻辑。若后续有人修改 HEALTH_CHECK_RID_PREFIX 常量或被错误设置,可能导致真正的错误被隐藏,但概率很小。

影响范围小,仅影响 TokenizerManager 中健康检查请求的日志行为。对用户无影响;对运维人员可减少无效告警。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论