GitHub Actions 提供了强大的工具来自动化 CI/CD 管道。但是,运行缓慢可能会令人沮丧。本指南对 GitHub Actions 工作流程性能进行了详尽的评估,并提出了有效的缓解策略。
提示
调试 GitHub 操作时遇到困难?试试我们的免费工具WarpBuild 的 Action Debugger,它允许通过 SSH 对正在运行的工作流进行实时调试。
如果您刚刚开始进行 GitHub Actions 性能优化,那么您应该做以下 3 件事:
缓存依赖项:通过避免重复依赖项下载来减少构建时间。
并行作业:通过同时运行作业来加速工作流程。
使用强大的运行器:对于密集型任务,具有高规格硬件的定制运行器是有益的。
以下是可能影响 GitHub Action 性能的因素的综合列表,以及示例和缓解策略。
描述:具有许多步骤或复杂逻辑的工作流可能需要更长时间才能执行。
示例:包含多个构建过程、跨不同环境的测试和部署步骤的工作流程可能会非常耗时。
缓解措施:通过将工作流程分解为更小、更集中的工作来简化工作流程。使用条件步骤避免不必要的运行。
描述:未针对性能进行优化的脚本可能会减慢工作流程。
示例:不利用缓存或增量构建的编译代码的构建脚本。
缓解:重构脚本以提高效率,尽可能使用缓存,并删除冗余操作。
描述:不必要或过于频繁地启动工作流的触发器可能会导致延迟。
示例:设置为每次推送时触发的工作流(包括文档更新)可能会导致不必要的构建。
缓解:仔细配置触发器,例如仅在特定分支或特定类型的更改上触发工作流。
描述:大型或大量的构建工件和日志可能会减慢操作速度。
示例:每次构建后保存大量日志或大型二进制文件会消耗大量存储和带宽。
缓解措施:实施日志轮换、压缩工件并仅保留必要的工件。如果使用自托管运行器,默认的 GitHub 缓存可能会非常慢。考虑托管您自己的缓存服务器和/或更接近计算的工件注册表。
描述:具有大量历史记录或大型文件的大型存储库需要更长的时间来克隆和处理。
示例:包含千兆字节历史数据和大型二进制文件的存储库克隆起来会很慢。
缓解措施:使用 Git LFS 处理大文件、修剪旧分支并压缩存储库历史记录。
描述:具有许多依赖项和模块的复杂应用程序需要更多时间来构建。
示例:具有数十个依赖项和多模块结构的项目。
缓解:优化构建过程、使用依赖项缓存并模块化代码库。
描述:获取大量或众多的外部依赖项可能非常耗时。
示例:下载数百个 npm 包或大型 Docker 镜像的构建过程。
缓解:缓存依赖项并考虑使用支持有效依赖项解析的包管理器。
描述:运行器的 CPU 和内存有限可能会减慢密集任务的速度。
示例:在仅具有 2 个 CPU 核心和有限 RAM 的运行器上编译大型应用程序。
缓解措施:优化代码以提高资源效率或使用具有更好规格的自托管运行器。
描述:磁盘速度和容量影响涉及大量读/写操作的任务。
示例:涉及处理存储在磁盘上的大型数据集的工作流程。
缓解:优化磁盘使用情况,考虑在磁盘上存储更少的数据,或使用具有更快磁盘的自托管运行器。
描述:有限的网络速度可能会延迟需要数据传输的任务。
示例:上传大型构建工件或从注册表中提取大型 Docker 镜像。
缓解措施:传输前压缩数据,减少工件的大小,并使用 Docker 层缓存。
描述:依赖外部服务或 API 可能会导致延迟。
示例:对外部 API 进行大量调用的工作流可能会很慢或受到速率限制。
缓解措施:尽量减少外部 API 调用,实现带有退避的重试逻辑,并使用模拟进行测试。
描述:一般互联网连接问题或特定网络问题可能会导致延迟。
示例:由于跑步者所在地区的网络性能不佳而导致速度减慢。
缓解措施:如果问题持续存在,请考虑在不同地区使用具有更好连接性的自托管运行器。
描述:GitHub 或第三方服务的问题可能会影响工作流程性能。
示例:由于 GitHub 服务中断而导致延迟或失败。
缓解:实施错误处理和重试机制,随时了解服务状态。
描述:达到工作流中使用的外部 API 或服务的速率限制。
示例:超出构建过程中使用的第三方服务的 API 速率限制。
缓解:优化 API 使用,尽可能缓存响应,并适当处理速率限制错误。
描述:有效使用缓存可以显著减少构建时间。
示例:每次运行时重建依赖项可能非常耗时。使用缓存的依赖项可加快该过程。
缓解:对依赖项、构建输出和其他可重用数据实现缓存,以避免不必要的重复。
描述:并行运行任务可以减少整体工作流程的持续时间。
示例:顺序执行测试可能会很慢。在不同的运行器上并行运行测试可以加快速度。
缓解:将工作流程分解为可并行的作业,并使用矩阵策略进行跨环境测试。
描述:GitHub 内部的资源分配会影响性能。
示例:在高峰时段,资源争用可能会减慢工作流程。
缓解:优化工作流程,利用可用资源高效运行,并考虑非高峰调度。
描述:定制的硬件规格可以满足特定的性能需求。
示例:需要高 CPU 和 RAM 的工作流程在 GitHub 托管的运行器上可能会很慢。对于磁盘密集型工作负载和需要 GPU 的工作流程尤其如此。
缓解措施:为密集的工作流程设置具有定制资源的自托管运行器。
描述:并发工作流数量的限制可能会延迟执行。
示例:如果多个工作流排队,后续工作流将等待,从而导致延迟。
缓解:优化工作流程触发器和持续时间,以最大限度地减少排队延迟。
描述:GitHub 可能会限制资源以管理平台稳定性。
示例:在需求量大时可能会发生限制,从而影响性能。
缓解:设计工作流程,使其在不同资源可用条件下高效运行。
描述:GitHub 的基础设施变化可能会暂时影响性能。
例如:升级或维护活动可能会减慢或中断服务。
缓解措施:随时了解 GitHub 更新,并在预定的维护期间制定替代策略。
描述:环境变量的管理影响工作流程的效率。
示例:配置错误的环境变量,例如CI、DEBUG和LOGLEVEL变量,可能会导致错误或效率低下。
缓解措施:定期审查和优化环境变量的使用,确保有效且安全地使用它们。
通过解决这些因素,可以有效地管理资源,适应平台限制,并对 GitHub 基础设施的变化保持响应,从而提高 GitHub Action 的性能。
GitHub Actions 运行器中使用的处理器未针对 CI 和构建工作负载进行优化。它们是专为高性能计算和数据中心工作负载而设计的服务器级处理器。下表比较了 GitHub Actions 运行器中使用的处理器的规格(2023-11-13)。从约 100 次运行的轶事抽样来看,AMD EPYC 7763 64 核处理器似乎是 GitHub Actions 运行器中最常用的处理器。
处理器型号
班级
插座
时钟速度
涡轮速度
核心/线程
典型 TDP
缓存大小
平均 CPU 分数
单线程评级
AMD EPYC 7763 64 核处理器
服务器
SP3
2.5 GHz
3.5 GHz
64/128
280 瓦
L1:8128 KB,L2:63.5 MB,L3:512 MB
86194
2577
英特尔至强铂金 8171M @ 2.60GHz
服务器
FCLGA3647
2.6 GHz
3.7 GHz
26/52
165 瓦
L1:1664 KB,L2:26.0 MB,L3:36 MB
30632
2222
英特尔至强铂金 8272CL @ 2.60GHz
服务器
FCLGA3647
2.7 GHz
4.0 GHz
26/52
205 瓦
L1:1664 KB,L2:26.0 MB,L3:36 MB
52386
2382
英特尔至强铂金 8370C @ 2.80GHz
服务器
FCLGA4189
2.9 GHz
3.5 GHz
32/64
300 瓦
–
55705
2479
英特尔至强 CPU E5-2673 v4 @ 2.30GHz
服务器
FCLGA2011-3
2.3 GHz
3.3 GHz
20/40
135 瓦
L1:1280 KB,L2:5.0 MB,L3:50 MB
21576
2079
为了进行比较,以下是一些流行台式机处理器的规格:
处理器型号
班级
插座
时钟速度
涡轮速度
核心/线程
典型 TDP
缓存大小
平均 CPU 分数
单线程评级
苹果 M3 8 核
台式电脑、笔记本电脑
4.0 GHz
不适用
8 核,8 线程
19247
4822
英特尔酷睿 i9-14900KF
桌面
联邦通信委员会GA1700
3.2 GHz
6.0 GHz
24 个核心,32 个线程
125 瓦
L1:2176 KB,L2:32.0 MB,L3:36 MB
61135
4798
英特尔酷睿 i9-13900KS
桌面
联邦通信委员会GA1700
3.2 GHz
6.0 GHz
24 个核心,32 个线程
150 瓦
L1:2176 KB,L2:32.0 MB,L3:36 MB
61924
4764
英特尔酷睿 i7-14700KF
桌面
联邦通信委员会GA1700
3.4 GHz
5.6 GHz
20 个核心,28 个线程
125 瓦
L1:1792 KB,L2:28.0 MB,L3:33 MB
54073
4541
苹果 A17 Pro
移动/嵌入式
3.8 GHz
不适用
6 核,6 线程
12208
4515
然而,它们并不是等价的比较,因为桌面和移动处理器可以具有异构核心,这些核心针对不同的工作负载进行了优化。WarpBuild 为运行器提供了高性能处理器,这些处理器针对 CI 进行了优化,并构建了具有快速磁盘 IO 和改进的缓存的工作负载。您可以在此处了解有关我们托管的运行器的更多信息。
提高 GitHub Actions 的速度不只是调整一些设置;它涉及工作流程管理和资源优化的整体方法。通过了解潜在因素,您将能够更高效、更快速地运行 GitHub Actions。