Skip to content

Instantly share code, notes, and snippets.

@ustc-zzzz
Last active January 12, 2019 10:50
Show Gist options
  • Save ustc-zzzz/29513e7517c0e2ba3281870396a1ef50 to your computer and use it in GitHub Desktop.
Save ustc-zzzz/29513e7517c0e2ba3281870396a1ef50 to your computer and use it in GitHub Desktop.
The Simplified Chinese Translation of Ras' Server Performance Guide

Rasgnarok 的服务端优化指南

译者注:原文由 Rasgnarok 整理,是针对 Mod 服务端尤其是 Sponge 服务端的优化指南,目前深受 Sponge 官方社区认可。本人在得到原作者许可后,将其翻译过来。原文最后更新于 2018 年 10 月 6 日。

正文

如果你有任何问题,请尽管来 Discord 找我:@Rasgnarok#6969。

本文针对服务端优化与性能监控,提供了一份简略指南以及一组相应的建议。如果整篇指南中有什么问题,请尽管联系我(指 Rasgnarok)。很多服务器都有不必要的性能损失,因此除升级硬件外,有很多其他的解决方案,服务器管理人员应该尝试下。如果你想要为这份指南添加一些额外的解释和说明,请直接联系我(指 Resgnarok)修改。

注意:下面很多选项是专为 Pixelmon 服务器量身打造的。后续我可能为一般的 Mod 服务器分门别类地添加一些内容,不过就目前的指南本身,如果你并不开 Reforged 服务器,请直接忽略 Pixelmon 的相关部分。

预生成地图

请注意:这并不能完全消除性能上的影响。不过,如果玩家大量跑图,这么做会显著提升性能。

  1. 下载安装 Nucleus,Sponge 平台的基础插件。

  2. server.properties(通常位于服务端根目录下)中设置 max-tick-time-1。这样做是为了避免服务器因为运行时间过长而自行关闭。这一设置针对的是 Minecraft 服务端的守护进程(Watchdog)。守护进程这一 Minecraft 原版的“特性”会在服务端在单个 tick 运算耗时过长时使服务端崩溃。如果你要预生成地图的话,服务端往往会在单个 tick 耗时很久,然而这是我们意料之中的事。如果不禁用这一行为,那么在预生成地图的时候,你很可能会看到令人烦躁的崩溃报告。

  3. 确保你的服务器里没有人,或者开启了白名单模式。预生成地图时如有玩家在线,那么玩家只会得到非常卡顿的体验,因此还是不要让服务器里有玩家最好。

  4. 执行 /world border set [world] [center-x] [center-z] [diameter-in-blocks] 命令。世界边界越大,地图就越大,预生成所花的时间就会越长。我建议把世界边界的大小弄到 15000 和 25000 格之间。一旦你决定了世界边界的大小,记得额外加 2000 格。比如说如果你想要的边界大小为 15000 格,那么预生成地图的大小就应该设为 17000 格。

    • 世界边界大小的选定很大程度上取决于两点:一方面考虑服务器剩余空间,另一方面考虑服务器中该地图的玩家数量。以下是一些你需要时刻牢记的注意事项:

      • 管理直径 3 万格以外的地方是一件很痛苦的事情,开服十个月后世界存档可能就会到 50 GB 那么大了。

      • 就我个人而言,如果最大在线玩家数量为 100 的话,我会把(世界边界的)直径设为 26000 格。我遇到过更大或更小的情况,不过我从来没担心过存储空间不够的问题。如果在线玩家的规则更小(或者说你刚开服),直径 15000 格应该够用了。

      • 每个玩家自由探索的世界你都要考虑。换言之,考虑到存储空间的话,每个世界都设置成 26000 格似乎不太划算。

  5. 执行 /world border gen [world] 命令以开始预生成地图。控制台将会不断输出信息指示整个预生成地图过程已经完成了多少。不必担心会发生什么意料之外的事,整个预生成地图过程只会在抵达边界后停下来,因此你可以干点别的,不需要一直盯着服务器。

    • 你可以使用 -a 标志以开启“激进的”预生成模式,比如这样:/world border gen -a [world]。如果你开启该标志预生成,那么整个预生成地图过程将会快一些,不过服务端承受的压力也将猛增。请在开启该标志前确保你并没有在使用土豆服务器。

    • 你也可以增加两次保存存档之间的间隔,这样也会让预生成更快一些,比如这样:/world border gen --save 5m [world]。不过,如果服务器不慎崩溃了,那么你就要花更长的时间恢复崩溃前预生成的部分了。当然,你可以把这一选项和 -a 标志结合,以获得最大的预生成速度。

  6. 请时刻牢记预生成地图需要花很的时间。请倒杯咖啡,坐和放宽。或许你得倒 2 杯咖啡,或许你得倒 3 杯咖啡,不管怎样,请谨记,心急吃不了热豆腐。

  7. 整个预生成地图过程完成时,控制台会输出一条相应的日志,接下来请执行 /world border set [world] [center-x] [center-z] [diameter-in-blocks] 命令。这里请使用你最开始期望的直径,比方说,你可能希望最开始生成 15000 格这么大的地图,那就传入 15000 进去。这样做的用途是防止服务端在玩家抵达边界的时候生成新的地图区域,因为之前预生成的更大的地图起到了缓冲的作用。

  8. 对所有需要这么做的世界重复上述过程。

  9. 预生成完成后,请重新打开 server.properties 文件并将 max-tick-time 设置回 18000

