Prhub

#38435 [Core][Metrics] expose waiting request breakdown via labeled metric (capacity/deferred)

vllm-project/vllm · 作者 mukesh-hai · 合并时间 2026-04-14 03:30

分析状态 已生成
文件变更 5提交数 4 · 评论 14
代码增减 +101 / -4
v1 core feature performance

执行摘要

新增标签化指标以细分等待请求队列,提升调度瓶颈诊断能力。

PR body 中指出:现有指标 'vllm:num_requests_waiting' 将两种不同的请求队列(容量约束的等待队列和因 LoRA 预算、异步 KV 传输等约束延迟的队列)合并为一个数字,使得在生产负载下调试调度行为时无法区分负载驱动的积压和约束驱动的阻塞。

建议精读此 PR,关注标签化指标的设计决策,它展示了如何在保持向后兼容性的同时遵循 Prometheus 最佳实践进行指标扩展,对类似监控功能开发有借鉴价值。

讨论亮点

Review 中,markmc 建议采用标签化指标模式(类似 vllm:prompt_tokens_by_source)而不是单独指标,以遵循 Prometheus 最佳实践并提高可扩展性,该建议被采纳并重构实现。此外,讨论了术语一致性('skipped' vs 'deferred'),最终使用 'deferred' 作为用户友好标签,并优化了初始化方式以保持代码一致性。

实现拆解

关键改动包括:1) 在 vllm/v1/metrics/stats.py 的 SchedulerStats 类中添加 num_waiting_reqs 和 num_skipped_waiting_reqs 字段;2) 在 vllm/v1/core/sched/scheduler.py 的 make_stats() 中填充这些字段;3) 在 vllm/v1/metrics/loggers.py 中定义 WAITING_REASON_CAPACITY 和 WAITING_REASON_DEFERRED 常量,并添加 vllm:num_requests_waiting_by_reason 标签化指标;4) 更新日志输出以显示延迟请求数;5) 添加测试文件验证功能。

文件 模块 状态 重要度
vllm/v1/metrics/stats.py metrics modified 7.0
vllm/v1/core/sched/scheduler.py core/sched modified 6.0
vllm/v1/metrics/loggers.py metrics modified 7.0
tests/v1/core/test_scheduler.py test modified 5.0
tests/entrypoints/serve/instrumentator/test_metrics.py test modified 4.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

SchedulerStats.num_waiting_reqs SchedulerStats.num_skipped_waiting_reqs scheduler.make_stats() StatLoggerBase.record() AggregatedLoggingStatLogger.aggregate_scheduler_stats()

评论区精华

标签化指标设计 vs 单独指标 设计

markmc 建议使用标签化指标模式,类似 vllm:prompt_tokens_by_source,以提高可扩展性和遵循 Prometheus 最佳实践。

结论:采纳建议,重构为 vllm:num_requests_waiting_by_reason 标签化指标,使用 reason 标签细分。 · 已解决

术语一致性 设计

讨论中涉及 'skipped'、'deferred'、'waiting' 等术语的选择,以提供用户友好的标签。

结论:最终使用 'capacity' 和 'deferred' 作为标签,分别表示容量约束和延迟约束。 · 已解决

初始化一致性优化 style

gemini-code-assist[bot] 指出初始化 gauge_waiting_by_reason 时应使用 create_metric_per_engine 工具以保持代码一致性。

结论:在后续提交中修复,采用标准化辅助函数进行初始化。 · 已解决

风险与影响

风险较低:1) 向后兼容性:vllm:num_requests_waiting 语义保持不变,通过求和两个队列保持兼容;2) 性能影响:新增指标记录开销小,不影响核心调度路径;3) 安全无关;4) 兼容性:代码变更纯粹添加,不破坏现有 API 或日志格式。

影响范围:1) 用户:操作员能更精细地监控调度瓶颈,区分容量 vs. 约束问题,提升生产调试能力;2) 系统:指标扩展支持未来细分(如按约束类型),增强可观测性;3) 团队:代码维护简单,测试覆盖充分,无重大学习曲线。

向后兼容性保持 指标初始化一致性已修复 测试覆盖充分

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

本 PR 新增了 vllm:num_requests_waiting_by_reason 标签化指标,将等待请求队列细分为“容量约束”和“延迟约束”,帮助操作员精确诊断调度瓶颈,同时保持向后兼容性,体现了对 Prometheus 最佳实践的遵循。

功能与动机

现有 vllm:num_requests_waiting 指标合并了两种不同请求队列:一是因调度容量不足而等待的请求(waiting 队列),二是因 LoRA 预算、异步 KV 传输等约束被延迟的请求(skipped_waiting 队列)。这导致在生产负载下无法区分负载驱动积压与约束驱动阻塞,如 PR body 所述:“makes it impossible to distinguish load-driven backlog from constraint-driven blocking”。本 PR 旨在通过标签化指标提供细粒度洞察,提升监控和调试能力。

实现拆解

  • vllm/v1/metrics/stats.py:在 SchedulerStats 类中添加 num_waiting_reqsnum_skipped_waiting_reqs 字段,分别记录两个队列的长度。
  • vllm/v1/core/sched/scheduler.py:更新 make_stats() 函数,设置 num_waiting_reqs=len(self.waiting)num_skipped_waiting_reqs=len(self.skipped_waiting)
  • vllm/v1/metrics/loggers.py:定义常量 WAITING_REASON_CAPACITYWAITING_REASON_DEFERRED,创建标签化指标 vllm:num_requests_waiting_by_reason,并更新日志输出,当延迟请求数大于 0 时显示“Deferred: N reqs”。
  • 测试文件:在 tests/v1/core/test_scheduler.py 中添加 test_scheduler_stats_waiting_queues() 验证统计正确性;在 tests/entrypoints/serve/instrumentator/test_metrics.py 中将新指标加入期望列表。

评论区精华

  • 标签化设计采纳:markmc 建议“使用标签化指标模式”,类似 vllm:prompt_tokens_by_source,以遵循 Prometheus 最佳实践并支持未来扩展。该建议被采纳,初始实现从单独指标重构为标签化指标。
  • 术语统一决策:讨论中涉及“skipped” vs “deferred”等术语,最终选择“deferred”作为用户友好标签,明确表示约束延迟。
  • 代码一致性优化:gemini-code-assist[bot] 指出初始化应使用 create_metric_per_engine 工具,后续提交中已修复,确保代码风格统一。

风险与影响

  • 风险:向后兼容性风险极低,原始 vllm:num_requests_waiting 指标通过求和两个队列保持语义不变;性能影响可忽略,仅增加少量指标记录开销;安全无关;兼容性无破坏。
  • 影响:用户(操作员)能更精细监控调度瓶颈,快速识别容量 vs. 约束问题;系统支持未来指标细分(如按 LoRA、KV 传输类型);团队维护简单,测试覆盖充分,无重大学习负担。

关联脉络

本 PR 是 PR #35781 的后续扩展,后者引入了 skipped_waiting 队列。通过标签化指标,进一步提升了监控能力,体现了 vLLM 在指标系统上向 Prometheus 最佳实践的演进。结合近期历史 PR 分析,该变更属于核心调度和监控的持续改进,与类似指标增强 PR(如 #39572 的性能数据导出)形成协同,共同增强系统可观测性。

参与讨论