【问题标题】:500 on Google Cloud Run: The request failed because the instance could not start successfullyGoogle Cloud Run 上的 500:请求失败,因为实例无法成功启动
【发布时间】:2020-03-07 18:00:06
【问题描述】:

我正在对托管在 Google Cloud Run 上的 ExpressJS 应用进行负载测试,当流量激增时,有一段时间我在 Stackdriver 中看到许多 500 错误,并显示消息“请求失败,因为实例无法启动成功地。” - 这实际上会导致服务器停机。

看到随着应用程序的扩展,此错误会更频繁地发生,我认为这是由于 Cloud Run 负载均衡器在这些实例准备好接受请求之前过早地将流量分配给新实例造成的。

随着我继续运行负载测试,实例不断重复地被杀死和重启,所以在负载开启时没有恢复机制。

我没有从我的 NodeJS 应用程序中看到任何错误日志,这表明实际上没有一个失败的请求到达我的应用程序。

我可以做些什么来避免这些错误?

Cloud Run 如何确定端口已准备好接受请求?

是我在我的 ExpressJS 应用程序中配置错误,还是我可以在向新实例发送请求之前以某种方式延迟 Cloud Run?

【问题讨论】:

  • 当您说您在应用程序日志中看不到错误时...您能对此进行扩展吗?您是否在任何 Stackdriver 日志记录中看到任何错误?
  • 抱歉含糊不清。我在 Stackdriver 中看到许多状态为 500 的错误日志,其中显示“请求失败,因为实例无法成功启动”。但我没有看到从我的 NodeJS 应用程序记录的任何错误。
  • 事实证明这完全是由其他原因引起的...我的应用程序连接到一个 Cloud SQL 实例,该实例的最大连接限制为 100。但是,自动缩放会推送该数量在负载测试期间,实例数量远远超过 100,这会导致实例初始化失败,因为无法连接到 Cloud SQL。我现在看到这已作为 Cloud SQL 的一部分记录在 cloud.google.com/sql/docs/postgres/…
  • 您可以使用--max-instances 参数来限制生成实例的数量并节省您的资源
  • 我投票决定将此问题作为题外话结束,因为问题原来是其他问题。

标签: google-cloud-run


【解决方案1】:

事实证明,这是由 Cloud Run 自动缩放最大实例限制和 Cloud SQL 的连接限制共同造成的。

我正在运行一个小型 Cloud SQL Postgres 实例 (3.75 GB / 1 vCPU),它的默认连接限制为 100。(https://cloud.google.com/sql/docs/quotas)

默认情况下,Cloud Run 为自动扩缩分配最大实例数 1000。在负载测试期间,请求计数的突然激增推动自动缩放创建数百个实例,这很快耗尽了 Cloud SQL 连接限制 100。

记录了 Cloud SQL 的确切场景:https://cloud.google.com/sql/docs/postgres/connect-run#connection_limits_3(如果 Cloud Run 上也记录了这一点,那就太好了,发生此问题时我没有立即想到查找有关 Cloud SQL 的文档)

解决方案是将 Cloud Run 上的最大实例计数限制为可容忍的数字,并调整 Cloud SQL 上的资源分配/最大连接限制。确切的配置显然取决于预期的负载水平。

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 2019-11-10
    • 1970-01-01
    • 2021-11-22
    • 2020-02-17
    • 1970-01-01
    • 2021-12-26
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多