Google Cloud Run存在大量待处理任务仍无法扩容的问题咨询
解决方案
1. 调整Cloud Run健康探针配置
默认的存活探针、启动探针超时时间均为1秒,探测失败阈值为3次。当你的实例正在处理长耗时同步任务时,探针请求可能无法及时得到响应,Cloud Run会判定实例不健康并强制销毁,就会出现你遇到的连接中断、UNAVAILABLE报错,同时也会导致活跃实例数远低于预分配数。
你需要按以下参数调整探针配置:
- 启动探针超时时间设为 > 任务最长处理时长,失败阈值调整为10次以上
- 存活探针超时时间设为 > 任务最长处理时长,检测间隔设为大于任务处理时长
如果没有特殊需求,也可以临时关闭健康探针验证是否是该问题导致。
2. 调整Cloud Tasks队列并发配置
你使用了队列默认配置,Cloud Tasks单队列默认的max_concurrent_dispatches(最大并发派发任务数)设置较低,会限制同时推送到Cloud Run的任务数量,直接导致即便有足够的闲置实例,也没有足够的任务分配过去,吞吐量上不去。
你需要手动调整队列的并发派发上限,匹配你Cloud Run的最大实例数*单实例并发数的总处理能力。
3. 检查Cloud Run实例资源配置
你提到内存占用较高,若你分配的实例内存接近任务实际消耗的峰值,Cloud Run会主动OOMKill实例,导致连接中断,同时调度器也会减少该服务的实例调度数量。
建议你将实例内存配置上调30%以上,观察是否还会出现实例被回收的情况。
4. 确认请求超时配置匹配
需要同时调整两端的超时配置,确保大于你的单任务处理时长:
- Cloud Run服务的请求超时,默认是300秒,你可以根据实际任务时长调到更长(最长支持3600秒)
- Cloud Tasks队列的
dispatch_deadline(派发超时),默认是600秒,需大于Cloud Run的请求超时设置
5. 开启Cloud Run CPU始终分配
如果你的任务处理过程中存在等待IO的空闲阶段,默认的CPU动态分配策略可能会在CPU低占用时降配,导致任务处理超时,实例被判定异常。开启--cpu-throttling=false参数(即CPU始终分配),可以避免该问题。
以上配置调整完成后,再测试20秒以上的长耗时任务,即可看到实例正常扩容,任务处理吞吐量匹配你的配置上限。
内容的提问来源于stack exchange,提问作者shortcipher3
相关产品推荐
相关产品推荐

