为什么 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 秒。开销比两年前少,但仍然很大。