GCE虚拟机运行一段时间后休眠断连,如何保持服务长期正常运行?
GCE VM 运行中断、自动重启问题排查与解决步骤
1 先确认VM非预期重启的根因
- 登录GCE控制台进入对应VM实例详情页,查看监控标签页下的
CPU使用率、内存使用率、磁盘IO指标,确认1.5小时左右的时间点是否出现指标骤降后恢复的典型重启特征 - 登录VM后执行命令
last reboot查看系统重启记录,确认重启时间是否和你遇到的中断时间完全吻合 - 执行
dmesg -T查看内核日志,排查是否存在OOM(内存溢出)触发的系统强制重启、内核崩溃等底层问题
2 排查GCE VM实例的配置问题
- 确认你使用的VM实例类型是否为可抢占式实例(Spot VM):可抢占式实例最长运行时间为24小时,且随时可能被GCE平台回收,非常容易出现运行1-2小时就被强制重启/销毁的情况,若使用的是可抢占式实例,直接更换为标准按需实例即可解决
- 检查VM的可用性策略配置:确认是否开启了「主机维护时迁移实例」,如果未开启,GCE进行宿主机运维时会直接重启你的VM
- 检查VPC防火墙规则:确认MQTT使用的端口(默认1883/8883)、SSH端口22的入站/出站规则超时时间是否设置过短,同时确认VM内的操作系统防火墙(ufw/iptables/firewalld)没有配置超时自动封禁规则
3 配置应用开机自启与进程守护
很多时候VM本身无故障,但手动在SSH终端启动的应用会在SSH断开后随会话结束被终止,或是VM重启后没有自动拉起:
- 对于Node.js前端,推荐使用
pm2管理进程,配置pm2 startup实现开机自启,同时设置进程崩溃自动重启规则 - 对于Java后端,可通过
systemd配置系统服务,添加Restart=always参数,进程崩溃或VM重启后会自动拉起服务 - 不要直接在SSH交互终端启动应用,避免SSH断开后SIGHUP信号杀掉进程,临时启动可在命令结尾加
&或者用nohup命令包裹,示例:nohup java -jar xxx.jar &
4 长连接保活配置
针对MQTT和SSH长连接容易被防火墙切断的问题:
- 本地SSH配置文件添加
ServerAliveInterval 60参数,每60秒给服务器发心跳包避免连接超时 - MQTT客户端配置心跳包(keepalive)参数,设置为30-60秒,同时服务端的MQTT broker也对应配置匹配的超时时间
内容的提问来源于stack exchange,提问作者Aurbcd
相关产品推荐
相关产品推荐

