xiaobaoqiu Blog

Think More, Code Less

在线诊断工具

Java诊断我相信再日常开发中都十分需要.相信大家都使用过以下几种诊断方式:

1.肉眼诊断
就是出现问题时候企图通过肉眼来发现代码问题.通常很明显的问题有效;
2.日志诊断
通过给出问题的代码入参或者上下游加上日志,或者出问题的时候加上日志来诊断;这种方式的问题就是出现问题你需要重新拉分支,加日志,本地测试再上限这一系列流程.另外一个问题是过多的日志会影响应用性能;
3.监控诊断
通过完善的监控,通常包括完善且精确的异常划分.对不同的异常情况有独立的监控.加上完善的报警机制.这是最理想的情况.其优势是能快速定位问题点,问题是建立这一套完善的机制需要很长时间.并且监控只能发现问题类型,比如监控发现是数据错误,但是到底那条数据错误还是需要日志等手段来定位.
4.在线诊断工具
在不需要重新发布的情况下,在线诊断应用的问题所在.通常还可以用于定位接口瓶颈等问题;

这里简单介绍一下最近找到的几个在线诊断工具.它们都是非侵入式的,即不需要修改原始应用的代码再重新发布上线这个过程.

常用包括几个诊断工具包括,这里做一个简单的介绍:

1.BTrace
2.HouseMD
3.Greys-Anatomy

参考: http://www.infoq.com/cn/articles/java-profiling-with-open-source/

. 1.BTrace

Btrace(bytecode trace)是Kenai在2009年开发的一个开源项目(https://kenai.com/projects/btrace/),是一个动态跟踪分析JAVA源代码的工具。 它可以用来帮我们做运行时的JAVA程序分析,追踪,监控等.

官网: https://kenai.com/projects/btrace/

用户手册: https://kenai.com/projects/btrace/pages/UserGuide

samples下有很多使用例子.参考网上的一个例子: http://mgoann.iteye.com/blog/1409685

参考: http://wiki.corp.qunar.com/pages/viewpage.action?pageId=56198121

1.1使用场景:

1.数据采样 比如我们要优化某块代码,就可以先写一个btrace脚本,丢到线上服务器上跑一段时间; 这样可以收集到最真实的数据,而且不用发布之类的; 然后根据收集到的数据,做有目的的优化,优化之后,还可以对比出优化的效果。 2.排查问题 3.性能监控

1.2优点

1.跟踪任何java代码的调用(包括第三方类库中的,甚至jdk中的),比如统计某方法的调用次数,耗时。 2.可以监控的维度有很多,比如异常,同步块,内存申请,数组声明,甚至可以精确到行 3.完全不侵入业务代码,不需要重启服务 4.安全,对于应用内的数据来说是只读的。

1.3缺点

  1. 有较多的使用限制,如只能调用用BtraceUtils中的方法、不能写实例变量; (见docs/usersguide.html中的BTrace Restrictions条目) 所以刚编写脚本的时候,可能会有各种不习惯,但其实大多会用到的方法,BtraceUtils里都有封装 (其实个人感觉这个不算缺点,只是这个工具定位在追踪和监控,所以出于安全考虑,做了这个限制)
  2. 监控基本上只能单点,集群环境没法玩
  3. 被监控的服务重启,btrace也需要跟着重启 4.有影响原始应用的风险,严重可能导致JVM Crash.

1.4使用方式

  • Boot方式启动 追踪已启动的jvm进程 命令:btrace/bin/btrace 12345 SomeScript.java 注意,下载下来后bin下的文件都不可执行,需要chmod u+x,并且需要和目标进程是同一个用户来启动

  • Agent方式启动 与目标jvm同时启动 配置jvm参数:-javaagent:btrace-agent.jar=script=SqlMapTracer.class 注意:agent方式启动只能使用编译过的脚本 使用btrace/bin/btracec SqlMapTracer.java 编译 agent方式启动的btrace的标准输出位于你的SqlMapTracer.class所在目录下的SqlMapTracer.class.btrace文件

boot方式灵活,但是当要求追踪结果精确时,就不太好用了。因为不知道btrace启动之前,目标进程已经执行了多少代码。agent方式是和目标进程同时启动的,可以保证结果精确。

1.5原理

主要就是使用ASM来实现对类的修改,再使用Instumentation实现类的内存替换.

btrace原理: http://victorzhzh.iteye.com/blog/965789

btrace源码分析: http://agapple.iteye.com/blog/1005918

. 2.HouseMD

高负载服务器端Java程序 诊断工具的特性要求有:

1.命令行接口, 能够方便在服务器环境中运行;
2.支持常用诊断调式手段, 能够在其中快速来回切换;
3.容易定位跟踪目标, 且不易出错;
4.弱侵入, 目标Java程序无需任何修改, 不用重新部署或重启;
5.有效控制给目标进程带来的资源消耗;
6.不遗留任何"代码垃圾"等后遗症.

使用手册: https://github.com/CSUG/HouseMD/wiki/UserGuideCN

. 2.1安装

首先安装jenv:

1
2
3
4
5
6
xiaobaoqiu@xiaobaoqiu:~/Tools/HouseMD$ curl -L -s get.jenv.io | bash
...
xiaobaoqiu@xiaobaoqiu:~/Tools/HouseMD$ source /home/xiaobaoqiu/.jenv/bin/jenv-init.sh
...
xiaobaoqiu@xiaobaoqiu:~/Tools/HouseMD$ jenv help
...

再安装HouseMD就很简单:

1
2
3
4
5
6
xiaobaoqiu@xiaobaoqiu:~/Tools/HouseMD$ jenv install housemd
Installing: housemd 0.2.7
Parsing http://jenv.mvnsearch.org/candidate/housemd/download/0.2.7/Linux/x86_64

Downloading: housemd 0.2.7
...

. 3.Greys-Anatomy

Greys是一个java进程执行过程中的异常诊断工具。 在不中断程序执行的情况下轻松完成问题排查工作.

源码: https://github.com/oldmanpushcart/greys-anatomy

使用范例: https://github.com/oldmanpushcart/greys-anatomy/wiki/Getting-Start

交互方式: 命令行交互

功能:

1.查看加载类,方法信息
2.方法执行监控(调用量,成功失败率,响应时间)
3.方法执行数据观测(参数,返回结果,异常信息等)
4.方法执行数据记录
5.性能开销渲染
6.方法执行数据自定义观测(js脚本)
7.查看方法调用堆栈