Skip to the content.

首页 | 文档←返回 | 创建:2025-05-24 | 最后更新:2025-05-25

若未经额外说明,以下时间以UTC+8时区为准

缘起

2025年5月24日17时59分,服务器后台出现Overload警告,且出现运行效率降低问题;当日18时18分该问题被发现。
在问题被发现后,我们按照过往经验准备重启服务器,但输入/stop后服务器没有响应,长时等待后Leaves也未自动重启服务器或生成完整Dump数据。
23分,强制关闭实例后,因当前共享实例配置已满而无法启动实例,栈流Streack宣布无限期暂停服务。

在相关更新推送后,服务器暂时稳定运行了一段时间,但21时04分06秒起,服务器又陷入无限重启故障。
25日0时14分,上述故障解除。

故障分析

宕机问题

Server thread dump (Look for plugins here before reporting to Leaves!):
[ChunkTaskScheduler] Chunk wait task info below: 
[ChunkTaskScheduler] Chunk wait: [( -62500,-6250) in 'world_kdx.mworld_void2']
[ChunkTaskScheduler] Chunk holder: NewChunkHolder{world=world_kdx.mworld_void2, chunkX=-62500, chunkZ=-6250, entityChunkFromDisk=false, lastChunkCompletion={chunk_class=net.minecraft.world.level.chunk.ProtoChunk,status=minecraft:biomes}, currentGenStatus=minecraft:biomes, requestedGenStatus=minecraft:full, generationTask=null, generationTaskStatus=null, priority=BLOCKING, priorityLocked=false, neighbourRequestedPriority=null, effective_priority=BLOCKING, oldTicketLevel=32, currentTicketLevel=32, totalNeighboursUsingThisChunk=0, fullNeighbourChunksLoadedBitset=0, currentChunkStatus=INACCESSIBLE, pendingChunkStatus=INACCESSIBLE, is_unload_safe=ticket_level, killed=false}
Ticking entity: minecraft:player, entity class: net.minecraft.server.level.ServerPlayer
Entity status: removed: false, valid: true, alive: true, is passenger: false

根据此段Dump数据第3行知为在特殊地图中的区块(-62500,-6250)加载超时而导致服务器宕机。
根据下文数据知为一玩家试图加载该区块时触发某些错误导致该区块损坏,区块数据无法访问。
虽然该区块损坏原因不明,但鉴于已有明确目标区块,我们通过编辑存档文件的方式移除了该区块的所有内容使服务器恢复正常。
值得庆幸的是,该区块几乎为空。

Current Thread: Server thread
  PID: 40 | Suspended: false | Native: false | State: TIMED_WAITING
  Stack:
    [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
    [email protected]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:269)
    net.minecraft.util.thread.BlockableEventLoop.waitForTasks(BlockableEventLoop.java:149)
    net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:139)
    net.minecraft.server.level.ServerChunkCache$MainThreadExecutor.managedBlock(ServerChunkCache.java:815)
    net.minecraft.server.level.ServerChunkCache.syncLoad(ServerChunkCache.java:111)
    net.minecraft.server.level.ServerChunkCache.getChunkFallback(ServerChunkCache.java:145)
    net.minecraft.server.level.ServerChunkCache.getChunk(ServerChunkCache.java:294)
    net.minecraft.world.level.Level.getChunk(Level.java:1018)
    net.minecraft.world.level.Level.getChunkAt(Level.java:1007)
    net.minecraft.world.level.Level.getFluidState(Level.java:1371)
    net.minecraft.world.entity.Entity.updateFluidOnEyes(Entity.java:2063)
    net.minecraft.world.entity.Entity.baseTick(Entity.java:915)
    net.minecraft.world.entity.LivingEntity.baseTick(LivingEntity.java:454)
    net.minecraft.world.entity.Entity.tick(Entity.java:881)
    net.minecraft.world.entity.LivingEntity.tick(LivingEntity.java:3290)
    net.minecraft.world.entity.player.Player.tick(Player.java:289)
    net.minecraft.server.level.ServerPlayer.doTick(ServerPlayer.java:1072)
    net.minecraft.server.network.ServerGamePacketListenerImpl.tick(ServerGamePacketListenerImpl.java:360)
    net.minecraft.network.Connection.tick(Connection.java:639)
    net.minecraft.server.network.ServerConnectionListener.tick(ServerConnectionListener.java:248)
    net.minecraft.server.MinecraftServer.tickConnection(MinecraftServer.java:1932)
    net.minecraft.server.dedicated.DedicatedServer.tickConnection(DedicatedServer.java:459)
    net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1901)
    net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1669)
    net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1334)
    net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:339)
    net.minecraft.server.MinecraftServer$$Lambda/0x00007f2b48ecbdb0.run(Unknown Source)
    [email protected]/java.lang.Thread.runWith(Thread.java:1596)
    [email protected]/java.lang.Thread.run(Thread.java:1583)

