【发布时间】:2020-09-29 08:02:06
【问题描述】:
我正在运行一个使用 Codeception 进行单元和集成测试的 YII 项目。在我的 Dockerfile 中,我构建的最后一步是使用 RUN ./vendor/bin/codecept run 运行集成测试
我已经设置了 CloudSQL 并将 IP 地址列入白名单,以便 CloudBuild 可以建立与数据库的连接。
在cloudbuild.yaml中,我有第一步构建docker镜像:
- name: gcr.io/cloud-builders/docker
args:
- build
- '--no-cache'
- '-t'
- '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
- .
- '-f'
- Dockerfile
- '--build-arg'
- environmentId=$_GCPENVIRONMENTID
id: Build
当 docker 在 CloudBuild 上运行集成测试 RUN ./vendor/bin/codecept run 时,涉及数据库连接时速度非常慢。当我对我的本地机器进行基准测试时,在连接到同一个 CloudSQL DB 时,它的运行速度至少快了 10 倍。
我已尽我所能隔离问题。 CloudSQL 运行速度很快。 Docker 构建速度很快。但是由于某种原因,从 CloudBuild 到 CloudSQL 的数据库连接真的很慢。这是为什么呢?
CloudSQL 配置
- 数据库:MySQL 8.0.18
- 内核:1vCPU
- 内存:614.4 MB
- 存储:SSD
测试结果
我用 2 个不同的数据库运行了 2 个测试运行。在每次测试运行中,我使用 Cloud Build 和我自己的 localhost 运行。作为对照,我有一个测试脚本,其中包括没有数据库交互的测试。
结果与网络连接的预期结果几乎相同。这两个数据库都托管在新加坡地区。
测试 1 - 谷歌云 SQL
- Cloud Build - 10 秒到 1.5 分钟
- 本地主机 - 1 秒到 4 秒
- 云构建控件 -
- 本地主机控制 -
测试 2 - 数字海洋数据库
- Cloud Build - 10 秒到 1.5 分钟
- 本地主机 - 1 秒到 4 秒
- 云构建控件 -
- 本地主机控制 -
【问题讨论】:
-
要对此进行调查,您能否提供您用于创建 YII 项目的信息来源?这将是有价值的。
-
我有 2 个主要来源,第一个是 Google Cloud Build 中的构建日志,它说明了我运行的每个测试的持续时间。第二个是我自己的本地主机的控制台输出,它说明了完全相同的测试。在这两个测试中,我运行完全相同的数据库和相同的代码。当我查看每个测试的持续时间时,我注意到当测试涉及数据库交互时,它至少慢了 10 倍。那些没有数据库交互的人,Cloud Build 一样快,甚至更快。我在原始问题中添加了更多详细信息。
-
很抱歉给您带来了误会。我的意思是你从哪里获得创建使用 Codeception 的 YII 项目的信息。
-
哦...这是一个私人仓库,在我接手这个项目之前已经配置了代码接收。它基本上在 composer.json 文件中有 "codeception/base": "^2.2.3", "codeception/verify": "~0.3.1" 。测试套件的其余部分位于相应的 /test/ 文件夹中。在本地开发机器和 CloudBuild 上,每个测试运行都按预期运行。不同之处在于测试的持续时间,这在 CloudBuild 中异常长。
-
我无法重现您的场景。看起来这可能是您的项目或配置的问题。我鼓励您使用链接cloud.google.com/support 来获得您需要的支持。
标签: docker google-cloud-sql codeception google-cloud-build