预提交缓慢排查指南

Beam 预提交作业是在 Jenkins 构建机器上为提交到 apache/beam 的每个拉取请求 (PR) 自动运行的测试套件。有关更多信息以及预提交和提交后提交之间的区别,请参阅 测试

什么是快速预提交?

预提交测试是在合并拉取请求 (PR) 之前必须通过的测试。当这些测试速度慢时,它们会减慢 Beam 的开发过程。目标是让 95% 的预提交作业在 30 分钟内完成(无论成功或失败)。

从技术上讲,过去 4 周的运行时间第 95 个百分位数应低于 30 分钟,其中运行时间是作业在 Jenkins 队列中花费的时间 + 实际运行时间。

确定缓慢

有两个主要迹象表明速度慢

  1. 预提交作业在 30 分钟后超时。这可以从作业的控制台日志中确定。
  2. 预提交没有超时,但预提交结果的总等待时间 >30m。

预提交仪表盘

Beam 社区指标网站包含一个 预提交测试 仪表盘,显示作业时间趋势。您可以修改时间窗口(默认值为 7 天)或通过单击特定测试套件来过滤到特定测试套件。

example pre-commit duration dashboard

排查流程

  1. 搜索现有问题
  2. 如果需要,创建一个新问题:GitHub 问题
  1. 确定缓慢的来源并识别问题。如果需要(例如多个问题),请打开其他问题。
  2. 根据情况分配问题,例如分配给测试或 PR 的作者。

解决

快速修复缓慢的预提交测试非常重要。有关详细信息,请参阅 预提交测试策略

可能的因素和解决方案

本节列出了一些修复预提交缓慢的起点。

资源耗尽

查看 Jupyter 笔记本中的图表。总持续时间的上升是否与排队时间的上升相匹配?如果是,则缓慢可能与特定预提交作业无关。

总持续时间和排队持续时间一起上升和下降(大部分)的示例:预提交时间的图表

由于 Jenkins 机器是有限的资源,其他作业会影响预提交排队时间。尝试找出其他作业是否最近变慢、频率增加或引入了新作业。

另一个选择是考虑添加更多 Jenkins 机器。

单个测试缓慢

有时,预提交作业会因一个或多个测试而变慢。确定这种情况的一种方法是查看单个测试时间。

在哪里查找单个测试时间

有时可以通过重构来加快测试速度。花费大量时间等待的测试(例如集成测试)可以与其他测试同时运行。

如果确定测试速度太慢而无法作为预提交测试的一部分,则应将其从预提交中删除并放到提交后提交中。此外,请确保删除的测试覆盖的代码 由预提交中的单元测试覆盖

集成测试缓慢

集成测试缓慢可能是由依赖服务造成的。

参考资料