本帖最后由 EmptyLava 于 2020-11-26 22:53 编辑
Timings优化分析教程

- 前言 -
Preface —— Explain Why

- 为何要写这篇教程帖?
- 最近在问答帖中看到了很服主因服务器TPS低而求助,但他们中大多都不会分析Timings,而站内一些关于Timings分析的教程帖,不是对小白服主不友好就是说明的不够详细。因此突发写一篇分析Timings教程的念头

- 什么是Timings?
- Timings是spigot内置的允许服务器管理员监视服务器运行状况的工具,目前有Timings v1和Timings v2(仅对于Paper和Sponge)两个版本,Timings v2有图形化界面,对用户更友好,且不需要像Timings v1那样需要特殊手段(毕竟是国外网站)才能展开报告内容。

- 本篇文章适用于哪些服务端核心?我服务器核心能不能用?
- 适用于绝大部分主流核心,如spigot,paper,catserver,sponge,Uranium等,但对于mite这种魔改核心和官方原版核心不适用

- 其他须知
- 本教程重分析而轻优化,目的是为了让服主可以读懂timings而不是如何具体优化,而其他优化教程如喵的mod服优化教程帖极光的插件服优化教程帖这两个教程是重优化而轻分析原因。如果你只想优化服务器增加tps而不想知道确切卡服原因,建议选择上方链接中的教程。另外本帖可能有很多单词翻译不当(如Tick,我实在想不出有什么翻译能通俗易懂还能表达正确意思了),如果你翻译的更好可以在评论中指出,我会为你献上1人气+10金粒
另外请不要在本帖讨论以下内容
  • 水帖
  • 与Timings和优化无关的内容
*本帖图片大多已折叠(用ipad截的图,2048*1536,防止流量党躺枪)

- 字数统计
汉字:3665 个
中文标点:268 个
汉字+标点:3933 个
英文:3762 个 (含英文状态下的数字、符号、标点)
数字:271 个
字符总数:11628 个字符
纯文本:31516 字节

- 更新日志
2020/11/26: 优化排版,


- 教程 -
Course —— Solve How

I.创建服务器的Timings报告
1.准备部分:确保在bukkit.yml中的plugin-profiling一项的布尔值为true,否则最终报告可能没有插件部分
2.生成报告:你需要在服务器或后台中输入命令/timings on(sponge端为/sponge timings on)。至少三分钟后输入命令/timings paste(sponge端为/sponge timings paste)。建议等待的时间长一些,时间短了获取的数据不够准确。输入/timings paste后如果成功的的提示应该是这样的
如果出现了红色的提示,如
A.(只出现在Timings v2)
提示你需要等待至少3分钟才能获取报告,你需要等一会儿
B.
说明服务器的网络有问题,是你的服务商禁止了外网或者dns污染而导致的
3.复制生成的链接并用浏览器打开(打开速度可能会有点慢,特别是timings v2)


II.分析Timings及解决方法
一、创建服务器的Timings报告
注:分析Timings的资源都以mcbbs内的问答帖中的链接为主,教程兼顾Timings v1与v2,分析方法相同
在Timings v1中,将会讲述如何分析timings
而Timings v2只是Timings v1的进阶版,只会补充一些新用法
Timings v1
除sponge和paper核心,都是使用Timings v1
Timings v1没有过多的分类,界面也很简陋粗糙
在开始学习分析Timings前,我们需要知道以下项
在报告的顶端,我们可以看到这些项
  • Total:处理事件所需时间的总和
  • Ticks:总共的游戏刻(正常情况下1s=20ticks)
  • Sample Time:报告取样的时间
  • Spigot Version:你的服务端核心版本
  • Average Players:服务器内平均玩家数
  • Average Entities:服务器内平均实体数
  • Avearage TPS:服务器内平均TPS①
  • Server Load:服务器负载(超过99%为过载)

