Prhub

#23120 ci: run weekly est_time update on Monday using p90 of last 15 runs

原始 PR 作者 ch-wan 合并时间 2026-04-20 05:39 文件变更 2 提交数 3 评论 1 代码增减 +100 / -34

执行摘要

将每周 CI 测试 est_time 更新调整到周一执行,并改用 p90 百分位数和更大样本窗口优化负载均衡。

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 文件即可查看差异。

此 PR 值得负责 CI 基础设施的工程师精读,特别是关注 scripts/ci/update_est_time.py 中的统计学方法和阈值设计,这些决策直接影响测试调度的准确性和效率。对于其他开发者,了解此变更有助于理解 CI 测试时间估计的更新机制。

讨论亮点

此 PR 没有 review 评论,表明变更较为直接或已通过内部讨论。

实现拆解

  1. 调整调度时间:在 .github/workflows/weekly-update-est-time.yml 中,将 cron 表达式从 '0 0 * * 6' 改为 '0 0 * * 1',从周六移到周一 UTC 零点。
  2. 修改时间估计逻辑:在 scripts/ci/update_est_time.py 中,将 TARGET_DATA_POINTS 从 10 增加到 15,MAX_RUNS 从 20 增加到 25;将 compute_medians 函数重命名为 compute_p90,使用 statistics.quantiles 计算 90% 百分位数。
  3. 添加变更总结功能:在脚本中添加新的辅助函数 is_significantwrite_summary,基于绝对和相对阈值(|Δ| ≥ 30s 且 |Δ|/old ≥ 30%)识别显著变更,并生成 Markdown 表格。
  4. 更新工作流以生成总结文件:在工作流文件中,修改运行命令以传递 --summary-file /tmp/est_time_summary.md 参数,并在创建 PR 时使用 --body-file 包含总结内容。
  5. 配套调整:脚本中的 update_est_times 函数现在返回变更列表,用于生成总结;工作流中 PR body 的生成逻辑改为从文件中读取。
文件 模块 状态 重要度
scripts/ci/update_est_time.py CI 脚本 modified 6.94
.github/workflows/weekly-update-est-time.yml 工作流配置 modified 4.53

关键符号

compute_p90 update_est_times is_significant write_summary

关键源码片段

scripts/ci/update_est_time.py infrastructure

这是核心逻辑文件,负责解析 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

评论区精华

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

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

风险与影响

主要风险在于估计方法的改变可能影响 CI 测试的调度效率。从 median 改为 p90 可能导致 est_time 值偏高,增加 LPT 负载均衡中分配给测试的预算,从而可能减少并行度或增加总运行时间。此外,更大的样本窗口(15 runs)依赖于足够的成功运行数据,如果 CI 运行不稳定,可能导致估计不准确。脚本中的显著性阈值(30s 和 30%)是硬编码的,可能不适用于所有测试场景。但总体风险较低,因为这只是自动化工具,不直接影响生产代码。

对用户无直接影响,因为这是内部 CI 流程。对系统影响:优化了 CI 测试的负载均衡,减少了因低估测试时间导致的延迟,从而可能提高 CI 运行效率和稳定性。对团队影响:周一生成 PR 便于及时审查,自动总结表格减少了审查工作量,提升了开发体验。影响范围限于 CI 基础设施,程度为中等。

估计方法变更可能影响调度 依赖足够 CI 运行数据 硬编码阈值

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论