应用诊断是诊断Java领域线上问题的利器,利用字节码增强技术,可以在不重启JVM进程的情况下,查看程序的运行情况。包括控制面板、线程列表、方法诊断和性能分析。功能特性如下所示。
- 减少运维人员学习技术成本,增加线上诊断易用性。
- 避免线上问题现场日志记录缺失,反复的添加日志再部署。
- 避免线上问题出现,线下无法复现,难以定位调试。
前提条件
目标服务运行环境要求JDK1.8及以上版本(openjdk:8的alpine版本也不支持)
不需要将服务接入网格,此功能毫不依赖服务网格
1、诊断分析
通过该功能模块,用户可获取目标服务的运行情况。
开启/关闭诊断分析,操作步骤如下:
- 进入[性能监控/应用诊断/诊断分析]页面
- 选择要开启诊断的[服务/容器组/容器/进程],单击<开始>按钮,系统开始进入应用诊断。
控制面板
总览系统实时数据,包括:线程Top-10,JVM信息,操作系统信息,变量信息
- 线程Top-10:统计CPU使用率排名前10的线程的相关信息,包括:线程ID、螺纹名称、线程分组、优先级、线程状态、CPU百分比、线程运行总CPU时间、线程是否中断、是否为守护线程、线程堆栈,线程堆栈等信息。
- JVM内存:统计并展示JVM相关信息,包括:内存类型(堆、非堆等)、已经使用的内存、总内存、最大内存、内存使用率;GC类型(GC次数、GC耗时等)、统计数据,用户可查看JVM统计详情,包括运行信息、类加载、编译信息、GC、内存管理、内存使用、操作系统、线程统计、文件描述等;详情页面如下图所示。此外系统提供查看历史JVM内存的功能。
- 操作系统信息:用户可查看操作系统名称、操作系统版本等信息。
- 系统变量信息:当前服务涉及的系统变量信息。
- 环境变量信息:用户当前服务的环境变量信息。
线程列表
根据CPU采样时长统计系统当前所有线程。统计信息有:线程ID、螺纹名称、线程分组、优先级、线程状态、CPU百分比、线程运行总CPU时间、线程是否中断、是否为守护线程、线程堆栈、线程堆栈详情等信息。
方法诊断
观测指定方法的调用情况,包括:返回值,抛出异常,入参,方法内部调用路径,并输出方法路径上的每个节点上耗时,追溯当前方法被调用的路径。
类名:服务对应的类名,例如:包为com.t7d.user,类为UserService,全类名为com.t7d.user.UserService。
方法名:方法名及参数:方法是代表功能的模块,传递给方法的参数,填写参数对应方法中参数的全类名,且必须和方法的参数顺序一致,并以英文逗号分隔,例如:方法为public int login(int id, String name),则方法名及参数为login(int.class,java.lang.String)。
诊断次数:配置抓取调用的次数,达到配置次数系统会自动结束诊断命令。
超时时间:配置抓取到调用结果的超时时间,超过配置时间系统自动结束观测命令。
耗时:配置系统抓取大于多少耗时的调用。
仅异常:选择是否抓取抛出异常的方法。
OGNL表达式:对象图导航语言(Object Graphic Navigation Language),用户可根据业务需要配置OGNL表达式来筛选关注的代码。
钻入:在诊断结果方法内调用栈中点击钻入操作,可进一步对方法进行诊断
查看源码:用户可在诊断详情页面反编译的源码。
热更新:用户可通过上传编译后的class文件,动态更新代码,从而快速解决线上bug。
性能分析
包括火焰图分析和堆快照分析
- 新建火焰图:通过不断的采样,然后把收集到的采样结果生成应用热点火焰图。用户可查看页面上“如何读懂火焰图”获取火焰图的解读方式。
- 火焰图类型支持:CPU耗时、内存分配、锁耗时、itimer;文件格式支持:svg,html;配置火焰图的采样时长。
- 转存储堆快照:生成文件包括:对象信息、类信息、GC的根对象、线程栈及局部变量,借助性能分析工具定位问题(例:MAT),用户可联系平台管理员复制下载命令,手动将文件从容器内下载到服务器临时目录。
- 关闭诊断:关闭诊断后,系统将停止所选容器组进程的所有诊断。
提醒
TIPS:如果你需要的arthas功能超出了我们支持的范围,可以登录容器终端,使用arthas命令行,方法如下:
shell
java -jar /tmp/arthas/arthas-boot.jar
然后按提示键入你要诊断的java程序的进程id
其效果是连接了你前面通过页面开启的诊断,而不是新建哦~
arthas命令行使用方法请参考官方手册。
2、诊断管理
诊断管理列表管理已开启诊断的容器组(Pod),页面及详细说明如下:
- 进入[性能监控/应用诊断/诊断管理]页面,找到要查看的容器组,单击<查看>按钮,进入应用诊断查看页面
- 关闭应用诊断,找到要关闭诊断的容器组,单击<关闭>按钮,进入应用诊断关闭确认页面,确认关闭后,单击<确定>按钮,应用诊断关闭操作完成。
提醒
- 诊断用完后一定要及时手工<关闭>,否则可能影响业务!