无限重启

21时04分,服务器又陷入无限重启;我们在撰写本报告,查阅日志时发现日志文件过多,登录后台发现服务器处于无限重启状态。
该故障表现为服务器一经完全启动就被/stop关闭。由于服务器通过正常方式(/stop)关闭,因此没有崩溃报告可供参考。
不过,启动过程中抛出的一个异常引发了更大的危机。

[com.bekvon.bukkit.residence.Residence] null
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
	at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:?]
	at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) ~[?:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.protection.ResidenceManager.multithreadLoadMap(ResidenceManager.java:1215) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.protection.ResidenceManager.load(ResidenceManager.java:1099) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.Residence.loadYml(Residence.java:1502) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.Residence.onEnable(Residence.java:672) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:288) ~[leaves-api-1.21.3-R0.1-SNAPSHOT.jar:?]
	at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:202) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:109) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:520) ~[leaves-api-1.21.3-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.craftbukkit.CraftServer.enablePlugin(CraftServer.java:660) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:609) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:770) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:529) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:332) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1239) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:339) ~[leaves-1.21.3.jar:1.21.3-91-46e8b6c]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
Caused by: java.lang.OutOfMemoryError: Java heap space
	at java.base/java.util.Arrays.copyOf(Arrays.java:3482) ~[?:?]
	at java.base/java.util.ArrayList.grow(ArrayList.java:237) ~[?:?]
	at java.base/java.util.ArrayList.grow(ArrayList.java:244) ~[?:?]
	at java.base/java.util.ArrayList.add(ArrayList.java:483) ~[?:?]
	at java.base/java.util.ArrayList.add(ArrayList.java:496) ~[?:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.protection.CuboidArea.getChunks(CuboidArea.java:265) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.protection.ResidenceManager.lambda$6(ResidenceManager.java:1306) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.protection.ResidenceManager$$Lambda/0x00007f498a6ed0d8.accept(Unknown Source) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at java.base/java.util.HashMap$Values.forEach(HashMap.java:1073) ~[?:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.protection.ResidenceManager.getChunks(ResidenceManager.java:1306) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.protection.ResidenceManager.lambda$4(ResidenceManager.java:1186) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at [安全-领地]Residence5.1.6.4.jar/com.bekvon.bukkit.residence.protection.ResidenceManager$$Lambda/0x00007f498a6ea710.call(Unknown Source) ~[[安全-领地]Residence5.1.6.4.jar:?]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[?:?]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[?:?]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[?:?]
	at java.base/java.lang.Thread.runWith(Thread.java:1596) ~[?:?]
	... 1 more

java.lang.OutOfMemoryError指由于内存分配不足,相关代码无法执行而抛出的异常。
但是我服此时面板内存分配为16GB,分配给Java的为15GB;服务商统计数据显示该时间段内的内存峰值占用约6.3GB,何谈内存不足?
稍后在分析启动脚本时发现了一处很久以前的Bug:启动脚本内相关参数不正确

${openjdk21} -Xms4096M -Xmx$15g -... -jar ...

启动命令行内的最大参数值写法不对,存在以下问题:

发现该低级问题后,我们迅速采取措施,修复了相关问题。
同时,领地插件内存溢出的另外一个诱因是配置文件中含有一个巨大的服务器保留领地,使得领地插件试图注册区块事件时卡死。
目前,该领地已被移除。

总结与反思

本次事件导致了栈流Streack间断停服计6小时15分钟,降低了玩家体验。
我们对此深表歉意,并承诺在后续更新中提高代码质量、增强审核校验,尽最大可能降低该类事件发生的概率。

本次意外停服补偿:/redeem stop-0524ee,于服务器时间2025-05-30 01:00过期。