Prhub

#37051 Fix priority preemption regression test in scheduler

原始 PR 作者 ezylopx5 合并时间 2026-04-01 11:36 文件变更 1 提交数 3 评论 22 代码增减 +75 / -63

执行摘要

修复调度器优先级抢占回归测试,替换跳过测试为确定性多步验证。

根据PR body描述,根因是旧测试期望在单个调度步骤后立即抢占,但实际抢占发生在运行请求推进并请求额外KV块之后。因此需要替换跳过的测试,以更健壮和确定性的方式验证优先级调度预emption逻辑。

建议技术管理者关注此PR,因为它展示了如何设计健壮的回归测试以验证核心调度器逻辑。工程师可精读测试函数以理解KV块压力和抢占机制的设计细节。

讨论亮点

review讨论主要集中在测试设计优化:

1) orozery询问循环次数的合理性,ezylopx5调整为动态计算循环边界(基于块分配数学),提升了测试精确性;
2) orozery建议测试应模拟高优先级请求在低优先级之后到达以验证抢占逻辑,最终测试被重写为扁平结构,先运行两个低优先级请求,后加入高优先级请求,确保抢占发生时同时有高低优先级请求在运行;
3) 讨论还涉及update_from_output()不分配块、抢占实际发生在schedule()调用时,澄清了抢占触发机制。

实现拆解

唯一修改的文件是'tests/v1/core/test_scheduler.py',主要改动包括:

1) 移除@pytest.mark.skip注解;
2) 重写test_priority_scheduling_preemption函数,添加详细分阶段注释(Phase 1-3),模拟低优先级请求先运行、高优先级请求后到达的场景;
3) 使用块对齐的令牌数(block_size * 2)避免循环,通过精确的块分配数学计算触发抢占;
4) 添加断言验证抢占和调度结果。

文件 模块 状态 重要度
tests/v1/core/test_scheduler.py v1/core/scheduler 测试 modified 3.0

关键符号

test_priority_scheduling_preemption

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

评论区精华

循环次数的优化 设计

orozery 询问 ' 为什么需要循环 8 次?应精确预测逐出 ',ezylopx5 回应并调整为动态计算循环边界(tokens_to_next_block + 2)。

结论:采用基于块分配数学的动态计算,避免硬编码循环,提高测试精确性。 · 已解决

测试场景设计 正确性

orozery 指出测试应模拟高优先级请求在低优先级之后到达以验证抢占逻辑,确保抢占发生时同时有高低优先级请求在运行。

结论:最终测试重写为扁平结构,先运行低优先级请求,后加入高优先级请求,验证抢占正确性。 · 已解决

风险与影响

风险较低:

1) 回归风险:测试变更可能影响现有测试覆盖率,但PR旨在修复无效测试,提高可靠性;
2) 兼容性风险:无,仅修改测试代码,不影响生产逻辑;
3) 性能风险:无,测试运行时间微小变化。

影响范围有限:

1) 对用户:无直接影响,这是内部测试改进;
2) 对系统:提高调度器优先级抢占逻辑的测试信心,有助于预防未来回归;
3) 对团队:增强测试可维护性和确定性,减少调试时间。

测试覆盖变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论