更新于 2021/08/20

Paper Watchdog 报错

问题特征

使用paper及其分支核心,服务端长时间无响应时会由Watchdog打印线程转储信息

特征是有很长的一串报错,开头如下

[Paper Watchdog Thread/ERROR]: --- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH - git-Paper-xxx (MC: 1.1x.x) ---
[Paper Watchdog Thread/ERROR]: The server has not responded for 10 seconds! Creating thread dump

中间会出现多个类似以下结构的报错

[Paper Watchdog Thread/ERROR]: ------------------------------
[Paper Watchdog Thread/ERROR]: Current Thread: Timer hack thread
[Paper Watchdog Thread/ERROR]: 	PID: x | Suspended: false | Native: false | State: TIMED_WAITING
[Paper Watchdog Thread/ERROR]: 	Stack:
[Paper Watchdog Thread/ERROR]: 		xxxx.xxxx.xxxxxx.xxxxx(xxxx xxxx)
[Paper Watchdog Thread/ERROR]: ------------------------------

最后会进行插件和存档的保存消息,并且不会退出服务端的进程(会导致自动重启脚本失效)

这是由于服务端的进程未响应的时长超出了设置的限制,导致Watchdog打印线程转储信息并自动保存关闭

可能的导致原因

  • 某些插件的代码有bug导致主线程进入死循环
  • 粘液科技之类的插件
  • 玩家做的红石机器造成了过大的卡顿
  • 服务器配置太差

解决办法

寻找卡服根源

可以安装spark插件(指令教程),查看占用分析

自行寻找(可以二分法删插件),多看看日志可能有所帮助

升级硬件

大部分时候是升级CPU,cpu选择优先考虑单核水平,可以百度cpu天梯图查看单核排名

和多分配内存(分配过多内存并没有作用,多分配内存只是为了减小gc压力,cpu速度不够的时候并不能靠多分内存弥补)

修改watchdog的限制

治标不治本,该卡还会卡,仅在某些特殊情况(如预加载地图)下使用

找到 服务端文件夹/paper.yml (高版本在 服务端文件夹/config/paper-global.yml ),打开并找到以下选项

watchdog:
  early-warning-every: 5000
  early-warning-delay: 10000
  • early-warning-every: 服务器无响应时打印线程转储之间的间隔(以毫秒为单位)
  • early-warning-delay: 服务器无响应后距离watchdog线程开始打印线程转储的毫秒数

将两个值改成你要的数值即可,注意单位是毫秒