本帖最后由 GiNYAi 于 2020-2-19 18:39 编辑


Spark是一个基于sk89q的WarmRoast profiler的分析插件.


Bukkit/Sponge/BungeeCord/Velocity应该使用spark.jar,而纯Forge/Fabric应该使用spark-forge.jar/spark-fabric.jar



它能做什么?

spark由若干个部分组成,接下来会分别介绍每个部分。

CPU侧写(进程分析)内存检查(堆分析与GC监视)服务器健康报告

  • CPU侧写(进程分析)
    这是spark最主要的部分,一个基于WarmRoast的轻量的CPU分析与Web视图.
    采样器记录每个行为消耗运算时间的统计数据,这些统计数据可以用来分析出服务器的某个部分,或者某个插件存在的潜在的性能问题.
    数据记录之后,可以在浏览器中显示一个函数调用关系图,来帮助分析.
    一个像spark中所包含这个一样的分析器并,不能"如同魔法般地"修复卡顿--他只是一个帮助分析性能问题原因的工具.
  • Tick监视器(监视服务器tick)
    这个模块可以监视游戏服务器处理"ticks"的速度,它可以观察趋势并且分辨出与其他系统事件(垃圾回收,游戏行为,等)相关的性能问题的本质.
  • 内存检查(堆分析与GC 监视)
    这部分可以生成系统内存使用快照,包含潜在地存在问题的类,其占据空间的大小,与其相关的对象实例数量的信息.
    与其他具有相似功能的分析器不同,它并不大上完整的替代内存分析工具,它指提供一个简单的概览.
    spark同样包含提取完整的Hprof快照的功能,这些快照可以使用传统的内存分析工具分析.
  • 服务器健康报告
    提供关于服务器当前"健康"状态的信息,可以使用游戏内命令查看.输出的信息包含:
        ·服务器TPS(ticks per second 每秒tick的数量)的信息,比/tps命令显示的要准确的多.
        ·服务器进程的CPU占用,以及整个系统的CPU占用.
        ·内存使用
        ·硬盘使用

spark vs WarmRoast
WarmRoast 功能
这些功能来自上游的"WarmRoast"项目.
  • 视图是完全建立在Web上的,不需要任何特殊的软件,只需要一个Web浏览器!
  • 输出是按照方法调用的栈的形式组织,使得输出很容易理解
  • 节点可以展开或者折叠来显示时间信息与更多子节点.
  • 可以一眼看出一个方法占全部CPU使用的比例.
  • 可以看到每个方法占CPU时间在父方法中的百分比
  • 可以调整的取样频率.
  • 对目标程序(服务器)几乎没有任何消耗或副作用


spark 功能
WarmRoast出色的工具,但是他有几个缺陷.
  • 某些人几乎无法使用它, 因为要使用它, 你需要能够直接使用SSH(或者等价的方式)连接你的服务器.(面板服无法使用)
  • 设置与开始比较笨拙 - 首先你需要连接到你要测试的机器上.然后你需要记下你服务器进程的PID,或者在当前运行的VM列表中找出你要测试的服务器(同时运行多个服务器的时候这并不轻松). - 然后让分析器运行一小段时间,再浏览应用为你呈现的网页.
  • 与其他开发者或者管理员分享分析数据并不容易.
  • 你需要在你的服务器上安装JDK.


我尝试在spark中处理这些缺点
  • 分析由游戏内或者控制台命令控制.你并不需要直接访问服务器机器 - 只需要向平常一样安装插件就可以了.
  • 数据会被上传到一个像"pastebin"一样的网站来查看,这样就不需要一个临时的web服务器,你可以简单的把你的分析数据与其他人分享!
  • 它并不需要安装特殊的Java组件或者提供JDK路径


Spark与其他分析工具相比的优点
  • MCP (Mod Coder Pack) 反混淆映射可以通过浏览器直接应用到方法名上
    • 这对于Bukkit映射,和Sponge/Forge (Searge) 映射同样有效
  • 不需要任何特殊的软件来查看输出,只需要一个Web浏览器.

