Prhub

#25624 Move invariant checks to SchedulerInvariantChecker and retire runtime_checker mixin

原始 PR 作者 fzyzcjy 合并时间 2026-05-18 18:39 文件变更 4 提交数 1 评论 1 代码增减 +244 / -265

执行摘要

不变量检查迁移至独立组件并删除旧 Mixin

延续 Scheduler 职责拆分重构链路,将运行时不变量检查逻辑从 Mixin 继承模式剥离为独立组件,降低核心调度类的复杂度,提升可测试性和可维护性。

值得精读设计思路:通读此 PR 可理解如何将继承自 Mixin 的职责逐步迁移到纯数据类(dataclass)组件,降低多继承复杂度的具体手法。尤其适合关注大规模重构和架构治理的工程师。

讨论亮点

本 PR 为纯机械剪切粘贴,未产生 review 讨论。此前序重构链路(#25625–#25638)已充分评审所有设计决策。

实现拆解

  1. 迁移方法体:将 SchedulerRuntimeCheckerMixin 中所有 @staticmethod 的不变量检查方法(_check_pool_invariant_check_full_pool_check_swa_pool_check_mamba_pool_get_total_uncached_sizesself_check_during_busy_check_req_pool_report_leak 等)剪切到 SchedulerInvariantChecker 类中,并转换为普通实例方法,移除 @staticmethod 和显式 self 参数注解。
  2. 清理原 Mixin 文件:删除 scheduler_runtime_checker_mixin.py 中除 _maybe_log_idle_metrics 外的所有代码,该文件后续亦将在独立 PR 中被完全移除(idle metrics 已移至 SchedulerMetricsReporter)。
  3. 更新调度器调用点:在 scheduler.py 的 event_loop_normalevent_loop_overlapon_idlecreate_scheduler_watchdog 等方法中,将 self._check_all_pools(self.invariant_checker, ...) 替换为 self.invariant_checker._check_all_pools(...),将 self._report_leak(self.invariant_checker, ...) 替换为 self.invariant_checker._report_leak(...),并将 self._check_req_pool(self.invariant_checker) 替换为 self.invariant_checker._check_req_pool()
  4. 更新 MLX 后端:在 hardware_backend/mlx/scheduler_mixin.py 中,将两处 self.self_check_during_busy() 替换为 self.invariant_checker.self_check_during_busy()
  5. 移除继承关系:从 Scheduler 类的基类列表中移除 SchedulerRuntimeCheckerMixin,相关 import 同时清理。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler_runtime_checker_mixin.py 调度器 modified 8.94
python/sglang/srt/managers/scheduler_components/invariant_checker.py 调度器 modified 8.84
python/sglang/srt/managers/scheduler.py 调度器 modified 5.93
python/sglang/srt/hardware_backend/mlx/scheduler_mixin.py MLX 后端 modified 5.11

关键符号

self_check_during_busy _check_all_pools _report_leak _check_req_pool _check_tree_cache _check_pool_invariant _check_full_pool _check_swa_pool _check_mamba_pool _get_total_uncached_sizes

关键源码片段

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

核心调度器文件,所有不变量检查的调用点均需重定向到 invariant_checker 组件。

# 文件 : python/sglang/srt/managers/scheduler.py
# event_loop_normal 中的调用变更(约第 1525 行)
​
    if envs.SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY.get():
        # 之前 : self.self_check_during_busy(self.invariant_checker)
        self.invariant_checker.self_check_during_busy() # 现在直接调用组件方法# event_loop_overlap 中的类似变更(约第 1577 行)
    if envs.SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY.get():
        self.invariant_checker.self_check_during_busy()# create_scheduler_watchdog 中的 dump_info(约第 334 行)
    _, messages = scheduler.invariant_checker._check_all_pools(
        scheduler.pool_stats_observer.get_pool_stats(),
    )
    # 之前 : scheduler._check_all_pools(scheduler.invariant_checker, ...)

评论区精华

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

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

风险与影响

该变更为核心调度路径的机械重构,方法体保持不变(仅从静态方法转为实例方法),回归风险较低。但需注意:

  • 所有调用点均需正确转发到 invariant_checker 组件,如果有遗漏调用或参数传递错误(如 _check_all_pools 原接受两个参数,现在第一个参数 self 由实例隐式传递),可能导致运行时异常。
  • 不变量检查在每次 schedule 循环中执行,对性能有直接影响,迁移后应当确保无额外开销。
  • 缺少专用测试用例覆盖该 PR 的调用变更,依赖集成测试和 CI。
  • MLX 后端路径改变可能被忽略,需确认 CI 中包含 MLX 测试。

影响范围覆盖所有使用 Scheduler 的配置(所有 SRT 部署),包括常规调度循环和 MLX 重叠调度。本 PR 不改变外部 API 或用户可见行为,仅内部模块重组。对开发者影响:新组件 SchedulerInvariantChecker 成为检查入口,新功能开发应优先向该组件添加。

核心路径变更 缺少测试覆盖 MLX 后端回归风险

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论