执行摘要
- 一句话:将每周 CI 测试 est_time 更新调整到周一执行,并改用 p90 百分位数和更大样本窗口优化负载均衡。
- 推荐动作:此 PR 值得负责 CI 基础设施的工程师精读,特别是关注
scripts/ci/update_est_time.py 中的统计学方法和阈值设计,这些决策直接影响测试调度的准确性和效率。对于其他开发者,了解此变更有助于理解 CI 测试时间估计的更新机制。
功能与动机
PR body 中说明了三个优化动机:
1) 调度时间从周六 00:00 UTC 移至周一 00:00 UTC,使得刷新 PR 在工作周开始时落地,便于在工作时间审查而非闲置周末;
2) 估计方法从 median-of-last-10 改为 p90-of-last-15,因为中位数低估了偶尔峰值的测试,导致 LPT 下延迟任务主导总时长,p90 偏向于慢速但合理的尾部,且更大的窗口减少了噪声;
3) 自动生成的 PR body 现在包含显著 est_time 变更表,让审查者无需 diff 文件即可查看差异。
实现拆解
- 调整调度时间:在
.github/workflows/weekly-update-est-time.yml 中,将 cron 表达式从 '0 0 * * 6' 改为 '0 0 * * 1',从周六移到周一 UTC 零点。
- 修改时间估计逻辑:在
scripts/ci/update_est_time.py 中,将 TARGET_DATA_POINTS 从 10 增加到 15,MAX_RUNS 从 20 增加到 25;将 compute_medians 函数重命名为 compute_p90,使用 statistics.quantiles 计算 90% 百分位数。
- 添加变更总结功能:在脚本中添加新的辅助函数
is_significant 和 write_summary,基于绝对和相对阈值(|Δ| ≥ 30s 且 |Δ|/old ≥ 30%)识别显著变更,并生成 Markdown 表格。
- 更新工作流以生成总结文件:在工作流文件中,修改运行命令以传递
--summary-file /tmp/est_time_summary.md 参数,并在创建 PR 时使用 --body-file 包含总结内容。
- 配套调整:脚本中的
update_est_times 函数现在返回变更列表,用于生成总结;工作流中 PR body 的生成逻辑改为从文件中读取。
关键文件:
scripts/ci/update_est_time.py(模块 CI 脚本;类别 infra;类型 infrastructure;符号 compute_medians, compute_p90, update_est_times, is_significant): 这是核心逻辑文件,负责解析 CI 运行日志、计算时间估计并更新测试注册文件中的 est_time 值,变更直接影响负载均衡算法的基础数据。
.github/workflows/weekly-update-est-time.yml(模块 工作流配置;类别 infra;类型 infrastructure): 这是 GitHub Actions 工作流配置文件,定义了每周自动更新 est_time 的触发条件和执行步骤,变更涉及调度时间和 PR 生成逻辑。
关键符号:compute_p90, update_est_times, is_significant, write_summary
关键源码片段
scripts/ci/update_est_time.py
这是核心逻辑文件,负责解析 CI 运行日志、计算时间估计并更新测试注册文件中的 est_time 值,变更直接影响负载均衡算法的基础数据。
def compute_p90(timings):
"""Compute 90th percentile of last TARGET_DATA_POINTS timings for each entry.
Returns dict mapping (rel_path, suite, backend) -> p90 (int).
Only includes entries with >= MIN_DATA_POINTS data points.
"""
p90s = {}
for key, values in timings.items():
recent = values[:TARGET_DATA_POINTS] # 取最近 TARGET_DATA_POINTS 个数据点
if len(recent) < MIN_DATA_POINTS:
continue # 数据点不足,跳过此项
# 使用 statistics.quantiles 计算 90% 百分位数(索引 8 对应 n=10)
p90s[key] = round(statistics.quantiles(recent, n=10, method="inclusive")[8])
return p90s
评论区精华
此 PR 没有 review 评论,表明变更较为直接或已通过内部讨论。
风险与影响
- 风险:主要风险在于估计方法的改变可能影响 CI 测试的调度效率。从 median 改为 p90 可能导致
est_time 值偏高,增加 LPT 负载均衡中分配给测试的预算,从而可能减少并行度或增加总运行时间。此外,更大的样本窗口(15 runs)依赖于足够的成功运行数据,如果 CI 运行不稳定,可能导致估计不准确。脚本中的显著性阈值(30s 和 30%)是硬编码的,可能不适用于所有测试场景。但总体风险较低,因为这只是自动化工具,不直接影响生产代码。
- 影响:对用户无直接影响,因为这是内部 CI 流程。对系统影响:优化了 CI 测试的负载均衡,减少了因低估测试时间导致的延迟,从而可能提高 CI 运行效率和稳定性。对团队影响:周一生成 PR 便于及时审查,自动总结表格减少了审查工作量,提升了开发体验。影响范围限于 CI 基础设施,程度为中等。
- 风险标记:估计方法变更可能影响调度, 依赖足够 CI 运行数据, 硬编码阈值
关联脉络
- PR #23119 [CI] Add per-job uv venv isolation and upgrade CI version to Cuda 13: 同为 CI 基础设施优化,展示了团队在提升 CI 环境一致性和依赖管理方面的持续努力。
- PR #23108 Update CI_PERMISSIONS: 涉及 CI 权限配置,反映团队在 CI 自动化流程上的维护和调整。
参与讨论