908 字
5 分钟
Minecraft服务器性能异常的解决经验
2026-02-27
无标签

起因#

大概在本月中旬, 一些玩家反映出服务器非常卡, 然后我就登服务器控制台看了眼tps, 发现只有个位数, 而且服务器的CPU占用和内存占用也非常高, 内存占用高是一个月之前的事了, 当时抱着能跑就行的想法就没管, 反正就是这么个情况

调查#

我首先是重启了下服务端, 毕竟重启解决99%的问题嘛, 然后没用~~~有用也就不会有这篇文章了~~, 一般来说, 这种性能问题都是重启解决不了的, 然后性能问题又一般来说是由掉落物太多导致的, 所以我就forge entity list来查看了一下掉落物. 不幸的是, 掉落物挺少的. 所以基本排除. 然后还有人在群里面发了一张堆满箱子的一个地方, 不过也不是, 时间对不上.

Spark#

这时候就要用Spark这个工具来分析一下了, Spark是一个MC的性能分析工具, 是个模组. 不过其实还有个Apache Spark是做数据分析的, 反正就下MC的Spark就行, 然后放到模组文件夹里面.

装好重启完服务器Spark就装上了, 这时候在控制台spark profiler --thread Server Thread这样创建一个profiler 监测Server Thread这个进程, 也就是MC服务器的主进程. 然后过一会spark profiler stop接着Spark会给你一个链接, 链接进去就是你的监测报告了. 划到最下面, 有一个Server thread, 注意这个东西是可以展开的, 你猜为啥我要说, 因为我一开始没发现. 我这边就切换到火焰图模式了, 这样子比较直观一点. 可以看到nm.world.item.BucketItem.use ()这个占用很高, 再看两眼, 上面很多高占用的方法都带Deployer, 也就是机械手, 所以说不难推测是机械手使用桶导致的问题.

问题到这已经可以解决了, 不过我们还可以接着往下看来分析原因, nm.world.level.Level.getChunk()所以说机械手使用桶的时候会调用区块加载.

AI给出的解释#

机械手使用桶, 众所周知, 使用东西的时候会发射一条射线来判断有没有东西可以使用, 而发射射线的时候要加载射线经过的区块, 又因为区块没有被GC回收导致了高内存占用, 同时没有缓存导致重复加载, 所以导致区块频繁被加载, 造成了高CPU占用

大概就是这个意思, 反正也是找到问题所在了

问题的根源#

后来就在群里问最近有没有什么机器用到了机械手, 还真是, 就是一个挤奶机, 如下图 后来我让建机器的人吧机械手拆了就没事了

完结撒花~

结语#

这次也是难得的疑难杂症了, 刚好体验了Spark这么个工具, 还是很好用的.

当然也要吸取经验啦, 所以就有了这篇博客, 那么各位服主如果服务器出现性能问题也可以这样排查

  1. 使用tps或者forge tps(后者可以查看各维度的tps), 排除网络问题
  2. 使用forge entity list 或者直接kill @e[type=item]查看掉落物或者直接清除掉落物看看是不是掉落物问题
  3. 使用Spark这类性能分析工具来看疑难杂症, 可以适当问问AI.
  4. 求助群友:)
Minecraft服务器性能异常的解决经验
https://fuwari.vercel.app/posts/minecraft服务器性能异常的解决经验/
作者
Potpot123
发布于
2026-02-27
许可协议
CC BY-NC-SA 4.0