问题特征
使用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导致主线程进入死循环
- 粘液科技之类的插件
- 玩家做的红石机器造成了过大的卡顿
- 服务器配置太差
解决办法
寻找卡服根源
自行寻找(可以二分法删插件),多看看日志可能有所帮助
升级硬件
大部分时候是升级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线程开始打印线程转储的毫秒数
将两个值改成你要的数值即可,注意单位是毫秒
谢谢你