为什么GitLab的docker-windows执行器如此缓慢?

4
当我在GitLab中运行一个全新的git仓库,只有README.md.gitlab-ci.yml文件,并使用标准的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执行程序的正常行为,还是我设置有误导致运行非常缓慢。

1
哇,2年了还是零回复。你有没有得到答案? - PilotBob
我在GitLab上开了一个问题,这只是Windows上docker的工作方式。我认为这不是GitLab的重点关注领域,因为我想大多数构建任务都在Linux上运行。 - MrBerta
1个回答

1

简短回答:在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助手镜像。请注意每个GitLab助手镜像的创建时间约为5秒。6 * 5秒=30秒,这就是我注意到的额外开销。


我在5个月前再次测试了性能,我们的shell执行器仅需2秒钟就可以回显一条消息。相同的任务,docker执行器需要21秒钟。虽然开销比两年前少了,但仍然很大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接