Skip to content

记一次服务器 oversized chunk 的应急响应和事故分析

Published: at 22:58编辑

前言

请不要忽略 Minecraft 服务器的各类警告,因为它们非常有用!

问题描述

查看服务器实时日志时发现时不时抛出以下警告:

[06:30:34 WARN]: Saving oversized chunk [-141, 17] (5357469 bytes} to external file ./world/entities/c.-141.17.mcc

简单阅读可知,这行警告交代了以下内容:

  1. 这是个警告不是错误
  2. 问题发生在区块 [-141, 17]
  3. 问题是世界保存时发生的
  4. 阅读后面的保存路径,可以认定是实体保存问题
  5. oversized chunk 超过保存大小的区块 <- 这里就有问题了

问题分析

通常 Minecraft 的存档是通过一个个区域文件保存的,不会出现单区块保存的情况(除非区块数据特别大!),命名格式为 r.<区域X坐标>.<区域Z坐标>.mca。而本次提到的文件命名是:c.<区块X坐标>.<区块Z坐标>.mcc,以下是它们两个的文件名直观对比图:

MCC 文件比 MCA 文件还要大!

查阅全网得知,这样保存是因为这个区块数据太大,超过了一个区域文件能保存的大小,所以单拎出来作为一个单独的文件保存。那我们应该怎么做呢?我们最好先去那个区块看看。

尝试解决

在飞行到对应区块之前,我们不妨使用 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

参考与鸣谢


上一篇
雨云宿迁游戏云 9950X-VPS 快速测评
下一篇
提速!我对前端优化的一点建议