升级至Play Framework 3.0(含Pekko)后节点意外关机问题咨询
排查思路
1. 追踪ServerStoppedReason的触发链路
- 开启Play和Pekko的调试日志,定位关机信号的发起者:
在配置文件中添加以下日志配置:
调试日志会输出完整调用栈,能明确是Play内部组件触发,还是业务代码(比如后台Pekko Actor)误调用了关机API。logger.play.core.server = DEBUG logger.pekko.coordinated-shutdown = DEBUG - 排查业务代码,确认是否存在意外调用
Application.stop()、CoordinatedShutdown.run()等关机相关方法的情况。
2. 内存相关深层排查
- 虽然不是直接OOM崩溃,但内存压力可能间接触发关机:
- 添加JVM GC日志参数:
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC,记录关机前的GC行为,查看是否存在持续Full GC、内存无法释放的情况。 - 检查系统层面日志(如
dmesg、/var/log/messages),确认是否是系统OOM Killer误杀进程——部分场景下OOM Killer不会在应用日志中输出提示,仅能通过系统日志查证。
- 添加JVM GC日志参数:
3. 排查Pekko Actor系统异常
- 聚焦仅运行后台Actor的节点特性:
- 检查Actor的监督策略,是否存在根Actor或关键Actor抛出未捕获致命异常,导致ActorSystem触发协调关机的情况。
- 核对自定义的
CoordinatedShutdown钩子任务,确认是否有逻辑在特定条件下触发了关机流程。
4. 核对Play 3.0版本与配置
- 检查当前Play 3.0版本是否存在关机相关的已知Bug,核对官方版本说明。
- 验证Play关机配置参数,比如
play.server.shutdown.timeout——日志中2147513000ms的超时值明显异常,排查是否是配置错误或内部逻辑计算偏差导致。
5. 模拟场景复现验证
- 在测试环境复刻生产环境的负载与运行模式(仅启动后台Actor),通过压测、内存模拟等方式尝试复现问题,对比日志差异定位触发条件。
- 手动触发各类关机场景(如调用关机API、Actor致命异常、内存耗尽),对比生产环境日志,匹配对应的触发源。
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