选用合适的 JVM 参数

  1. 这里我想引用 Aikar 提供的参数。它为 Sponge 提供了性能分析工具,并在 Minecraft 社区中的 Java 服务器性能相关的领域提供了很大的帮助。请参阅他的这篇帖子:https://forums.spongepowered.org/t/optimized-startup-flags-for-consistent-garbage-collection/13239

  2. 我还要指出来的一点是,就目前大多数 Mod 服务器而言,相应的服务端都需要至少 2 GB 内存才能开起来。服务器的在线玩家数越大,服务端需要占用的内存就应越多。请不要把服务器上的所有内存都分配给服务端,也不要分配超过 20 GB 的内存。单端 100 玩家,保持 20 TPS,同时使用 -Xmx16G-Xms14G 两个参数的服务器我也是见到过的,因此这完全是可以做到的。如果你执意分配更多的内存,那么最后要是出事,你服务器的内存本身,可不应该承担任何责任

减小视距

  1. 打开通常位于服务端根目录下 server.properties 文件。

  2. Minecraft 的默认视距为 10。这意味着玩家在服务器移动/静止时,其身边将有足足 10 个区块的范围保持加载。这可太多了。

  3. 服务端加载的区块越多,其性能就会越差。请将 view-distance 下调到 6 或者 4。

调整方块实体和实体的激活范围

通过修改 Sponge 的官方配置文件 global.conf(位于 /config/sponge 目录下),你可以调整实体和方块实体的激活范围,从而让服务端每 tick 执行的任务更少一些,从而大幅度提高性能。

  1. 打开 global.conf

  2. entity-activation 选项下,把 auto-populate 打开。把默认范围调整成 32。

  3. 找到 tileentity-activation 选项并做同样的事——把 auto-populate 打开,并把默认范围调整成 32。

  4. 将文件同步到服务器上,并重启服务器。

  5. 请在接下来几个小时或几天定期检查这一文件(这取决于你服务器玩家的活跃程度)。配置文件中将不断产生新的选项,它们分别位于实体(如 minecraft:pig)或方块实体(如 pixelmon:fossil_cleaner)的名称后。

  6. 现在你可以通过 global.conf 下的 entity-activationtileentity-activation 两个选项分门别类地指定激活范围了。我通常会调整成 16/8/6,不过这是因为我比较喜欢住在边缘。激活范围设置得越小,实体和方块实体对服务端的性能影响就越小,不过这也不代表你应该把值设置成接近零。如果你这么设置的话,那么实体和方块实体就不能正常工作了。这不是我们所期望的。

注意:你必须使用 API 版本不低于 API 7.1,同时版本号不低于 SpongeForge 2990 的服务端版本,因为之前的版本把方块实体的激活范围这一功能临时屏蔽了。

谨慎选择插件和 Mod

这取决于你使用的服务器的质量。不是所有的插件或 Mod 对服务端性能的影响都是相同的。一些诸如 Pixelmon 等插件或 Mod 所带来的性能影响是无法避免的,不过,插件或 Mod 也可能不是这样。

考虑 Polis,再考虑 GriefPrevention。前者对服务器影响很大,因为它把所有东西都记录到同一个文件下,而后者把相关的检查拆分成若干文件,并由 LuckPerms 维护。选用正确的插件(和 Mod)有时会很大程度地影响,或是说提升,服务端的性能。如果你对某些事有疑问,看看相关评论,检查一下有没有人在服务端性能方面提供了评价。

检查插件和 Mod 的配置选项

