gitlab-ci - 为什么 GitLab docker-windows 执行器这么慢?
问题描述
当我运行一个全新的 git 存储库时,仅使用README.md
和.gitlab-ci.yml
使用 GitLab 中的标准shell
执行器,整个作业需要 4 秒。当我使用 docker-windows 执行器执行相同操作时,需要 33 秒!
我的.gitlab-ci.yml
:
no_git_nor_submodules:
image: base_on_python36:ltsc2019
stage: build
tags:
- docker-windows
variables:
GIT_SUBMODULE_STRATEGY: none
GIT_STRATEGY: none
script:
- echo test
no_docker_no_git_nor_submodules:
stage: build
tags:
- normal_runner
variables:
GIT_SUBMODULE_STRATEGY: none
GIT_STRATEGY: none
script:
- echo test
我认为可能的一个问题是 Windows 上的 docker 映像往往很大。我在这里测试过的是 5.8 GB。当我在服务器上手动启动一个容器时,它只需要几秒钟就可以启动。我还测试了更大的图像,36 GB,但使用该图像的作业也需要大约 33 秒。
由于这些作业什么都不做,也没有任何 git clone 或子模块,所以需要时间的是什么?
我知道 GitLab 使用一个神秘的帮助图像来克隆 git 存储库和其他类似的东西。会不会是这张图片让它运行起来超级慢?
2019-11-04 更新
我用docker events
. 它显示 GitLab 总共启动了 7 个容器,其中 6 个是它们自己的辅助镜像和一个我在.gitlab-ci.yml
. 这些 docker 容器中的每一个都需要大约 5 秒的时间来创建、运行和销毁,这就解释了时间。现在唯一的问题是,这是否是docker-windows
执行程序的正常行为,或者我是否设置了错误的方法,这使得它变得超级慢。
解决方案
简短回答:Windows 上的 Docker 在启动新容器时开销很大,GitLab 每个作业使用 7 个容器。
我在这里打开了一个关于 GitLab 的问题,但我也会从这里发布我的部分文本:
我现在对此进行了更多研究,我想我至少已经弄清楚了发生了什么。有一个可以运行的命令,docker events。这将打印为 docker 执行的所有命令,创建/销毁容器/卷等。我运行了这个命令,然后使用 docker-windows 执行程序开始了一个简单的工作。输出是这样的(清理并过滤了一下):
2019-11-04T16:19:02.179255700+01:00 container create image=sha256:6aff8da9cd6b656b0ea3bd4e919c899fb4d62e5e8ac95b876eb4bfd340ed8345, name=runner-Q1iF4bKz-project-305-concurrent-0-predefined-0)
2019-11-04T16:19:07.217784200+01:00 container create image=sha256:6aff8da9cd6b656b0ea3bd4e919c899fb4d62e5e8ac95b876eb4bfd340ed8345, name=runner-Q1iF4bKz-project-305-concurrent-0-predefined-1)
2019-11-04T16:19:13.190800700+01:00 container create image=sha256:6aff8da9cd6b656b0ea3bd4e919c899fb4d62e5e8ac95b876eb4bfd340ed8345, name=runner-Q1iF4bKz-project-305-concurrent-0-predefined-2)
2019-11-04T16:19:18.183059500+01:00 container create image=sha256:6aff8da9cd6b656b0ea3bd4e919c899fb4d62e5e8ac95b876eb4bfd340ed8345, name=runner-Q1iF4bKz-project-305-concurrent-0-predefined-3)
2019-11-04T16:19:23.192798200+01:00 container create image=sha256:b024a0511db77bf777cee287927151584f49a4018798a2bb1aa31332b766cf14, name=runner-Q1iF4bKz-project-305-concurrent-0-build-4)
2019-11-04T16:19:26.221921000+01:00 container create image=sha256:6aff8da9cd6b656b0ea3bd4e919c899fb4d62e5e8ac95b876eb4bfd340ed8345, name=runner-Q1iF4bKz-project-305-concurrent-0-predefined-5)
2019-11-04T16:19:31.239818900+01:00 container create image=sha256:6aff8da9cd6b656b0ea3bd4e919c899fb4d62e5e8ac95b876eb4bfd340ed8345, name=runner-Q1iF4bKz-project-305-concurrent-0-predefined-6)
一共创建了7个容器,其中6个是gitlab helper image。请注意,每个 gitlab 图像助手创建大约需要 5 秒。6 * 5 秒 = 30 秒,关于我注意到的额外开销。
我也在 5 个月前再次测试了性能,我们的 shell 执行器需要 2 秒来回显一条消息。docker executor 需要 21 秒来完成相同的作业。开销比两年前要少,但仍然很重要。
推荐阅读
- html - html模板中的wagtail svg未呈现
- c# - C# log4net 多用途文件日志记录
- mysql - SELECT * FROM 动态检索表名
- elasticsearch - 如何对弹性搜索中的字段求和并移动另一个索引
- javascript - 在单个 HTML 文档中创建不同的页面视图时出现问题?
- go - 与 gRPC 客户端重新连接的正确方法
- reactjs - spotify API 的问题,返回未定义的流派响应,(在成功的初始授权请求后)
- zapier - 支持多个文件的 Zapier 操作
- python - 字典不让我 .get() 给定键
- redux - 如何在 Next.js 中保持 redux 状态而不阻塞 SSR?