部署在Google App Engine的NodeJS应用运行30分钟后终止如何解决?
错误说明
以下日志为Google App Engine平台主动终止NodeJS进程触发的上报内容:
Quitting on terminated signal
Start program failed: user application failed with exit code -1 (refer to stdout/stderr logs for more detail): signal: terminated
应用本地运行无异常的原因是本地环境不存在平台侧的实例回收、资源配额限制规则,不会触发该类终止逻辑。
常见触发原因
- 闲置实例回收:如果应用未对外提供HTTP服务,或长时间没有入站请求,GAE的自动伸缩策略会将实例判定为闲置状态并强制终止。应用内部运行的15秒间隔异步函数不会被平台判定为活跃流量,因此即使内部任务持续运行,仍会被判定为闲置。
- SIGTERM信号未处理:GAE终止实例前会先发送SIGTERM信号通知应用执行清理操作,若NodeJS进程未监听该信号做对应处理,会直接触发进程退出,上报对应错误。
- 资源使用超限:应用运行过程中CPU、内存使用率持续超过实例规格配额时,平台会强制终止实例,该场景通常伴随资源使用率超限的关联日志。
- 内存泄漏:15秒执行的异步函数若存在内存泄漏,持续运行30分钟后累计占用内存达到实例上限,会触发平台强制终止。
排查步骤
- 查看GAE控制台实例指标,确认故障实例退出前的CPU、内存使用率是否超过规格上限,排除资源超限问题。
- 检查
app.yaml配置文件,确认伸缩策略的idle_timeout参数是否设置过短,是否配置了允许缩容到0实例的规则。 - 在应用入口添加SIGTERM信号监听日志,记录信号触发的时间、当前任务运行状态,确认触发时机是否和闲置回收周期对齐。
- 本地连续运行应用1小时以上,持续监控进程内存占用变化,排查是否存在内存持续上涨的泄漏问题。
修复方案
- 调整实例伸缩配置:如果需要实例长期稳定运行,可根据使用的环境调整配置:
自动伸缩场景下将min_instances设置为1以上,idle_timeout调整为最大允许值3600s;不需要动态伸缩的场景可直接使用basic_scaling或manual_scaling固定实例数量,避免闲置回收。 - 添加SIGTERM信号处理逻辑:在NodeJS应用入口添加信号监听代码,收到信号后等待当前异步任务执行完成再退出,避免任务中断:
process.on('SIGTERM', () => { // 此处添加逻辑判断当前是否有异步任务在执行,等待执行完成后再退出 setTimeout(() => { process.exit(0); }, 20000); });
- 调整定时任务触发逻辑:如果应用仅用于运行后台定时任务,可将15秒间隔的触发逻辑迁移为平台级定时任务,通过HTTP请求调用应用接口执行任务,每次请求都会被GAE判定为活跃流量,避免实例被判定为闲置。
- 修复内存泄漏:若排查确认存在内存泄漏,优化异步函数的资源释放逻辑,及时关闭数据库连接、销毁大对象,避免内存持续累积超出配额。
内容的提问来源于stack exchange,提问作者Tyler Pashigian
相关产品推荐
相关产品推荐

