分析器检查什么
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 性能报告
- 在控制台或游戏中执行
/spark profiler start。Paper 和 Purpur 1.21 及以上已经内置了 spark。 - 在正常时段、有玩家在线时至少记录 5 分钟。空服务器的报告只能显示一个空闲的服务器。
- 执行
/spark profiler stop。spark 会上传报告并输出一个https://spark.lucko.me/…链接。 - 把链接粘贴到上面。分析会自动开始。
如果卡顿是突发的峰值而不是一直卡,就只记录慢 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 之类的键),并且任何拿到链接的人都能打开它。