真香------Arthas使用

目录

Arthas(阿尔萨斯) 能为你做什么?

安装和卸载

安装

使用arthas-boot(推荐)

使用as.sh


之前写过一篇文章,是如何通过日志实现业务bug定位到文章,最近发现arthas能够很方便的实现问题的定位,同时还有很多其他的功能,今天我花费了一些时间,将最近学习和使用arthas的心得和学习过程总结了一下,要想看完整的Arthas介绍,可见官网https://arthas.aliyun.com/doc/

嗯中午的文档灰常方便。


Arthas(阿尔萨斯) 能为你做什么?

_images/arthas.png

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

  5. 是否有一个全局视角来查看系统的运行状况?

  6. 有什么办法可以监控到JVM的实时运行状态?

  7. 怎么快速定位应用的热点,生成火焰图?

  8. 怎样直接从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命令

 能够方便的获取到请求的调用链路和每次调用的耗费时间。找到慢调用方法就行了。

好了,今天就先到这,后面慢慢再写。

猜你喜欢

转载自blog.csdn.net/qq_29235677/article/details/119866014