服务端总是有新的功能等着你去体验测试。为了让服务端性能保持在一个较好的水平,你应该时刻关注能够有效提升性能的新方法。当然,如果你要编辑一样东西,而你却不知道该做什么,可以试着问问周边的人,他们可能会给你一些意见和建议。以下是我(指 Resgnarok)能够为你提供的意见和建议。

  1. Pixelmon 的 HOCON 配置提供了一个选项,可以很好的降低存档带来的性能影响:把异步保存存档的功能打开。找到 useAsyncSaving 选项,然后设置为 true

  2. Sponge 官方的 global.conf 文件提供了异步计算光照的选项。你可以把光照计算分摊到更多的线程上,从而有效提升已加载区块的光照计算部分的性能。

  3. Sponge 官方的 global.conf 还提供了一个名为实时 TPS(Real-time TPS)的实验性的功能。请打开该文件,并在 modules 下将 real-time 选项设置为 true。服务端在开启这一功能后即使出现卡顿,也会尽可能地为客户端提供 20 TPS 的体验。

  4. 如果你在开 Pixelmon Reforged 服务器,那么其 Better-Spawner 特性非常值得挖掘。试试调整不同的选项,然后看看哪种组合最适合你的服务端。服务器的种类千差万别,因此玩家所期望的也各有不同,这需要你来权衡利弊。请找到 pixelmon.hocon 文件(通常位于 /config/pixelmon.hocon 这一位置),并按照相关页面完成针对 Better-Spawner 的配置。

  5. 有时 GriefPrevention 不断累积的物品掉落会造成性能问题。请在野外(Wilderness)执行 /cf collide-block minecraft:item minecraft:any true override 命令以降低其对服务端的性能影响(感谢 I9 提供了这条建议)。

  6. 使用 CatClearLag 或某个定时执行命令的插件,以定时执行 /pokekill 命令及清理物品。这两者都是出了名的难搞,因此我建议在配置插件时提供额外的信息,从而确保回收能够正常完成。

    • CatClearLag以及其他修复插件可用于基本配置的修复调整,包括但不限于 Pixelmon 及 Minecraft 本体的怪物生成。不过,这些事也可以由你自己完成。我个人不建议把他们当作“性能提升”插件来对待,因为它们实际上并不是针对性能提升的。换言之,如果你的服务器上实体很卡服,而你想要找一个定期清理实体的插件,那尽管去用。你需要仔细检查和定期清理相关的配置,而不要指望类似的插件能够在你什么都不做的情况下化腐朽为神奇。不要指望类似的插件能够解决本指南的任何一部分。
  7. 每个服务端都应考虑保存世界存档的相关问题。Sponge 默认每 45 秒保存一次。打开 global.conf 文件,并将保存玩家数据和保存世界存档的 tick 间隔设置成相同的值——我的服务器通常会每五分钟进行一次,因此我会设置成 6000 tick。

    • 你可以把保存间隔设置得很长,这完全由个人决定。不过请谨记,你需要考虑“玩家在崩溃前能够承受无用功的最大时间间隔”,并将时间间隔设置为这一值。如果服务端崩溃了,那么数据将在重启后回到上一次保存世界存档的时刻——为方便管理,你应该提高保存世界存档的频率。
  8. 打开 Sponge 官方的 global.conf 文件,并将 structure-saving 下的 auto-populate 选项设置成 true。这将有助于保存矿井等设施。

    • Sponge 官方还提供了名为 use-real-time 的选项以及名为 user-panda-redstone 的选项。建议把这两个选项都打开。

时刻监视服务端性能

