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

34
我正在使用托管的CloudRun来部署一个concurrency=1容器。一旦部署完成,我会同时发送四个长时间运行的请求。
大部分时间都很好,但偶尔会在几秒钟内从其中一个节点面临500错误;日志只提供了主题中提供的错误消息。
使用带有指数回退的重试并没有改善情况; 重试也以500结束。StackDriver日志也没有提供更多信息。
可能相关的gcloud beta run deploy参数: --memory 2Gi --concurrency 1 --timeout 8m --platform managed 这个错误消息具体意味着什么,我该如何解决这个问题?

你在 US-CENTRAL1 部署吗? - guillaume blaquiere
是的,us-central1——因为它仍然是我在console.cloud.google.com / UI上尝试创建新服务时唯一的选择;CLI很久以前就提供了更多的选择,但总是导致错误,让我相信它只能在那里使用? - Jan Hacker
UI仅提供中央,但CLI也可以使用其他选项。我们尝试了东部并取得成功(但它在UI中没有显示)。 - Pentium10
现在有许多新的区域可用:https://cloud.google.com/run/docs/release-notes#july_10_2019 - guillaume blaquiere
主要问题是:为什么它会以500错误状态失败,而不是429或其他容易捕获和处理的状态?... - undefined
6个回答

20

当基础架构无法快速扩展以应对流量激增时,就会出现此错误信息。基础架构仅将请求保存在队列中一定时间(约10秒),然后中止。

通常发生在以下情况下:

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

39
你能否改进这个答案,告诉我们如何修复这个错误,而不仅是为什么会发生这个错误。 - Pentium10
文档中有性能提示(https://cloud.google.com/run/docs/tips#optimizing_performance),这可能有助于解决此问题。 - Corinne White
1
尽管还有改进的空间,但我认为这个答案很有帮助。几天来没有看到这个错误了...如果它再次出现,我会尝试添加预热请求。在我指定了相对较长的超时时间的情况下,请求时间长不应导致此错误(依我之见)。 - Jan Hacker
2
这只是一个不完整的答案:它解释了“这个错误是什么意思”,但并没有说明“我该如何解决这个问题”。Corinne White提供了链接到文档,这很有帮助,但它们相当通用。 - orbiteleven

9

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


6
我也遇到了这个问题,很容易重现。我有一个处理fibo(45)需要6秒钟的斐波那契容器。我使用Hey执行了200个请求。并将我的Cloud Run并发设置为1。
在200个请求中,我有8个相似的错误。在我的情况下:出现突然的流量峰值和长时间的处理时间。(对我来说,是短暂的冷启动,这是用Go实现的)

2
我通过将最大自动缩放容器数量从2增加到10来解决了这个问题。实际上,2对于流量来说应该不会太低,但我怀疑Cloud Run内部的某些东西会以某种方式占用2个容器。

1
你在哪里可以看到“最大自动缩放”?我找不到任何相关文档。 - anonymous-dev
在YAML中,使用autoscaling.knative.dev/maxScale: '4',我找不到GUI旋钮,怀疑YAML是设计。对我来说,Cloud Run可以远超过其最大值12!我认为因为我的网站是新的/未使用的,它会在空闲时缩放到零,所以当GoogleBot经过时,它会开始扩展,并且由于是.NET,它需要一段时间才能启动,它会超过预期。我怀疑一个较小的VM与autoscaling.knative.dev/minScale: '1'可能会防止这种情况发生,但我不确定哪个更便宜,短暂的超量还是始终开启。 - Luke Puplett
请参阅 https://cloud.google.com/run/docs/configuring/max-instances 和相关文档页面以获取所有信息。 - Luke Puplett

0
这个错误可能是由以下原因之一引起的。
  1. 突然大量的流量增加。
  2. 冷启动时间过长。
  3. 请求处理时间过长。
  4. 请求处理时间突然增加。
  5. 服务达到最大容器实例限制(HTTP 429)。
我们偶尔遇到类似的问题,这是由于数据库延迟高导致部分请求的请求处理时间过长。

0
将“最大重试次数”设置为非零值可以解决此问题,就像对我一样。

你还有这些错误吗,还是它们已经消失了? - undefined
@AndreasDyballa 错误/问题已完全解决 - undefined
我觉得那很奇怪。谷歌说即使重试关闭,他们也保证只执行一次。所以这些错误应该是警告,而不是说处理程序没有运行。但是如果我打开重试,我也看到了这些错误的减少。我感到困惑。我将忽略这些错误。 - undefined

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