【问题标题】:Why is database connection in Google Cloud Build slow?为什么 Google Cloud Build 中的数据库连接速度很慢?
【发布时间】: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


【解决方案1】:

我认为 Cloud Build 受网络限制(至少对 Cloud SQL 而言)为 ~16kbps 入口和 ~2kbps 出口。我注意到无论我为我的 Cloud SQL MySQL 实例使用什么实例类,当我运行单元测试时,我都会看到不同的 CPU 和内存使用情况,但网络流量相同。我也尝试过使用不同的 Cloud Build machine-type 值,甚至大型 CPU/大型内存类型也会导致相同的测试时间(慢)。

【讨论】:

    【解决方案2】:

    我与 Google 支持部门取得了联系。似乎所有 Cloud Build 触发器都在 us-central1 上运行。连接到 us-central1 以外的区域会降低网络性能。至于我的情况,由于我的数据库位于新加坡地区,我会遇到严重的性能损失。

    目前有一种方法可以将所有 Cloud Build 移植到其他选定区域。遗憾的是,此功能仍处于测试阶段,新加坡不在可以运行 Cloud Build 的选定区域中。

    如果您有幸身处支持 Cloud Build 测试版的地区,您可以通过 https://docs.google.com/forms/d/e/1FAIpQLSdAkLtvPUQFCgAUcHUi1VDHn_GaQz_sDOvFxpg3JXIJdIZY6g/viewform 注册加入等候名单

    这个答案并不完全是一个解决方案,但我希望它可以为问题的原因提供一些见解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 2019-05-30
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多