Prhub

#49437 [chore] log process manager shutdown with more details

原始 PR 作者 andyxning 合并时间 2026-08-01 02:55 文件变更 1 提交数 3 评论 3 代码增减 +17 / -6

执行摘要

为 v1 进程管理器关闭流程日志补充进程名与 PID

PR body 指出 shutdown 函数被多处使用,缺少进程名或进程类型时难以判断是哪个 process manager 触发关闭;且该流程只在退出时调用一次,附加进程名不会造成明显冗余。作者希望补充 name 与 pid 等进程元信息,以提供更多排障上下文。

值得快速浏览:作为日志可观测性小改进,已获 maintainer 批准,可安全合并。后续可将 send sigterm 日志降为 debug,与 #50590 的日志噪音治理方向对齐;无需精读。

讨论亮点

inferact-vllm-bot(代表 @simon-mo 审批):变更正确,BaseProcess.name/.pid 总是可用;强杀循环实际调用 kill_process_tree(pid) 的进程集合与之前完全一致,无行为变化。两个可选小建议:
1. (',').join([...]) 可简化为生成器表达式;
2. send sigterm to process 的 INFO 日志会在每次正常关闭时每引擎进程输出一行,建议降为 debug,与 start/complete 日志保持一致。

inferact-vllm-bot(CI triage):15 个失败全部来自 v1/kv_offload/tiering/test_fs_tier.py,是 O_DIRECT 被 overlayfs 的 /tmp 拒绝的环境问题,已在 main 上由 #49734 修复,与本 PR 无关,可 rebase 或 force-merge。

实现拆解

  1. 变更入口:唯一改动文件为 vllm/v1/utils.py,核心函数为全局 shutdown(procs, timeout)。
  2. 启动日志增强:logger.debug 的格式串追加 names=%s,传入 (',').join([proc.name for proc in procs]),一次性列出所有待关闭进程名。
  3. SIGTERM 阶段:在 proc.terminate() 前对每个存活进程新增 logger.info,输出 send sigterm to process 。
  4. 强制 kill 阶段:将 remaining_pids 改为 remaining_procs((pid, name) 元组列表),强杀前逐条 logger.warning 打印进程名与 pid,再调用 kill_process_tree(pid)。被强杀的进程集合与顺序保持不变。
  5. 配套改动:无测试、配置、schema 或部署变更。提交历史包含两次 merge main;CI 的 v1-core-plus-kv-plus-metrics 失败来自 v1/kv_offload/tiering/test_fs_tier.py 的 O_DIRECT/overlayfs 环境问题(已由 #49734 修复),与本 PR 无重叠。
文件 模块 状态 重要度
vllm/v1/utils.py 进程管理 modified 5.38

关键符号

shutdown

关键源码片段

vllm/v1/utils.py logging

唯一改动文件,shutdown() 是多进程关闭的核心入口,日志增强直接帮助定位关闭 / 强杀来源。

# vllm/v1/utils.py::shutdown —— 引擎退出时统一关闭所有子进程
def shutdown(procs: list[BaseProcess], timeout: float | None = None) -> None:
    '''关闭进程列表,带超时保护。'''
    if timeout is None:
        # 未显式配置时保留 5 秒宽限期,供非用户配置的清理路径使用
        timeout = 5.0
​
    logger.debug(
        '[shutdown] Process manager: start process_count=%d timeout=%ss names=%s',
        len(procs),
        timeout,
        (',').join([proc.name for proc in procs]), # 启动时一次性列出进程名,便于定位触发方
    )
​
    # 向所有存活进程发送 SIGTERM,并逐个记录进程名
    for proc in procs:
        if proc.is_alive():
            logger.info(
                '[shutdown] Process manager: send sigterm to process %s', proc.name
            )
            proc.terminate()
​
    # 在截止时间内等待优雅退出
    deadline = time.monotonic() + timeout
    for proc in procs:
        remaining = deadline - time.monotonic()
        if remaining <= 0:
            break
        if proc.is_alive():
            proc.join(remaining)
​
    # 对超时未退出的进程,记录 name 与 pid 后强制 kill 整棵进程树
    remaining_procs = [
        (proc.pid, proc.name)
        for proc in procs
        if proc.is_alive() and proc.pid is not None
    ]
    if remaining_procs:
        logger.warning(
            '[shutdown] Process manager: force killing remaining processes count=%d',
            len(remaining_procs),
        )
    for pid, proc_name in remaining_procs:
        logger.warning(
            '[shutdown] Process manager: force killing remaining process %s pid %d',
            proc_name,
            pid,
        )
        kill_process_tree(pid)
​
    logger.debug_once('[shutdown] Process manager: complete')

评论区精华

INFO 日志可能造成正常关闭噪音 style

inferact-vllm-bot:每进程 send sigterm 日志在每次正常关闭时每个引擎进程输出一行,建议日志级别改为 debug 与 start/complete 日志保持一致。

结论:非阻塞建议;合并时保持 INFO,可后续调整。 · suggested

列表推导可简化为生成器 style

inferact-vllm-bot:(",").join([...]) 可改为 ",".join(proc.name for proc in procs)。

结论:非阻塞 nit,不影响行为。 · suggested

CI 失败是否与 PR 相关 other

inferact-vllm-bot triage:v1-core-plus-kv-plus-metrics 的 15 个失败均来自 test_fs_tier.py 的 O_DIRECT/overlayfs 环境问题,由 main 上的 #49734 修复,本分支 merge-base 早于该修复;该 PR 只改 shutdown 日志,无重叠。

结论:失败与 PR 无关,可 rebase 合并 main 或 force-merge。 · 已解决

风险与影响

功能路径无变化,回归风险极低。唯一可感知的影响是正常关闭时新增 INFO 级逐进程日志,可能增加日志量,审阅者建议后续降为 debug。BaseProcess.name/.pid 在进程存活时始终可用,join 之后 is_alive 为 False 的进程不会被纳入 remaining_procs,不会访问已失效对象。进程名若包含逗号可能使 names 列表模糊,但实际可忽略。无自动化测试覆盖此日志变更,但风险低。

影响范围仅限于 vllm/v1 进程管理 shutdown 路径的日志输出。对用户无功能影响;对运维与开发者,多进程部署(API server、engine core、KV offload 等)下可按进程名和 PID 区分是哪一层在关闭或超时被强杀,显著提升排障效率。对团队影响小,无部署与发布影响。

正常关闭日志量增加 无测试覆盖 CI 需 rebase 获取 #49734

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论