前言
当我们在做线上压测时,有个问题就是很多工具在线上不方便用,如jprofiler,因为线上环境比较谨慎,也不太方面加一堆配置参数。那么这里我们推荐使用Arthas这个工具
Arthas工具介绍
Arthas是阿里巴巴开源的性能分析神器。Arthas能为你做什么事情呢?我们来看一下官网的介绍。官网地址:
https://alibaba.github.io/arthas/index.html
.
当你遇到一下类似的问题而束手无策的时候,Arthas可以帮你解决:
- 这个类从哪个jar包加载的?为什么会报各种各类相关的Exception?
- 我改的代码为什么没有执行到?难道我没有commit?分支搞错了?
- 遇到问题无法线上debug,难道只能通过添加日志在重新发布吗?
- 线上遇到某个用户的数据有问题,但是线上同样无法debug,线下无法重现!
- 是否有一个全局视角来查看系统运行状况?
- 有什么办法可以监控到JVM的实施运行状态?
Arthas 支持JDK6+,支持Linux、Windows、Mac,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和分析。
下载1. 这个类从哪个jar包加载的?为什么会报各种各类相关的Exception?
2. 我改的代码为什么没有执行到?难道我没有commit?分支搞错了?
3. 遇到问题无法线上debug,难道只能通过添加日志在重新发布吗?
4. 线上遇到某个用户的数据有问题,但是线上同样无法debug,线下无法重现!
5. 是否有一个全局视角来查看系统运行状况?
6. 有什么办法可以监控到JVM的实施运行状态?
Arthas 支持JDK6+,支持Linux、Windows、Mac,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和分析。
下载Arthas
可以直接在 Linux 上通过命令下载
wget https://alibaba.github.io/arthas/arthas-boot.jar
或者也可以再浏览器直接下载jar包,等待下载成功后,上传到 Linux 服务器上。
https://alibaba.github.io/arthas/arthas-boot.jar
启动 arthas 工具
主要使用arthas需要安装jdk环境。
安装成功之后,执行如下命令启动 arthas
java -jar arthas-boot.jar
执行成功后,arthas 提供了一种命令行方式的交互方式,arthas 会检测当前服务器上的
Java 进程,并将进程列表展示出来,用户输入对应的编号(1、2、3、4…)进行选择,然
后回车(见红色框,进程[2]就是 tomcat 进程)。
第一次使用arthas需要自动下载一些依赖包,等待下载完成,就会进入到arthas提供的命令行界面。
整体dashboard数据
在arthas的命令行界面,输入
dashboard
现在我们可以看到一个实时的监控界面。我们可以在第一栏看到线程的状态、优先级以及占用哪个线程占用的cpu比较高。
那么我们可以通过这个图标看到有没有线程当前处于阻塞、或者TIME_WATING。有时候出现cpu比较高的场景,我们可以通过这里看到具体是哪一个线程占用的cpu比较高。我们找到这个线程,就可以通过
jstat
查看到该进程当前所在做的事情。
但是大家这里需要注意的是,这里的cpu并不是占用了我们操作系统多少cpu使用率,这里指的是我们这个进程占了多少cpu,其中某一个线程占了该进程的百分之多少。
第二个区域展示的内存,我们可以看到堆内存总共使用了多少、一共有多少内存、最大内存是多少,以及内存占用的百分比情况。
所以这个dashboard可以帮我们检测线程和内存的总体使用情况。
查看线程监控
我们前面 dashboard 只是看了线程的大体情况,如果说我们想要看线程的具体情况,应该怎么看呢?
Arthas 提供了如下参数,可以看到线程的具体信息。
常用参数:
输入thread会显示所有线程的状态信息
输入thread -n 3会显示当前最忙的3个线程,可以用来排查线程CPU消耗
输入thread -b 会显示当前处于BLOCKED状态的线程,可以排查线程锁的问题
thread
thread -n 3
这个命令可以把占用cpu消耗最高的线程的堆栈信息打印出来,可以用来排查线程CPU消耗
thread -b
这个命令可以抓到当前处于BLOCKED状态的线程,可以排查线程锁的问题 ,因为目前我没有阻塞的线程,所有没有。
jvm监控
输入jvm,查看jvm详细的性能数据
函数耗时监控
通常说一个接口性能不好,其实就是接口响应时间比较长造成的,具体代码中哪个函数耗时比较长呢?可以使用trace功能来监控一下
trace 类名 函数
这个命令可以看到压测具体那一个函数耗时时间最长,接下来我们就可以去对代码进行进一步分析,然后再进行优化。