目录
Arthas(阿尔萨斯) 能为你做什么?
安装和卸载
安装
使用arthas-boot(推荐)
使用as.sh
之前写过一篇文章,是如何通过日志实现业务bug定位到文章,最近发现arthas能够很方便的实现问题的定位,同时还有很多其他的功能,今天我花费了一些时间,将最近学习和使用arthas的心得和学习过程总结了一下,要想看完整的Arthas介绍,可见官网https://arthas.aliyun.com/doc/
嗯中午的文档灰常方便。
Arthas
是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
怎样直接从JVM内查找某个类的实例?
Arthas
支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
哇这么多的功能呢,简直是猿人们的福利神器。(去你妈的破规定,测试环境不让打断点劳资不用了)
安装arthas的方法有很多,文档提供了好几种安装的方法,例如快速安装、全量安装、手动安装、通过rpm/deb来安装、通过Cloud Toolkit插件使用Arthas等方法
我用的是阿里云centos7服务安装的arthas,这使用的是最简单的安装方法
快速安装
arthas-boot
(推荐)下载arthas-boot.jar
,然后用java -jar
的方式启动:
curl -O https://arthas.aliyun.com/arthas-boot.jar |
|
java -jar arthas-boot.jar |
启动过程报错了
arthas报错:Can not find java process. Try to pass in command line
按官方的说明文档描述,假如出现了找不到pid的情况,在当前目录下应该会输出相关的log,但是在pod中当前目录下并没有日志文件产生啊???问题跟下面参考链接中的问题基本类似;
按照有的博主的说法,如果使用openjdk,也会报这个问题,因为其没有jps,arthas是用jps去找java进程的,使用oracle jdk即可;巧的是,我使用的就是openjdk。。。
运行arthas的时候报错,找不到Java进程,但是通过 ps -ef | grep java
发现:
有很多Java进程,然后通过Jps命令去列出Java进程的时候:
的确没有找到
后来查询才知道
确实找不到Java进程,这是为什么?后来通过查询资料才知道,Linux系统下java进程启动的时候,会在/tmp/hsperfdata_root/
目录下创建一个以Java进程id命名的文件,并在其中记录jvm等相关信息,运行Jps命令的时候,会访问该目录下的文件,从而输出Java进程,于是就到/tmp/hsperfdata_root/
这个目录下查看了一下:
果然没有任何文件,这也就解释了为什么运行arthas会报Can not find java process,也解释了为什么Jps找不到Java进程的原因。于是基于这个发现查询为什么在Centos7下启动Java进程不向/tmp/hsperfdata_root/
写入进程信息。查到的原因是Jboss是通过建立service启动的,而在Centos7下是通过systemctl启动service的,并在/usr/lib/systemd/system新建一个脚本:
[Unit]
Description=jbossapi
[Service]
Type=forking
PIDFile=/run/jboss-as/jboss-as-domain.pid
EnvironmentFile=-/etc/jboss-as/jboss-as-domain.conf
ExecStart=/jboss-eap-6.4/bin/init.d/jboss-as-domain.sh start
ExecReload=/jboss-eap-6.4/bin/init.d/jboss-as-domain.sh restart
ExecStop=/jboss-eap-6.4/bin/init.d/jboss-as-domain.sh stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
而其中的privateTmp这个属性正是原因所在,在centos7下面/tmp这个目录权限是777,任何人都可以查看,centos7认为这样不安全,容易泄露信息,于是官方启动脚本里就有PrivateTmp=true这么一句,这样一来Jboss启动后,就不会把相关信息写入/tmp目录里,也就造成jps无法看到java进程了。将该句从脚本中去除,并重启service既可以通过jps查看Java进程了。
我是在服务端起的了一个java项目,再重新启动就好用了。
但是这里启动失败了,这是因为arthas在启动时会检测本机运行的jvm进程,然后让用户选择需要绑定的进程,后面的操作都是针对选定的进程的。
打印帮助信息:
java -jar arthas-boot.jar -h
如果下载速度比较慢,可以使用aliyun的镜像:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
as.sh
Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 回车
执行即可:
curl -L https://arthas.aliyun.com/install.sh | sh
上述命令会下载启动脚本文件 as.sh
到当前目录,你可以放在任何地方或将其加入到 $PATH
中。
直接在shell下面执行./as.sh
,就会进入交互界面。
也可以执行./as.sh -h
来获取更多参数信息。
安装完arthas之后,下一步如何使用arthas呢?
这里简单说一下使用方法,详细点方法参考官方文档。
在使用arthas之前,我们可以使用IDEA安装一个插件。
插件也很友好,有中文的使用文档,大家能够方便点通过文档学习使用arthas。
这个除了文档很方便,改插件的使用也是非常的方便,友好。
找到想要的方法,点击右键,找到arthas command 后面,点击相应的命令,就能够获取想要的命令了。
是不是非常的方便
哈哈,下面是具体使用arthas进行watch和trace命令的使用用例。
找到arthas的jar包,通过java -jar的方法实现启动。
等到出现【1】 116/xx/xx.jar的时候
输入1,这时候arthas就会开启线程监控我们想要查看的数据了。
watch命令
trace命令
能够方便的获取到请求的调用链路和每次调用的耗费时间。找到慢调用方法就行了。
好了,今天就先到这,后面慢慢再写。