Spark vs 真实采样
Spark(WarmRoast)分析器使用采样技术.一个采样分析器通过定期观察目标程序调用栈来确定特定行为的频率.实践中,采样分析器经常能够提供更清晰的信息,因为他们并不中断目标程序,因此并不会有那么多的副作用.
采样分析器通常数值上不如其他分析方法(例如的性能分析器)精确,但是可以让目标程序几乎满速运行.
结果的数据并不是确切的,但是是统计近似的.输出的准确性会随着采样时间的长度增加, 或者采样更频繁而增加.
Spark vs "Minecraft Timings"
Aikar's timings 系统 (Spigot 与 Sponge 内置) 与 spark/WarmRoast接近, 实际上它同样分析服务器的CPU活动.
Timings通常会比Spark更精确,但是(可以说?!)用途更小,因为每个扫描区域需要人为定义.
例如,Timings可能会发现插件X的某个监听器消耗了大量时间处理PlayerMoveEvent,但是他不会告诉你这个处理中的哪个部分是缓慢的.而spark/WarmRoast则 显示这些信息,指出导致性能问题的方法调用.
安装
只需把文件 spark.jar 放到你的服务器的plugins/mods文件夹下,然后重启服务器.
命令
所有的命令都需要spark权限.
你需要在BungeeCord,Velocity和Forge客户端上使用/sparkb,/sparkv,/sparkc作为替代.


/spark sampler
开启一个新的CPU侧写操作。
参数
  • --info
    • 如果当前有正在运行的侧写,输出其信息.
  • --stop
    • 结束当前正在运行的侧写操作,上传结果数据,并返回视图的链接.
  • --cancel
    • 结束当前正在运行的侧写操作,放弃所有记录的数据,而不会上传.
  • --timeout <timeout>
    • 指定侧写自动停止的时间,单位为秒.
    • 如果未指定,侧写会即刻开始,并且一直运行只到手动停止
  • --thread <thread name>
    • 指定需要侧写的线程的名字d.
    • 如果未指定,将只会侧写主服务器线程"server thread".
    • 你可以使用*来表示希望侧写所有的线程
  • --regex
    • 通过正则表达式来指定需要侧写的线程.
    • Specifies that the set of threads defined should be interpreted as regex patterns.
  • --combine-all
    • 指定 所有线程应当被合成到一个节点中.
  • --not-combined
    • 指定 同一个池中的线程不应当被合成到一个节点中.
  • --interval <interval>
    • 设定采样的间隔,单位为毫秒.
    • 更低的的值会提升结果的准确性,但是可能会导致服务器缓慢.
    • 如果未指定,默认的间隔是10毫秒.
  • --only-ticks-over <tick length millis>
    • 设定只包括一个tick消耗了超过指定时间的数据才会被记录
  • --include-line-numbers
    • 指定 方法调用的行数是应当被记录并且包含在输出中.



/spark tps
输出服务器的tps(ticks per second)的信息.


/spark healthreport
为服务器生成一个健康报告
参数
  • --memory
    • 设定是否包含JVM内存的额外信息



/spark tickmonitoring
开启/关闭 tick监视系统
参数
  • --threshold <percentage increase>
    • 设定报告的阈值,单位是超出平均tick时间的百分比
  • --without-gc
    • 设定 不再显示GC提示



/spark heapsummary
建立一个新的内存(堆)dump 总结,上传结果数据,返回一个视图的链接。
参数
  • --run-gc-before
    • 设定 在记录数据之前,Spark应该建议系统执行一次垃圾回收



/spark heapdump
创建一个新的堆Dump(.hprof 快照)文件,并且保存到硬盘.
参数
  • --run-gc-before
    • 设定 在记录数据之前,Spark应该建议 系统执行一次垃圾回收
  • --include-non-live
    • 设定是否包含 ”已经死亡“ 的对象。(无法被其他对象访问的对象)
  • --xz
    • 使用LZMA2 (.xz)压缩堆Dump。(比Gzip慢,但是有更好的压缩率)
  • --lzma
    • 使用LZMA (.lzma)压缩堆Dump。(比起这个更喜欢使用xz)
  • --gzip
    • 使用gzip (.gz)压缩堆Dump。(比LZMA2快,但是压缩率更差)



/spark activity
Prints information about recent activity performed by the plugin.

License
spark is a fork of WarmRoast, which is licensed under the GNU General Public License.
Therefore, spark is also licensed under the GNU General Public License.
协议
Spark是 WarmRoast 的一个分支,  WarmRoast是licensed under the GNU General Public License.
因此,Spark也是GNU General Public License 协议.

本文翻译自https://github.com/lucko/spark/blob/master/README.md

[groupid=1680]Power of Spongie[/groupid]