前言
请不要忽略 Minecraft 服务器的各类警告,因为它们非常有用!
问题描述
查看服务器实时日志时发现时不时抛出以下警告:
[06:30:34 WARN]: Saving oversized chunk [-141, 17] (5357469 bytes} to external file ./world/entities/c.-141.17.mcc
简单阅读可知,这行警告交代了以下内容:
- 这是个警告不是错误
- 问题发生在区块
[-141, 17]
- 问题是世界保存时发生的
- 阅读后面的保存路径,可以认定是实体保存问题
oversized chunk
超过保存大小的区块 <- 这里就有问题了
问题分析
通常 Minecraft 的存档是通过一个个区域文件保存的,不会出现单区块保存的情况(除非区块数据特别大!),命名格式为 r.<区域X坐标>.<区域Z坐标>.mca
。而本次提到的文件命名是:c.<区块X坐标>.<区块Z坐标>.mcc
,以下是它们两个的文件名直观对比图:
查阅全网得知,这样保存是因为这个区块数据太大,超过了一个区域文件能保存的大小,所以单拎出来作为一个单独的文件保存。那我们应该怎么做呢?我们最好先去那个区块看看。
尝试解决
在飞行到对应区块之前,我们不妨使用 Spark Profiler 运行一下分析,以确定是什么实体。果不其然,通过一系列分析,我们得到了一个惊人的数字:item: 98802
。接近十万的掉落物堆在一个区块里,造成服务器 TPS 骤降到 4~10。
接下来的事情就很简单了,使用命令清理掉所有掉落物即可。前往该区块查看,发现是一个单区块高速熔炉的地毯机,被人半夜开启后未关闭且因粘液的区块加载器一直加载造成卡服。
事故回顾
运维人员应当注意后台抛出的各类警告,同时在亲自前往解决之前使用可用的分析工具提前感知问题所在,通常可以提前解决问题,快速恢复服务器。玩家应该在下线之前关闭所有非必要开启的机器,防止因区块卸载而导致机器或服务器损坏。
事后查阅资料得知 .mcc
文件是 Minecraft 的区域额外文件
如果区块在压缩后,区块数据长度(包括数据长度的 4 字节)大于 1020KiB,则区域文件无法完整保存这个区块。这种情况下,此区块的数据长度会被写为 1,压缩类型字段的最高位会被修改为 1(相当于加上了 128),并且游戏会创建额外文件
c.<区块X坐标>.<区块Z坐标>.mcc
存储区块数据(前 5 个字节会被留空),在日志中打印“Saving oversized chunk <区块坐标> (<区块数据大小> bytes} to external file <额外文件路径>”代表此区块已经被额外存储。—— 中文 Minecraft Wiki
参考与鸣谢
- 区域文件格式 (.mca)
- Java 版存档格式
- 区域额外文件 (.mcc)
- 感谢小狼阳帆昨天请我吃的疯狂星期四