首页 > 解决方案 > 为什么 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执行程序的正常行为,或者我是否设置了错误的方法,这使得它变得超级慢。

标签: gitlab-cigitlab-ci-runner

解决方案


简短回答: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 秒来完成相同的作业。开销比两年前要少,但仍然很重要。


推荐阅读