当处理海量数据的时候,很容易出现各种异常和性能瓶颈,这时常常需要分析程序运行行为和性能瓶颈以优化系统性能。这里简单介绍了三种强大的分析诊断工具以帮助大家更快更好的完成优化工作。
1.Arthas
Arthas是 阿里巴巴开源的一款 Java 线上诊断工具,利用Arthas可以对指定的JVM进程进行CPU、内存、线程、死锁监控处理,同时也可以动态的获取JVM中的源代码结构。得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。当你遇到以下类似问题而束手无策时,Arthas都可以帮助你解决:
(1)这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
(2)我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
(3)遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
(4)线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
(5)是否有一个全局视角来查看系统的运行状况?
(6)有什么办法可以监控到 JVM 的实时运行状态?
Arthas常用命令如下表所示:
命令 介绍
dashboard 当前系统的实时数据面板
thread 查看当前 JVM 的线程堆栈信息
watch 方法执行数据观测
trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
stack 输出当前方法被调用的调用路径
tt 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
monitor 方法执行监控
jvm 查看当前 JVM 信息
vmoption 查看,更新 JVM 诊断相关的参数
sc 查看 JVM 已加载的类信息
sm 查看已加载类的方法信息
jad 反编译指定已加载类的源码
classloader 查看 classloader 的继承树,urls,类加载信息
heapdump 类似 jmap 命令的 heap dump 功能
Arthas官网:https://arthas.aliyun.com/
2.Memory Analyzer Tool
MAT(Memory Analyzer Tool)工具是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减少内存占用。使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、对象GC Roots的相关信息等,便于分析内存泄露以及查找内存消耗情况等。
图1:MAT使用效果图
MAT官网:https://www.eclipse.org/mat/
3.JVM Profiler
JVM Profiler使uber开源的一款分布式追踪工具,由三项主要功能组成, 它使收集性能和资源使用率指标变得更容易, 然后可以将这些指标提供给其他系统进行进一步分析:
(1)代理功能 ( java agent ) : 支持用户以分布式的方式收集各种指标 (例如如 CPU/内存利用率) ,用于 JVM 进程的堆栈跟踪。
(2)高级分析功能(Advanced profiling capabilities): 支持跟踪任意 Java 方法和用户代码中的参数, 而不进行任何实际的代码更改。
(3)数据分析报告( Data analytics reporting ): 使用 JVM Profile 可以将指标数据推送给 Kafka topics 和 Apache Hive tables , 提高数据分析的速度和灵活性。
JVM Profiler典型的应用场景是用于生成火焰图,即通过各种 agent 在程序运行时采样并输出日志,使用 FlameGraph 工具把日志提取出来输出可在浏览器交互式查看的 SVG图片。通过火焰图,研发人员就可以轻松针对热点瓶颈进行分析和性能优化,进而突破性能瓶颈,大幅提升系统的吞吐量。
图2:火焰图效果
JVM Profiler官网:https://github.com/uber-common/jvm-profiler