在事件部分,我们可以看到这些项
  • Pct Total:处理单个事件所需时间的总和占比
  • Pct Tick:处理单个事件每1游戏刻所需时间占比
  • Total:所有事件取样所花费的总时间
  • Avg:所有事件取样所花费的平均时间
  • Count:处理了多少次这个事件
  • Event:事件的名称②
  • Tick:游戏刻③

注释:
①TPS=tick per second,每秒游戏刻,最大值为20
②如ResidencePlayerListener::onPlayerMove(PlayerMoveEvent)这个事件,关键词为Residence,PlayerListener,PlayerMove,说明是领地插件监听玩家移动的事件
③Minecraft中,把每秒划分成等时长的20份即每份50毫秒,每份50毫秒就是一次游戏刻,而大约每50毫秒就会执行一次游戏刻,。实际上Minecraft会动态调整每次等待的时间,以尽量满足每秒执行20次游戏刻的目标

当了解了这些项后,就可以开始正式分析Timings了
分析Timings有三步:读报告,找到问题,解决问题
1.读报告
最上面的Minecraft Total是原版事件部分,包括实体,区块,玩家连接和mod物品等,通常这个部分也是占用最大的。
接下来是Plugins 插件事件部分,Timings v1将每个插件的事件分开了而不是窝在一起,有时候插件报错,玩家的滥用,编写插件的人水平有限等都会导致插件占用很高,所以常常插件占用可以比得上原版事件。
最下面是Minecraft整个部分,原版事件和插件事件的总和,推荐从这里入手分析!,在这部分,从上到下,最上方的就是占用最高的,而最下方的是占用低的,同时事件中占用情况分为红色,黄色和黑色。
  红色:事件处理占用严重,建议必须优化
  黄色:事件处理占用较严重,可选择优化
  黑色:事件处理占用一般,不建议优化
2.找到问题
看到密密麻麻的数据时,很多人会不知所措,不清楚以哪种数据为基准。在此建议以Pct Total为主,Pct Tick为辅。Pct Total的意思就是处理了所有所有次该事件占时间的占比(一定小于等于100%),Pct Tick的意思就是处理1次该事件占时间的占比(可以大于100%,甚至达到百分之几千),他们的卡服的影响是不同的。Pct Total是持续,总体上的影响。Pct Tick是瞬间的影响,通常Count(处理事件数)数也很少。如果你的服务器TPS一直很低 应该主要注意Pct Total。如果你的服务器TPS突然降低又恢复,应该留心Pct Tick因此我们根据之前的前面的图可以发现Activated Entities占用最大,Sync Tasks占用其次。还需留心的是VirtualMenu BetterRTP TPAPro等插件导致的突发卡服。这样Timings的分析就完毕了。

但是新手分析的时候很容易出现以下错误
A.把Full Server Tick认为是卡服原因
很多人看到Full Server Tick就认为是它导致卡服的,可是你翻译一下 就是服务器总事件计算 即服务器内处理所有事件之和,既然是全部事件之和了,怎么能看出原因呢?
B.重复分析一条事件链上的事件
绝大多数人会从占用多的往占用低的看,当分析完上面的事件后又会看下面事件,给出卡服原因的时候常常会这样写。
TickEntity和EntityCat导致卡服

但是,这些人并不知道的是,EntityCat是TickEntity的子事件
通过树状图,我们可以看出EntityCat是TickEntity中的一部分。既然TickEntity已经包括了EntityCat,那也重复的意义和在呢?所以这句话应该改为
TickEntity的EntityCat卡服

Timings v2
仅sponge和paper核心使用,但使用最广泛
Timings v2分为五个部分-----可视化数据图,timings主区,区块数据,配置文件和插件
1.可视化数据图
上面的文字部分是用来显示一些基本数据的
    Uptime:服务器运行时间
    Max Players:服务器玩家上限
    Max Memory:服务器分配的最大内存值
    Online Mode:正版验证模式
    MOTD:服务器进入前界面的信息
    Version:服务端核心版本
下面的Logging Period是显示一些重要性能数据
    TPS:每秒游戏刻
    TPS Loss:每秒游戏刻损失
    Players:当前玩家数
    Tile Entities:当前方块实体数
    Entities:实体数(注:Timings 的实体计算方式和插件中计算实体的方式有很大差距,建议以插件为准)
    Chunks:区块
