404E Blog

第 7 页

Paper Watchdog 报错

Minecraft

问题特征

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

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

log
[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线程开始打印线程转储的毫秒数

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

腾讯云域名添加子域名解析

运维部署

进入DNSPod控制台,找到 我的域名

点击添加记录

比如这里我要设置我的域名e404.top的子域名www.e404.top

主机记录就写www,类型就是A,其他都默认即可

填写完成之后点击确认

崩溃&启动失败的日志/崩溃报告解析

Minecraft

日志

日志位于

  • 客户端:客户端文件夹/.minecraft/logs
  • 服务端:服务端文件夹/logs

文件夹中,最后一次启动的日志是 latest.log ,每当服务端启动时,旧的 latest.log 会被压缩到 年-月-日-次数.log.gz 文件中

如果你的启动脚本是带有自动重启的,并且你没有在它开始重启之前关闭它,那么 latest.log 就会被压缩到gz文件中

此时你需要找到对应的gz文件,使用解压缩软件查看其中的log文件

log文件可以直接用文本文档打开,通常有问题的日志应该从后往前看

崩溃报告

日志位于

  • 客户端:客户端文件夹/.minecraft/crash-reports
  • 服务端:服务端文件夹/crash-reports

文件夹中,崩溃报告的命名格式是 crash-年-月-日_时.分.秒-服务端/客户端.txt

崩溃报告中通常会带有

  • 崩溃原因的描述
  • 导致崩溃的报错
  • 崩溃时运算的实体
  • 服务器的存档信息
  • 服务器的版本
  • 服务器的JVM信息
  • 服务器的系统信息
  • MOD列表(mod服)

以下是一些常见的问题

mod前置未安装

Mod §eMOD名字§r requires §6前置名字§r §o前置版本 or above§r§7Currently, §6前置名字§r§7 is §o§nnot installed

解决办法:安装对应版本的前置

mod前置版本不合要求

Mod §e`MOD名字`§r requires §6`前置名字`§r §o需要的`前置版本` or above, and below `` 需要的`前置版本` ``§r§7Currently, §6`` `前置名字` ``xx§r§7 is §o当前`` 的`前置版本` ``

解决办法:安装对应版本的前置

扒一扒偷偷摸摸占C盘空间的东西

系统笔记

maven

路径:C:\Users\用户\.m2\repository

内容:下载的依赖

解决办法:手动设置仓库位置

修改 C:\Users\用户\.m2\settings.xml

添加 <localRepository>仓库路径</localRepository>

如图 如图

如果不存在可以自己新建一个,下面是示例

xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <localRepository>D:/.m2/repository</localRepository>
</settings>

gradle

路径:C:\Users\用户\.gradle

内容:下载的依赖

解决办法:手动设置gradle目录

通过设置环境变量来修改gradle目录的位置(修改教程见/blog/win10设置路径path/

如图 如图

JetBrain

路径:C:\Users\用户\AppData\Local\JetBrains

内容:大概是下载的各个版本的更新吧

解决办法:

将当前用户AppData\Local下JetBrains转移到目标磁盘目录下,cmd进入当前用户AppData\Local下,执行命令:

mklink /J "JetBrains" "D:\JetBrains"

参考:https://www.e-learn.cn/topic/3757574

QQ

可用方法

  1. 关闭QQ
  2. C:\Users\用户\Documents\Tencent Files 移动到D盘下,如果移动过程中出现被占用无法移动的文件可以先重启再移动
  3. 在cmd中输入 mklink /J "C:\Users\用户\Documents\Tencent Files" "D:\Tencent Files" 建立软链接
  4. 启动QQ

或者用qq自带的设置

Minecraft服务端地址

Minecraft

默认地址

Minecraft服务端的端口默认是25565,地址默认是127.0.0.1

客户端进入服务端需要填写 地址:端口 ,注意这里的地址和端口需要换成你自己的,并且冒号一定要用英文的 : ,否则会无法连接。当你认为自己其他地方没有问题的时候请检查一下冒号是否写错了

修改端口

端口在 服务端文件夹/server.properties 文件中修改,此文件可以直接用文本文档打开

在其中找到 server-port=25565 (其他port项不用管),将其中的25565调整到你需要的端口(如非必要,不要修改端口,游戏中加入服务器时,端口是25565的服务器的地址可以不写端口)

端口可用数值1-65535,其中0不使用,1-1023为系统端口,也叫BSD保留端口,1024-65535为用户端口,又分为:BSD临时端口(1024-5000)和BSD服务器(非特权)端口(5001-65535),建议使用五位数端口以防止端口冲突

修改端口后需要重启服务器生效,如果重启时控制台报错 **** FAILED TO BIND TO PORT! 就代表你选择的端口被其他进程占用了,需要更换端口

指定地址

默认地址127.0.0.1可以理解为本机,也就是当你服务端和客户端在一台机器上的时候可以使用此地址连接到服务端

在同一局域网中可以通过 服务端所在机器的ip:服务端端口 连接到服务端,例如( 192.168.1.1:25565

如果要跨公网连接的话有以下几种方式

  1. 有自己的公网ip(公网ip在哪儿,服务端的机器也要在哪儿,不要说有个vps然后要自己电脑开的服能远程连接,不现实)
  2. 使用frp,也就是内网穿透,教程
  3. 使用自己的动态公网ip,教程

常见问题

no further information

连接时出现

意为你填写的地址没有响应

可能原因有

  1. 地址有错误
  2. 防火墙没关闭
  3. 安装组未放行(vps)

如果是vps,请关闭系统防火墙并配置安全组放行

如果是第三方服务商提供的机器,可以找服务商询问

Unknow Host

大概率是地址写错了,请检查地址种的冒号是否是英文的冒号 :

原版客户端进Forge服

你需要使用mod一致的客户端连接服务器

连接中止

可能的原因有很多,你应该

  1. 检查你的客户端mod是否与服务端mod对应
  2. 检查你的服务端和客户端日志
  3. 如果你看不懂日志,请把完整的日志文件发给看得懂的人让他帮你(问的时候先提供日志并且详细地描述问题)

关闭防火墙&安全组放行

运维部署

Windows关闭防火墙

打开控制面板,找到 控制面板\系统和安全\Windows Defender 防火墙 ,在左侧找到 启用或关闭WindowsDefender防火墙 点击

设置如图 设置如图

将两个网络的防火墙都关闭后确定

Linux关闭防火墙

以下两种方式任选一种即可,一种用不了的换另一种

systemctl

启动:systemctl start firewalld

查看状态:systemctl status firewalld 

停止:systemctl disable firewalld

禁用:systemctl stop firewalld

iptable

查看防火墙状态:service iptables status

停止防火墙:service iptables stop

启动防火墙:service iptables start

重启防火墙:service iptables restart

关闭防火墙自启:chkconfig iptables off

开启防火墙自启:chkconfig iptables on

vps安全组放行端口

在进入vps实例的管理界面,找到安全组,注意安装组里面有出站规则和入站规则

出站规则放行全部(出站就是vps里的进程通过端口访问外网的内容)

入站放行常用端口,(如果开服的话也同时放行服务器端口)

出站规则 出站规则 入站规则 入站规则

DDNS教程

Minecraft

此教程需要花钱购买一个域名,腾讯云,阿里云等服务商均提供此服务且价格并不贵

购买域名的教程此处就不放了,以下的教程需要有域名

申请公网ip

首先移动用户可以关闭此教程了,移动的公网ip极难申请

联通和电信用户可以打电话给运营商要一个动态公网ip,如果问用来做什么的话可以说装监控

我就是电信用户,一个电话搞定

光猫改桥接

同样是打电话给运营商,让运营商把自己的光猫模式改成桥接

获取密钥

这里我是使用的腾讯云,就以腾讯云的控制台举例

首先进入腾讯云的控制台 https://console.dnspod.cn/

查看图片

进入DNSPod Token界面,如果没有密钥的新建一个

创建后拿到id和token

保存好id和token,不要泄露给不信任的人

使用DDNS程序动态解析ip到域名

这里我使用的是DDNS-GO https://github.com/jeessy2/ddns-go

 GitHub

jeessy2/ddns-go

在release界面中选择最新的适合你操作系统的构建并下载 https://github.com/jeessy2/ddns-go/releases

按照README.md中的使用教程启动之后,通过浏览器进入其设置界面

在此处填入之前保存的id和token 在此处填入之前保存的id和token 在IPV4下设置你要解析的域名 在IPV4下设置你要解析的域名

在IPV4下的Domains中填写你要解析的域名(如果是子域名需要自行添加域名解析,见/blog/腾讯云域名添加子域名解析/

IPV6按需设置,没有的不填

设置完成后点击最下方的SAVE

点击保存 点击保存

管理端口映射

此时我们已经可以通过域名访问我们的ip了,但是一般我们的网络和公网直接还隔了一个路由器

这里以华为的路由器为例

打开NAT服务 打开NAT服务

这里假设我的电脑上开了一个mc的服务端,使用25565端口,我要把它映射到公网ip的25565上

这里注意设备不要选错了,要选择对应的设备

设置映射 设置映射

保存之后就可以从外网连接了(如果连接不了的话请自行检查机器的防火墙)

注意

  1. ddns-go进程将会每隔一段时间检测一次ip变动,并在变动后更新域名对应的ip
  2. 根据解析端的dns不同,刷新时间会有出入,这里建议将dns设置为 119.29.29.29223.5.5.5
  3. 保持ddns-go的进程开启,不要关闭(linux可以使用screen)

Java下载

运维部署

Minecraft1.17及以后的版本需要Java17

Minecraft1.16及以前的版本可以用Java8-15

推荐使用8/11这两个LTS的版本,LTS意为长期支持版本

高版本Java优点

包含更加合理高效的GC(垃圾回收)机制,运行效率更高

高版本Java缺点

一些插件或mod可能尚不支持高版本的Java

各种安装包的区别

一般Java分为Jre和Jdk,Jdk要略微大一些,但是从使用角度来看并没有什么区别

如果你的操作系统是64位的,下载时请选择64位(x86-6464bit

如果你知道如何配置Path,也可以下载zip或tgz格式的压缩包,并在解压后自行配置Path,否则请下载exe或msi格式(linux选择rpm等)的安装包,安装包会帮你配置Path

linux配置path

win配置path

链接

提供一些我知道的下载链接,你可以自行选择

DragonWell8:https://github.com/alibaba/dragonwell8/releases/latest (仅JDK8,阿里巴巴优化版本)

DragonWell11:https://github.com/alibaba/dragonwell11/releases/latest (仅JDK11,阿里巴巴优化版本)

AdoptOpenJDK:https://adoptium.net/releases.html (包含各个版本的Jdk和Jre)

AzulZuluJDK:https://www.azul.com/downloads/?architecture=x86-64-bit&package=jdk (包含各个版本的Jdk和Jre)

OracleJDK:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html (仅Jdk)

OracleJRE:https://www.oracle.com/java/technologies/javase-downloads.html (仅Jre)

linux设置路径(Path)

系统笔记

注意

本文教程中默认假设java文件夹位于 /usr/local/java,实际修改以你自己的java文件夹为准

Path意义

输入指令后计算机会查找对应的可执行文件,查找的路径就是Path

操作步骤

这里以设置java的路径举例,假设java文件夹位于 /usr/local/java ,你在操作的时候需要把 /usr/local/java 替换成自己的软件的路径

修改路径文件

打开系统路径文件

bash
vi /etc/profile

进入编辑模式

在vi里面默认不是编辑模式

按i或者右侧方向键上面那一块里面的insert键进入编辑模式

左下角显示 -- INSERT ---- 插入 -- 时就是进入了编辑模式,注意不要使用替换模式

添加路径

在打开文件的最前面添加如下内容

bash
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin


# 检查是否设置完成
java -version
# 如果显示 bash: java: 未找到命令... 就代表你改的有问题
# 如果显示了java的具体信息就代表修改成功

JAVA_HOME并非必须,也可以用改成如下方式(注意,两者二选一)

bash
export PATH=$PATH:/usr/local/java/bin

按esc,输入 :wq 保存并退出

刷新路径

bash
source /etc/profile

如果输入此指令后什么也没发生,别担心,这是正常情况,说明操作执行正常完了

检查路径

通过查看Java版本检查Java是否被加入进path

纯文本
java -version

也可以直接查看path

bash
echo $PATH

Minecraft服务端更换核心

Minecraft

保险起见,进行此操作前应该将服务端文件备份 (整个服务端文件夹打包或者复制一份都可)

以下所有操作均需要在关服时进行操作

服务端更新核心(不更换游戏版本)

将新的核心移动到服务端文件夹内

forge和fabric需要重新安装以下载需要的lib文件,单独复制核心并不能成功开服

然后修改开服脚本中的 -jar 参数后的核心名字

启动服务端后注意控制台,如果有报错需要注意

在确认没有问题后再删除旧的核心Jar文件

服务端更换核心

插件和mod是不互相兼容的,除非是没有安装插件或mod的情况下更换,否则不推荐

插件服和(mod服或插件mod服)互换核心时需要修改存档结构

修改方法

将新的核心移动到服务端文件夹内,然后修改开服脚本中的 -jar 参数后的核心名字

启动服务端后注意控制台,如果有报错需要注意

在确认没有问题后再删除旧的核心Jar文件

更换不同游戏版本的核心

如果是升级,1.12 -> 1.13,1.17 -> 1.18 等大更新不建议更换,及其容易出问题

如果是降级,想都别想

小更新将新的核心移动到服务端文件夹内,然后修改开服脚本中的 -jar 参数后的核心名字

启动服务端后注意控制台,如果有报错需要注意

在确认没有问题后再删除旧的核心Jar文件