本文介绍如何使用服务端内置的timings来检测服务端性能.
注: 本文使用的服务端是spigot
,版本为1.11.2
一. timings介绍
timings主要用来检测各插件在事件处理
(Event handling)上花费的时间.
首先介绍一下tick
,它相当于游戏循环
(game loop),
正常情况下服务端1秒执行20次tick,即每50毫秒执行1次tick.
每次执行tick都有好多事要做,像实体运动,区块加载,玩家与方块交互等,一些会产生事件,而事件会被插件同步处理.
如果服务端1秒钟执行完20次tick,那TPS(tick per second)
(翻译过来就是tick每秒)就是20,
如果在执行某次tick时,因为某个插件的关系,执行得很慢,比如花费了100毫秒,那么这1秒钟就只能执行19次tick了,也就是说TPS只有19,
因此TPS的范围在0到20之间,值越大表示服务器越流畅.
什么时候开启timings?
一般在服务器卡顿的时候适合开启timings检测
如何开启timings?
在控制后台输入timings on
即可开启
检测耗时需要多久?
一般至少1分钟
如何查看检测结果
在控制后台输入timings paste
,等待几秒钟,服务端收集与上传完后,会显示类似[21:22:05 INFO]: Timings results can be viewed at https://www.spigotmc.org/go/timings?url=riwifakoco
的提示,把提示中的链接复制到浏览器地址栏,打开网页即可看到结果.
关于bukkit.yml里的plugin-profiling
根据bukkit.yml的官方文档的介绍,此值设置成true时允许使用命令/timings
但新版本的spigot做了优化,即使此值设置成false,也可以手动输入指令开启timings, 而此值设置成true时,服务端启动后会自动开启timings浪费服务器资源, 因此spigot官方推荐设置此值为false.
二. timings结果说明
1. 报告顶部
报告顶部显示总的信息,包括:
Total
: 处理事件的总时间Sample Time
: 此次检测花费的时间Average Entities
: (平均)活跃的实体数/总实体数Average Players
: (平均)玩家数Average TPS
: (平均)TPS
2. 每块区域顶部
每块区域的顶部包含几个信息,包括:
Total
: 此插件处理事件的总时间Pct
: 耗时百分比(=Total/Sample Time)
3. 每块区域主体
每块区域主体包含一些列,包括:
Pct Total
: 同上,百分比(=Total/Sample Time)Pct Tick
: 百分比(=Avg/50)Total
: 类似上面的,是执行花费的总时间Avg
: (平均)每tick花费的时间(=Total/Count)Count
: 执行次数Event
: 事件名(也不一定全是事件,计时器什么的也都算)
三. timings结果如何看?
Pct Total
影响服务端总体TPS
(如果某项值比较高,说明可能是它导致服务器缓慢)Pct Tick
指示服务端顿卡的现象(如果某项值比较高,说明服务器顿卡可能是它引起的)
举个例子,在某一tick进行世界保存,花费了0.8秒(正常1tick才50毫秒),因此游戏中的玩家会感觉顿卡,timings显示世界保存的Pct Tick
列值非常高
再举个例子,某个经济插件需要访问外部的数据库,因此执行较为缓慢,而游戏中改变玩家金钱的情况非常多,导致经济插件的Pct Total
列值非常高,整个服务器TPS下降,玩家感觉游戏变得不流畅
四. 部分事件介绍
以下主要来自官方文档的翻译.
Plugin Scheduler
指由插件处理的单个或重复的同步
计时器任务
Full Server Tick
此项可以看做服务器性能的代表,如果此项的Pct Tick列的值比较高,服务器就可能损失TPS. 此项没什么办法提高,你只能从其它地方来提高性能.
Activated Entities
活跃的实体
是一个影响性能很重要的因素,spigot.yml的世界配置里有个entity-activation-range
项,当实体与玩家的距离超过配置的范围时,实体就会变成不活跃
的状态,而此状态的实体会减少95%
的性能花费!如果服务器实体很多,那么此项对性能的影响会很大.
(官方提示: misc
活跃范围减少到4可以防止大量掉落的物体卡顿,animals
活跃范围减少到12可以减少动物养殖场导致的性能问题,monsters
减少到24不会对游戏体验造成太大影响,但会提高性能)
Connection Handler或Player Tick
如果此值比较高,并不能说明问题出在此项上,可能是其它插件问题(因为其它事件也可能被计算到此项内),但也可能是你服务器玩家过多超过了服务器的承受能力.
推荐spigot.yml配置里的player-shuffle
值为0,否则此项会造成更多的性能消耗.