提升服务端性能这件事,不是一蹴而就的,而是变化无常的。所以一旦出现了新的性能问题,你需要识别并查清楚问题出在哪里。因此,你需要监视你的服务端,并注意服务端抛出的异常,及不正常的数据。

  1. Sponge Timings

    • 打开 Sponge 官方的 global.conf 文件,并将 timings 下的 history-length 选项设为 18000,同时将 history-interval 选项设为 2000

    • 这样做的优势是 Sponge Timings 会收集更多的数据,从而通过 /sponge timings paste 命令展现出来。虽然 Sponge Timings 展现出来的结果可能看着很复杂,但是它对于找出性能问题来说还是很有用的。请保证右上角的标签分别为 “AVG” 和 “ALL”。直觉上来说,展现出来的图中,大部分应该都是绿的,几乎不会有大的涨落。这里有一张示例图原图链接)。

    • 检查一下下面列表中的数据是否有不正常的情况。如果你看到了“doChunkMap”,“chunkGenerator”,或者“chunkPopulate”,那是因为你没有预生成整个地图(请从本指南最开头处看起)。

    • 如果你在列表最开头的地方看到了“ComputerManager”或者“PokeballManager”,请注意这两条是常见且不可避免的,同时也是人畜无害的。通过对服务端的逐渐深入了解,你将会有能力区分列表中飘红的部分,哪些是“正常”的性能占用。如果某个插件或 Mod 经常飘红,你可能需要找相关开发者问一问。

      注意:如果你使用 Reforged 的 6.2.0 或更高版本并开启了 save-async,那这应该不是问题。

    注意:对于 Timings v.1(SpongeForge 3206 或更低版本),展示的数据中可能会过分高估区块加载。这实际上是一个 BUG。该 BUG 由我(指 Resgnarok)汇报并已被确认,同时已在 SpongeForge 3361 这一版本被修复。

  2. Nucleus 的 GC 命令

    • Nucleus 的 /gc -c 命令可以帮助你快速了解最近一段时间的性能状况。请关注“loaded chunk”的平均值,这一平均值将会随着玩家数量的变化而变化。
  3. Forge 和 Sponge 的 TPS 命令

    • Forge 和 Sponge 都提供了查看 TPS 的命令。请执行 /forge tps 或者 sponge tps 以快速检查服务器的最近性能状况。

    • Minecraft 默认一秒 20 tick(TPS),因此如果最后输出显示 TPS 比 20 低,请跑一次 Sponge Timings 并检查控制台输出,从而寻找问题的蛛丝马迹。

  4. 服务端控制台

    • 如果你的服务端的 TPS 不足,同时服务端控制台循环输出错误,那么我们还可以借助最原始的工具:服务端控制台。大多数但并非所有情况下,漫山遍野的报错将会影响性能,因此在进一步的调查分析前,请先检查检查服务端控制台抛出的错误。
  5. TickProfiler

    • TickProfiler 是一样非常简单的工具。你可以在 MinimallyCorrect 的 GitHub 找到文档和源代码,并下载 JAR 安装这一工具。如果 Sponge Timings 本身提供了信息还不够多,你想知道到底是哪里导致 TPS 出了问题,你可以试试这一小工具。这一小工具将会追踪世界上的实体和方块实体。感谢 merjilin 提供了这条建议。
  6. WarmRoast

    • WarmRoast 可以从其作者 sk89q 的 GitHub 上下载。WarmRoast 仅建议仅作为性能分析工具,而不要始终保持在线。当你觉得 Sponge Timings 无法找出问题出在哪里,同时你认为你的服务端有内存泄露问题时,你可以试试 WarmRoast。
  7. Spark

    • 你一定记得 LuckPerms 的作者 Luck,是他开发了这一 Sponge 插件。相较 WarmRoast 而言,Spark 更用户友好一些,因为它可以让用户在游戏内进行性能分析(而 WarmRoast 并不能这么做)。该插件新增加的这一特性使得我更青睐它,因为它配置起来更容易,同时有 Discord 可以方便我询问相关问题。请在这里下载并阅读插件文档。

提高稳定性(崩溃、超时、TPS 不足等烦人的事情)

完美的稳定性是不存在的。问题总是不断出现,因此请在服务端性能滑坡时及时响应。某些诸如崩溃后引起的问题可能会降低服务端和玩家数据的稳定性,从而难以恢复。为避免杂乱,这一部分将只包含与 Minecraft、Forge、Sponge 有关的问题,而不会涉及到具体的插件。

  1. 常见的崩溃原因

    • 世界存档或玩家文件损坏

      • 世界存档或玩家数据中的某一部分可能会完全损坏,从这种角度来说,最好把损坏的那一部分删除。请打开 worldname/regionworldname/playerdata 两个目录,并寻找是否有 .mca 后缀的文件的大小是 0。如果有的话,请把它删除或者从备份中恢复。这些文件都已经损坏了,因此服务端会在保存世界存档的时候报错。

      • 有时候,区块第一眼看到没什么问题。请使用 Fenixin’s Region Fixer 以检查你的服务端世界是否有问题。检查时抛出的提示信息将会引导你找到损坏的文件。

    • level.dat 等文件损坏

      • 这可能是最令人恐惧的问题了,因为这一问题带来的“特性”会将 Mod 的方块 ID 变成其他方块的,比方说把球果树(Apricorn Tree)变成骨块(Bone Block)等。如果想要恢复:

        • 把服务端关掉。

        • 请在备份里分别检查名为 level.datlevel_sponge.datlevel.dat_oldlevel_sponge.dat_old、以及 forcedchunks.dat 的几个文件。当然了,如果你开的不是 Sponge 服务器,所有带 _sponge.dat 文件都不会有。

        • 请保证服务端处于关闭状态,并把这五个文件从备份中覆盖到服务端主目录的相应文件。如果你有不同的世界,请重复这一过程,因为不同的世界的这五个文件各自都不一样。

        • 启动服务端,方块应该正常了。

    • 考虑 1.12 及更高版本的服务端的超时问题:Random Patches

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment