繁体   English   中英

如何修复 CloudRun 错误“请求已中止,因为没有可用实例”

[英]How to fix CloudRun error 'The request was aborted because there was no available instance'

我正在使用托管 CloudRun 来部署concurrency=1的容器。 部署后,我将并行触发四个长时间运行的请求。 大多数时候,一切正常——但偶尔,我会在几秒钟内面对来自其中一个节点的 500; 日志仅提供主题中提供的错误消息。

使用带指数退避的重试并没有改善这种情况; 重试也以 500 秒结束。 StackDriver 日志也不提供更多信息。

可能相关gcloud beta run deploy参数:

--memory 2Gi --concurrency 1 --timeout 8m --platform managed

错误消息的确切含义是什么——我该如何解决这个问题?

当基础设施的扩展速度不足以赶上流量高峰时,可能会出现此错误消息。 基础设施只会将请求保留在队列中一段时间​​(大约 10 秒),然后中止它。

这通常发生在:

  1. 流量突然大幅增加
  2. 冷启动时间长
  3. 请求时间长

我也试验了这个问题。 易于复制。 我有一个以 6s fibo(45) 处理的斐波那契容器。 我使用 Hey 执行 200 个请求。 我将 Cloud Run 并发设置为 1。

超过 200 个请求我有 8 个类似的错误。 就我而言:突然的流量高峰和长时间的处理时间。 (对我来说是短暂的冷启动,它在 Go 中)

当工作时间内流量突然增加时,我们也遇到了这个问题。 该问题通常是由于流量突然增加和更长的实例启动时间来适应传入请求造成的。 处理此问题的一种方法是保持预热实例始终运行,即在 cloud run deploy 命令中配置 --min-instances 参数。 另一种推荐的方法是减少服务冷启动时间(这在某些语言如 Java 和 Python 中很难实现)

我能够通过将最大自动缩放容器数从 2 提高到 10 来解决我的服务上的这个问题。对于流量来说,2 真的没有理由甚至太低,但我怀疑有关 Cloud Run 内部的某些东西是以某种方式最多捆绑 2 个容器。

Max Retry Attempts设置为零以外的任何值都可以解决这个问题,就像它对我所做的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM