为什么 GitLab docker-windows 执行器这么慢?
Why is GitLab docker-windows executor so slow?
当我 运行 一个全新的 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 克隆或子模块,所以需要时间吗?
我知道 GitLab 使用一个神秘的帮助图像来克隆 git 存储库和其他类似的东西。难道是这张图片让它变得超级慢 运行?
更新2019-11-04
我使用 docker events
对此进行了更深入的研究。它显示 GitLab 总共启动了 7 个容器,其中 6 个是它们自己的辅助镜像,还有一个是我在 .gitlab-ci.yml
中定义的镜像。这些 docker 个容器中的每一个都需要大约 5 秒的时间来创建、运行 和销毁,所以这解释了时间。现在唯一的问题是,这是否是 docker-windows
执行程序的正常行为,或者我是否以错误的方式设置了某些东西,导致速度非常慢。
简短回答:Windows 上的 Docker 在启动新容器时开销很高,GitLab 每个作业使用 7 个容器。
我在 GitLab here 上打开了一个问题,但我也会 post 此处的部分文本:
我现在对此进行了更深入的研究,我想我至少已经弄清楚了部分正在发生的事情。有一个命令可以 运行、docker 事件。这将打印为 docker、creating/destroying containers/volumes 等执行的所有命令。我 运行 这个命令,然后使用 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镜像。请注意创建每个 gitlab 图像助手大约需要 5 秒。 6 * 5 秒 = 30 秒,关于我注意到的额外开销。
5 个月前我也再次测试了性能,我们的 shell 执行器只用了 2 秒来回显一条消息。 docker 执行器执行相同的作业需要 21 秒。开销比两年前少,但仍然很大。
当我 运行 一个全新的 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 克隆或子模块,所以需要时间吗?
我知道 GitLab 使用一个神秘的帮助图像来克隆 git 存储库和其他类似的东西。难道是这张图片让它变得超级慢 运行?
更新2019-11-04
我使用 docker events
对此进行了更深入的研究。它显示 GitLab 总共启动了 7 个容器,其中 6 个是它们自己的辅助镜像,还有一个是我在 .gitlab-ci.yml
中定义的镜像。这些 docker 个容器中的每一个都需要大约 5 秒的时间来创建、运行 和销毁,所以这解释了时间。现在唯一的问题是,这是否是 docker-windows
执行程序的正常行为,或者我是否以错误的方式设置了某些东西,导致速度非常慢。
简短回答:Windows 上的 Docker 在启动新容器时开销很高,GitLab 每个作业使用 7 个容器。
我在 GitLab here 上打开了一个问题,但我也会 post 此处的部分文本:
我现在对此进行了更深入的研究,我想我至少已经弄清楚了部分正在发生的事情。有一个命令可以 运行、docker 事件。这将打印为 docker、creating/destroying containers/volumes 等执行的所有命令。我 运行 这个命令,然后使用 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镜像。请注意创建每个 gitlab 图像助手大约需要 5 秒。 6 * 5 秒 = 30 秒,关于我注意到的额外开销。
5 个月前我也再次测试了性能,我们的 shell 执行器只用了 2 秒来回显一条消息。 docker 执行器执行相同的作业需要 21 秒。开销比两年前少,但仍然很大。