另外显示了折线图可以让你更好的知道服务器变化情况
*最近的Timings可以显示服务器内的GC(Garbage Collection,垃圾回收)的耗时情况
GC垃圾收集,Java提供的GC可以自动监测对象是否超过作用域从而达到自动回收内存的目的。

垃圾回收可有效使用内存和防止内存泄露。垃圾回收器通常是作为一个单独的低优先级线程运行,不可预知的情况下对内存堆中已死亡或长久无使用的对象进行清除和回收。

回收机制:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。

如果你看到GC的回收时间很长,服务器内存占用很高,这很可能是服务器内存泄漏了。
你可以在服务器启动参数内添加一些GC参数
或者使用这里的启动参数
2.Timings主区
从上往下是事件(在v1中已经解释了什么是事件)占用的情况,每个事件的下方会有一个Total(xx%,xxs,xx% of tick),前面的%就是Pct Total,在左方有很多蓝色的小按钮,点击后会展开显示它的子事件,与v1同理,越靠前的占用越大,说明越导致服务器tps降低。如minecraft::world Chunks这个事件就是主世界区块计算的事件,由于timings v1已经细讲了,v2就不再多讲了。

3.区块数据
Regions(区域)不同于Chunks(区块),一个Region占了512X256X512的方块,而一个Chunk只占了16X256X16的方块,比Region小很多。在这里面你可以看到每个Region中有多少实体,多少方块实体,还可以看出他们到底是什么实体(点击右方白色三角形展开即可)。但这里的数据并不准确,会比服务器内实体少
4.配置文件
你可以看到服务器中spigot.yml bukkit.yml paper.yml的配置,可以为你省去翻配置文件的烦恼,也可以让他人在分析Timings的时候可以更好地为你出谋划策。


5.插件
这个部分显示了插件的版本,插件作者和每个事件的占用情况,蓝色插件名右方为版本,Authors右方为作者。
如果没有这一栏,请将bukkit.yml中的plugin-profiling设置为true

III.实例分析
学习了这么多,我们就要开始在实战中分析一些实例
实例1(插件服) 难度:0.5
服务器虽然已经超载但是情况不严重,TPS还可以保持在18-19左右,我们依然从Pct Total排名上看,实体类和区块类是事件处理占用的前两名,实体中占用较大是Spider蜘蛛和Villager村民,蜘蛛在正常情况下不可能占用很高,所以高概率是玩家在使用刷怪笼刷蜘蛛。
因此优化方法为
1.使用相关插件降低刷怪笼刷怪速度并减少实体碰撞箱
2.降低村民AI,如有必要可以限制繁殖
3.适当降低view-distance(可选)

实例2(mod服) 难度:2
服务器负载已经超过了200%
从timings底端的Pct Total排名可以看出,最严重的是TileEntityTick(方块实体的处理,方块实体指箱子,熔炉等可交互方块),其次是Connection Handler(玩家做的事情都算这个事件)。细看方块实体我们可以看到是SpecialFlower和Hopper这两个东西导致的,SpecialFlower是植物魔法中的花(特别是产能话,卡服严重),漏斗是原版物品(可能包括mod物品中的管道运输,卡服原因很简单,因为这种传输方块一直在传输物品)
因此对于该Timings的优化方法为:
1.删除植物魔法mod或者极大程度限制使用,比如设置专门产能的地方
2.限制玩家使用管道运输或增加管道响应时间
3.提升服务器配置,限制玩家多次登录,如多次登录卡服的禁止登录一段时间

IV.卡服事件大全及优化方法
原版类
事件名称
优化方法
1.EntityVillager
(村民)
1.限制或禁止村民繁殖
2.使用寻路优化插件Villager Optimiser(1.14-1.15)
2.LivingEntityAI
(实体智商,高版本主要是村民)
1.使用寻路优化插件Villager Optimiser(1.14-1.15)
2. Bukkit.yml中将ticks-per中的
monster-spawns: 2 或更高(降低刷怪的速度,不建议高于5,否则游戏中可能找不到怪)
3.TileEntityHopper
(漏斗)
在spigot.yml中,设置
  1. hopper-transfer: 24
  2. hopper-check: 24
  3. hopper-amount: 3
