EndyStudio
插件

spark 性能报告分析器

粘贴 /spark profiler 给出的链接,得到服务器的 TPS 和 tick 耗时、一份关于 Java、服务器配置文件和插件该改什么的清单,以及每个插件在每个 tick 中占用的时间。

  • 免费
  • 无需账号
  • 在浏览器中运行

spark 性能报告

如何获取链接

  1. 在服务器上执行 /spark profiler start。从 1.21 起,Paper 和 Purpur 自带 spark;其他服务端请先安装 spark 插件或模组。
  2. 在有玩家在线时至少记录 5 分钟。
  3. 执行 /spark profiler stop,把它给出的链接粘贴到这里。

报告会从 spark.lucko.me 直接下载到你的浏览器,不会经过我们的服务器。

分析器检查什么

spark 每秒多次记录服务器正在做什么,并把这些记录连同服务器的数据和配置文件一起上传。分析器会读取全部内容,从四个方面检查:

  • 服务器运行状况。 最近几分钟的 TPS 和 MSPT、CPU、内存、玩家和已加载的实体,以及每分钟一根的柱状图,让你看到什么时候开始变慢。
  • Java 和机器。 堆内存大小、垃圾回收器以及是否使用了 Aikar 参数、Full GC、回收后剩余的内存、CPU 线程数,以及机器是否内存不足或被其他程序占用。
  • 设置。 server.properties 中的 view-distance 和 simulation-distance、bukkit.yml 中的刷怪上限、spigot.yml 中的实体激活范围,以及 Paper 和 Purpur 中关于爆炸、红石、碰撞、刷怪笼、漏斗、盔甲架和村民的选项。每条建议都会写明要改哪个文件的哪个键。
  • 插件。 每个插件在主线程上花费的时间、容易惹麻烦的插件(ClearLag、PlugMan、生物堆叠插件),以及实体最多的区块,并附上传送过去的 /tp 指令。

建议按从最该先修的到可选的小建议排序。只要服务器还跟得上,设置方面的改动就会显示为建议:它们腾出的是你暂时还用不上的时间。

如何生成 spark 性能报告

  1. 在控制台或游戏中执行 /spark profiler start。Paper 和 Purpur 1.21 及以上已经内置了 spark。
  2. 在正常时段、有玩家在线时至少记录 5 分钟。空服务器的报告只能显示一个空闲的服务器。
  3. 执行 /spark profiler stop。spark 会上传报告并输出一个 https://spark.lucko.me/… 链接。
  4. 把链接粘贴到上面。分析会自动开始。

如果卡顿是突发的峰值而不是一直卡,就只记录慢 tick:/spark profiler start --only-ticks-over 100 只保留耗时超过 100 ms 的 tick,忽略其余的。

TPS 和 MSPT

服务器以 tick 为单位运行世界,每秒 20 个,所以每个 tick 有 50 ms。MSPT(每 tick 毫秒数)是一个 tick 实际花费的时间。只要它低于 50,服务器就能维持 20 TPS,并且还有余力。一旦 tick 花得更久,TPS 就会下降,所有人的生物、红石和作物都会变慢。

MSPT 含义
低于 30 ms 应对繁忙时段的余量充足
30 – 45 ms 正常,但余量不多
45 – 50 ms 处在极限:任何峰值都会显现
超过 50 ms 服务器跟不上,TPS 下降

分析器看的是第 95 百分位,也就是 95 % 的 tick 都低于的那个时间。平均值会掩盖慢 tick,第 95 百分位不会。

如何看各插件耗时

插件列表把每个插件的代码在主线程上花费的时间加起来,再除以记录的 tick 数,所以单位是每 tick 毫秒数,对照每个 tick 的 50 ms 来看。一个每 tick 花 5 ms 的插件,自己就用掉了十分之一的预算。一个插件调用另一个插件时花的时间,算在被调用的那个插件上,和 spark 自带查看器的算法一样。

插件之外剩下的就是游戏本身:实体、区块、红石和玩家。设置方面的建议针对的就是这一部分。要准确看到插件的哪个任务在耗时,请在 spark 的查看器中打开报告,切换到 Sources 视图。

通常最有效的改动

  • 调低 simulation-distance 到 5 或 6,view-distance 调到 8 左右。模拟距离决定每个玩家周围有多大范围的世界在运算,所以它影响每一个 tick。
  • 调低 spigot.yml 中的实体激活范围,让远离玩家的生物运算频率降低。
  • 使用 Paper 的选项:optimize-explosions、ALTERNATE_CURRENT 红石实现、max-entity-collisions 设为 2,以及刷怪笼 tick 频率设为 2。
  • 用 Aikar 参数启动 Java,并配一个适合服务器的堆内存。内存计算器会帮你把两者都写好。
  • 预生成世界,用 Chunky 这类插件,这样玩家游玩时就不用生成新区块。

一次只改一项,改完重新记录一份报告。这样你就知道是什么起了作用,如果哪个农场不工作了,也知道该撤回什么。

你的报告与隐私

分析器在你的浏览器中运行:报告从 spark.lucko.me 直接下载,从不经过 EndyStudio。请注意,spark 报告包含你的服务器配置文件(spark 会隐藏密码、IP 之类的键),并且任何拿到链接的人都能打开它。

常见问题

怎么生成 spark 性能报告?

在服务器上执行 /spark profiler start,在有玩家在线时至少记录 5 分钟,然后执行 /spark profiler stop。spark 会上传结果并给你一个 spark.lucko.me 链接。把这个链接粘贴到分析器里。

Paper 自带 spark 吗?

是的。从 Minecraft 1.21 起,Paper 以及 Purpur 等分支都内置了 spark,所以不用安装任何东西就能使用 /spark 指令。在 Spigot、Fabric、Forge、NeoForge、Velocity 或 BungeeCord 上,需要先安装 spark 插件或模组。

MSPT 多少算正常?

每个 tick 有 50 ms。低于 30 ms 余量充足,30 到 45 ms 可以但比较紧,一旦 tick 经常超过 50 ms,服务器就无法维持 20 TPS,玩家会感觉到卡顿。

我的报告会发送给 EndyStudio 吗?

不会。你的浏览器直接从 spark.lucko.me 下载报告,并在你的电脑上分析。不经过我们的服务器,也不保存任何内容。请注意,任何拿到 spark 链接的人都能打开它,包括其中你的服务器配置文件。

为什么分析器没有显示插件耗时?

插件耗时来自 spark 的调用树,只有 /spark profiler 生成的报告才有。健康报告(/spark health)和堆内存摘要(/spark heapsummary)都不包含它。

分析器说一切正常,但玩家还是卡,为什么?

玩家那边的卡顿不一定来自服务器。如果 TPS 稳定在 20 且 tick 耗时很短,请检查网络连接(延迟、丢包、代理)或客户端自己的帧率。如果卡顿是一阵一阵的,用 /spark profiler start --only-ticks-over 100 只记录慢 tick。