Cloud Run突发请求超时求助:重启部署恢复但频繁复发
Cloud Run Python/Flask应用随机全量504超时排查方案
问题背景
我们在Cloud Run上运行Python+Flask后端应用已1.5年,1个月前开始每几天随机出现所有请求504超时的异常:
- 应用能接收请求但完全不执行代码,甚至无业务逻辑的
Hello World测试端点也超时 - 仅重新部署最新镜像可恢复服务
- 已排除Cloud SQL影响:无数据库交互的请求同样失效,故障期间Cloud SQL可正常访问
当前Cloud Run配置:
- CPU: 2核
- Memory: 8Gi
- Timeout: 59m59s
- 启用VPC连接器
- VPC egress: private-ranges-only
- Concurrency: 100
故障关联现象
- Logs Explorer仅显示504超时日志,无应用侧执行日志(多数端点触发会生成日志,确认代码未执行)
- 故障似乎集中在Cloud Scheduler任务运行期间:每15分钟触发的Scheduler任务会调用应用端点创建Cloud Tasks(指向同一应用),某次21:00触发的Scheduler因3分钟默认超时终止,其创建的Cloud Tasks在21:10因10分钟默认超时失效,之后所有请求均超时
- 已尝试的无效操作:增加Cloud Scheduler重试次数与超时时间、升级CPU/内存
排查方向与解决方案
1. 检查应用进程级阻塞/资源耗尽
- 在应用中集成
psutil库,实时记录每个请求的线程数、文件句柄数、内存占用,故障发生后导出数据分析是否存在资源耗尽或死锁 - 开启Cloud Run的CPU/内存利用率监控,查看故障发生前是否出现资源突增但未触发自动扩缩容的情况
- 核对Flask的WSGI服务器配置(如Gunicorn的worker数、线程数),是否因并发设置不合理导致进程池被占满
2. 排查VPC连接器网络瓶颈
- 检查VPC连接器的连接数配额,故障期间是否达到连接上限:Cloud Run通过VPC连接器访问内部资源时,连接数超限会导致请求挂起
- 确认
private-ranges-only策略下,应用依赖的所有服务(包括Cloud Tasks回调)是否都在私有网段内,若有公网依赖需调整VPC egress策略或配置云NAT - 查看VPC连接器的日志,排查是否存在DNS解析失败、连接超时的记录
3. 验证Cloud Tasks与Scheduler的连锁影响
- 临时暂停Cloud Scheduler任务,观察是否还会出现故障,以此确认Scheduler是否为故障诱因
- 调整Cloud Tasks的并发设置,避免大量任务同时触发同一应用端点导致实例并发队列溢出
- 给Cloud Tasks配置死信队列,防止失败任务持续占用资源
4. 排查Cloud Run平台层面异常
- 查看Cloud Run的实例启动/销毁日志,确认故障期间是否存在实例无法正常启动或被强制终止的情况
- 提交Google Cloud支持工单,提供故障精确时间戳、项目ID,请求排查平台侧的实例调度或网络异常
- 尝试切换Flask的WSGI服务器(如从Gunicorn切换到Waitress),排除服务器与Cloud Run的兼容性问题
5. 排查应用代码隐性阻塞点
- 检查是否存在全局锁、单例资源未正确释放的情况(如全局数据库连接池、文件锁),高并发下可能导致所有请求阻塞
- 给测试端点添加最基础的入口日志(如请求到达时直接打印日志),确认请求是否真的到达应用进程,还是在Cloud Run代理层被阻塞
内容的提问来源于stack exchange,提问作者lblnd
相关产品推荐
相关产品推荐

