JVM进程执行过程中的异常诊断工具-Greys

JVM进程执行过程中的异常诊断工具-Greys

一、简介

我们平时在线上或者开发中会遇到各种性能、功能等问题,在运行过程中需要查看方法入参、返回值,或者方法执行的堆栈时间,或者jar冲突时类加载来自那个jar包等问题。我们在开发过程中,可能会打印log日志、手动去打印入参、返回值等,或者自己实现简单的profile方法,代码侵入性大且效率较低;另外我们可以使用类似btrace工具去跟踪,这需要自己去实现btrace脚本,服务端需要启动agent,也有点小麻烦。后来淘宝聚石用scala写了个houseMD,但只支持到jdk1.6,后续也没有更新了;后面又有淘宝同学借鉴了btrace和houseMD,写了Greys,方便定位常见的java问题,下面简单介绍其使用方法。

下载地址:http://ompc.oss.aliyuncs.com/greys/release/greys-1.7.6.4-bin.zip

二、安装

a. 解压greys-1.7.6.4-bin.zip,目录结构如下

-rwxr-xr-x. 1 admin admin    1047 117 11:54 ga.sh
-rw-r--r--. 1 admin admin   10595 117 11:54 greys-agent.jar
-rw-r--r--. 1 admin admin 3472230 117 11:54 greys-core.jar
-rwxr-xr-x. 1 admin admin    7972 117 11:54 greys.sh
-rwxr-xr-x. 1 admin admin    2927 117 11:54 gs.sh
-rwxr-xr-x. 1 admin admin     683 117 11:54 install-local.sh

b. 安装

cd greys
sh ./install-local.sh
三、待监控应用启动agent

pid为应用进程号

./ga.sh pid
三、应用监控控制客户端

pid 为应用进程号, ip为应用所在机器, 3658为agent默认端口号

./greys.sh pid@ip:3658

或者远程访问

./gs.sh ip
四、Greys命令详解
命令说明
help查看命令的帮助文档,每个命令和参数都有很详细的说明
sc查看JVM已加载的类信息
sm查看已加载的方法信息
monitor方法执行监控
trace渲染方法内部调用路径,并输出方法路径上的每个节点上耗时
ptrace强化版的trace命令。通过指定渲染路径,并可记录下路径中所有方法的入参、返值;与tt命令联动
watch方法执行数据观测
tt方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
stack输出当前方法被调用的调用路径
js支持使用JavaScript脚本;支持CommonJS部分规范模块化(BMD规范)
version输出当前目标Java进程所加载的Greys版本号
quit退出greys客户端
shutdown关闭greys服务端
rest重置增强类,将被greys增强过的类全部还原
session查看当前会话
jvm查看当前JVM的信息

示列:

tt -t -n 100 *UserServiceImpl queryById
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|    INDEX | PROCESS-ID |            TIMESTAMP |   COST(ms) |   IS-RET |   IS-EXP |          OBJECT |                          CLASS |                         METHOD |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1001 |       1001 |  2017-03-08 15:39:11 |         10 |     true |    false |      0x7204ebf1 |    UserServiceImpl |          queryById |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1002 |       1002 |  2017-03-08 15:39:12 |          6 |     true |    false |      0x7204ebf1 |    UserServiceImpl |          queryById |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1003 |       1003 |  2017-03-08 15:39:12 |          5 |     true |    false |      0x7204ebf1 |    UserServiceImpl |          queryById |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1004 |       1004 |  2017-03-08 15:39:13 |          6 |     true |    false |      0x7204ebf1 |    UserServiceImpl |          queryById |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1005 |       1005 |  2017-03-08 15:39:48 |          6 |     true |    false |      0x7204ebf1 |    UserServiceImpl |          queryById |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1006 |       1006 |  2017-03-08 15:39:48 |          5 |     true |    false |      0x7204ebf1 |    UserServiceImpl |          queryById |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1007 |       1007 |  2017-03-08 15:39:49 |          4 |     true |    false |      0x7204ebf1 |    UserServiceImpl |          queryById |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1008 |       1008 |  2017-03-08 15:39:49 |          5 |     true |    false |      0x7204ebf1 |    UserServiceImpl |          queryById |

具体使用详见:https://github.com/oldmanpushcart/greys-anatomy/wiki/greys-pdf

诞生 很早的时候,我们使用BTrace排查问题,在感叹BTrace的强大之余,也曾好几次将线上系统折腾挂掉。2012年淘宝的聚石写了HouseMD,将 常用的几个Btrace脚本整合在一起形成一个独立风格的应用,但其核心代码用的是Scala,我们没这方面的编程维护经验,所以只好艳羡HouseMD 的才思敏捷而无法在其上增加功能。 于是乎,Greys诞生了。 PS:目前Greys仅支持Linux/Unix/Mac上的Java6 ,Windows暂时无法支持 Greys是一个java进程执行过程异常诊断工具。 在不断程序执行的情况下轻松完成问题排查工作。 和HouseMD一样,Greys-Anatomy取名同名美剧“实习医生格蕾”,目的是向前辈致敬。代码编写的时候参考了BTrace和HouseMD两个前辈的思路。 目标群体 有时候突然一个问题反馈上来,需要入参才能完成定位,但恰恰没有任何日志。回去加上重新部署,一杯咖啡时间过去了,是不是很崩溃? 当你经过反复这样几次折腾之后变得聪明了,在自己的代码的所有入参和出参地方都加上debug日志,但这次问题似乎暴露在别人的代码了...是不是很无奈? 突然遇到线上一个性能问题无法确定到底是哪个环节的耗时,只能反复抓jstack猜,还有没有办法可以好好的过日子啦? 遇到以上问题时,你就是我们这类工具的目标客户,此类工具能利用Java6的Instrumentation特性,动态增强你所指定的类,获取你想要到的信息。 我们的座右铭 让程序解决繁琐的事情 特性功能 交互方式 命令行交互 内置功能 查看加载类,方法信息 方法执行监控(调用量,成功失败率,响应时间) 方法执行数据观测(参数,返回结果,异常信息等) 方法执行数据记录 性能开销渲染 方法执行数据自定义观测(js脚本) 查看方法调用堆栈 软件特点 纯Java实现的开源项目 安装使用便捷,仅一个jar包 可无需重启JVM进行CT式诊断 Groovy表达式展开变量,方便你查看入参、出参、异常、当前对象的各种属性细节 常用分析命令集成,monitor、trace等 观察变量的出入参 时间隧道,tt命令能以时间维度纪录下监控期内的每一次调用环境 多人并行协作 基于C/S架构的任务模式甚至能让多人同时远程到同一进程执行不同的指令、脚本,非常适合团队一起进行线上问题排查与跟踪。Greys采用纯Java编写并留有良好的扩展,如果你有需求,只要你会Java,就可以为你自己编写想要的功能。 Greys最有利的武器是他的ONGL表达式,能让你在感受到HouseMD集成功能便利的同时,也能发挥出自定义Btrace脚本的灵活。 应用管理员拥有JVM进程权限,由他来首先在目标JVM上启动Greys 技术专家A和B平时没有对应机器的权限,但只要网络能访问,他们可以通过指定ip:port直接访问目标机器的JVM进程,仿佛在本地一般 标签:greys
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值