复制代码
4.EntityTraderLlama
(流浪商人,1.14+)
暂无很好的解决方法,由于流浪商人会消失,可以不管或者使用kill命令
5.EntityMinecart
(矿车)
纯净生存不建议限制,mod服可以选择用任意扫地插件
6.EntityXXXXX
(其他实体)
1.使用插件
LagAssist(付费)
LaggRemoverPlus
2.Bukkit.yml中将ticks-per中的
monster-spawns: 2 或更高(不建议高于5,否则游戏中可能找不到怪)
3.Bukkit.yml中的spawn-limits(限制玩家周围能刷多少生物)
monsters: 45
animals: 10
4.将Spigot.yml中的entity-activation-range(限制实体被激活的距离,
但这可能导致某些需要玩家挂机的机器失效)
animals: 15
monsters: 24
与entity-tracking-range(限制玩家在多少距离内才能看到实体)
animals: 18
monsters: 24
7.Chunk Provider tick
(区块)
1.使用插件NoSpawnChunks
2.在server.properties中设置view-distance(视野距离)为3~5
3.在paper.yml中,降低这些数值到

max-chunk-gens-per-tick: 3(每tick新生成的区块数)
  max-auto-save-chunks-per-tick: 10(每tick保存的区块数)
max-chunk-sends-per-tick: 35(每tick发送给玩家的区块数)
4.减少服务器内的漏斗数,或漏斗尽量不要放在区块的边缘(因为漏斗会把它指向的区块也给加载,这样会增加区块数量

8.Connection Handler&
   Minecraft::Packet
前者是玩家与服务器交互的事件(子事件有玩家移动,破坏,放置等),
除非是升级服务器配置或减少玩家,几乎无法减少这一项的占用
后者主要是插件和玩家进行数据包交换的占用,如果占用高请检查插件
Mod/插件类(持续更新)
事件名称优化方法
1.TileSpecialFlower
(植物魔法Mod的花)
1.集中花的产能区
2.Task:RTP
(BetterRTP插件的瞬间传送)
1.降低server.propertiles中view-distance的数值
2.设置随机传送使用间隔
3.ProtectListener:OnInvMove
(Quickshop插件)
关闭Quickshop悬浮物品的功能
4.TPAPro(TPA插件的瞬间传送)降低server.propertiles中view-distance的数值
5.ResidenceXXXXXListener
(领地插件监听事件)
暂时无解,领地插件过于臃肿,如果占用严重可以使用其他轻量化量化插件
6.RandomTeleport(随机传送插件)1.降低server.propertiles中view-distance的数值
2.设置随机传送使用间隔
7.MCMMO配置文件中将
Ability_Activation: true
Ability_Deactivation: true
都改为false(禁止技能触发和结束出现烟花特效)

8.任何方块实体导致的卡服1.在Spigot.yml内找到max-tick-time
将tile设置为10~30
2.如果为sponge服务器,参照2楼置顶
... ...


- 后记 -
Epilogue —— Express Thanks

引用链接:
让喵来分析MOD服卡顿原因,手把手教你优化TPS!
BoneStudio —— 插件服 从负基础萌新到大触 |入门|进阶|优化| & [机翻教程]
Villager Optimiser —— 优化1.14.2以上的村民寻路以减少卡顿 [1.14.2-1.15]
LagAssist —— 不可直视的九合一优化插件[1.8-1.14]
https://www.mcbbs.net/thread-881861-1-1.html
LaggRemoverPlus —— 优化清理 | 智能延迟清理系统 [全版本]
NoSpawnChunks —— 老牌的服务器优化插件,给你区块来次降温吧
冥想了一夜的服务器启动参数




[groupid=1701]Complex Studio[/groupid]