关于Arthas如何远程监视Java程序 您所在的位置:网站首页 网络监控模式选择 关于Arthas如何远程监视Java程序

关于Arthas如何远程监视Java程序

2024-04-11 00:55| 来源: 网络整理| 查看: 265

在使用 Arthas 之前,当遇到 Java 线上问题时,如 CPU 飙升、负载突高、内存溢出等问题,你需要查命令,查网络,然后 jps、jstack、jmap、jhat、jstat、hprof 等一通操作。最终焦头烂额,还不一定能查出问题所在。而现在,大多数的常见问题你都可以使用 Arthas 轻松定位,迅速解决,及时止损,准时下班。

但是作为性能测试工作者,我不可能像开发人员一样,满足于Arthas在单机调试和监视方面的使用,我肯定经常需要在测试项目中跨服务器调用,甚至分布式调用。由于网上有关介绍Arthas远程监视的文章比较少(关键有的文章写的太复杂,我也看不明白),所以我自己专门花了一天时间研究了一下,写出以下的使用说明:

1. Arthas 介绍(摘抄)

Arthas 是阿里开源 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,提供 Tab 自动不全,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,本文部分参考了官方文档内容,同时在开源在的 Github 的项目里也有大量的使用案例,也可以进行学习参考。

开源地址:https://github.com/alibaba/arthas 官方文档:https://alibaba.github.io/arthas

2. Arthas 使用场景(摘抄)

得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。

是否有一个全局视角来查看系统的运行状况?为什么 CPU 又升高了,到底是哪里占用了 CPU ?运行的多线程有死锁吗?有阻塞吗?程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?有什么办法可以监控到 JVM 的实时运行状态?3. 使用

前文已经提到,Arthas 是一款命令行交互模式的 Java 诊断工具,由于是 Java 编写,所以可以直接下载相应 的 jar 包运行。

(1)下载

可以在官方 Github 上进行下载,如果速度较慢,可以尝试国内的码云 Gitee 下载。

# github下载 wget https://alibaba.github.io/arthas/arthas-boot.jar # 或者 Gitee 下载 wget https://arthas.gitee.io/arthas-boot.jar(2)运行

Arthas 只是一个 java 程序,所以可以直接用 java -jar 运行。运行时或者运行之后要选择要监测的 Java 进程。

本地访问的运行方式(默认方式,进入本地console访问):

# 运行方式1,先运行,在选择 Java 进程 PID java -jar arthas-boot.jar # 选择要监控的JAVA进程(输入[]内编号1、2(不是PID)回车) [INFO] arthas-boot version: 3.3.3 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. * [1]: 94098 /mnt/zfbb/zfbb-app-1.0-SNAPSHOT.jar [2]: 20766 SpringBlade.jar # 运行方式2,运行时直接指定要监控的 Java 进程 PID java -jar arthas-boot.jar [PID]

远程访问的运行方式(通过URL访问):

# target-ip 要用对外能被访问到的IP java -jar arthas-boot.jar --target-ip 172.16.1.133 # 然后是选择被监控JAVA进程,和本地模式一样,注意端口3658的连接 # arthas-client connect 172.16.1.133 3658

另外如果下载的是完整包(arthas-x.x.x-bin.zip),自带有启动脚本as.sh(windows下是as.bat),启动命令样如如下:

EXAMPLES: ./as.sh ./as.sh --target-ip 0.0.0.0 ./as.sh --telnet-port 9999 --http-port -1 ./as.sh --tunnel-server 'ws://192.168.10.11:7777/ws' ./as.sh --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw ./as.sh --stat-url 'http://192.168.10.11:8080/api/stat' ./as.sh -c 'sysprop; thread' ./as.sh -f batch.as ./as.sh --use-version 3.3.3 ./as.sh --session-timeout 3600 ./as.sh --attach-only ./as.sh --select arthas-demo ./as.sh --repo-mirror aliyun --use-http

以上举例的是linux环境的运行命令,其实windows下是一样的,在CMD窗口就能运行,但是要注意的是很多人的Windows是没有装Telnet命令,自己要知道这一点,装windows自带的Telnet客户端就行(不装肯定启动报错,本地console也靠telnet连接的) 。

注意(很多人踩坑):按默认启动arthas进程后,就会开启两个端口 3658(Server默认端口,通过telnet访问,可用--telnet-port 修改)和 8563(http默认端口,通过浏览器访问,可用 --http-port 修改),这两监听端口都会绑定到待监控的JAVA进程上,如下所示,全都绑定到了 PID=94098 上:

而要开启arthas的远程访问模式,必须确保 3658 和 8563 端口不被占用,如果原来已开启了arthas本地访问模式,必须在console (控制台)模式下先stop停止服务(推荐方式),或者直接杀掉我们所监控的pid=94098进程也能完全退出Arthas,然后再开启arthas的远程访问方式(另外要实现对外访问,必须在防火墙里放开 8563 端口)。否则,随意切换到远程访问方式启动arthas,可能就直接报错了:

一旦采用远程访问方式,如果还想在本地打开console操作,同样也必须通过 java -jar arthas-boot.jar --target-ip 172.16.1.133 的方式连接并进入操作。

总结:

(1)总之本地访问方式和远程访问方式切换的情况下,要避免端口占用导致arthas启动失败;(2)以什么IP打开的监听,无论在本地还是远程都必须用指定IP连接;(3)判断arthas是否已启用,必须监听端口,而不是通过ps -ef|grep arthas查看,用ps所看到的arthas-boot.jar进程其实是本地console,而远程访问方式不依赖于本地console窗口,所以在远程模式情况下,到本地通过 ps -ef | grep arthas查看arthas-boot.jar进程,很可能什么也看不到。(3)webConsole远程

只要是按上面提到的远程访问方式运行,就支持webConsole访问,通过浏览器http访问8563端口,但注意的是,页面上IP也必须指定服务端的IP,不能用默认的127.0.0.1(这是不方便地方,按理服务端都指定IP了,客户端就不应该让人再输一遍),如下:

注意:可能webConsole是浏览器以websocket方式连接的,如果长时间不连接,就会自动断开(8563端口会自动切断,需要重新开启),这时候还可以用telnet连接,因为3658端口是服务端口,只要不停止arthas,就会一直连通。

(4)Telnet远程

由于webConsole时间长了不连接就会自动断开了(估计是两小时),这时候就不能用http连接了,但还是支持通过telnet连接,在CMD中,通过telnet命令连接(默认没有的就装一下,windows系统自带的但默认没启用)或是装第三方Telnet工具:

C:\Users\A>telnet 172.16.1.133 3658(5)tunnel server方式远程

上面的远程方式,有个缺点,就是每次都要连到被监控的机器,开启arthas,并指定要监控的JAVA进程,这些操作,出于安全考虑,可能用户现场都不让你操作(你都要时不时的连人家机器了,还叫什么远程监控)。这时候就要考虑下面的tunnel server的方案:

https://alibaba.github.io/arthas/web-console.html#arthas-tunnel-serverarthas

1.下载部署arthas tunnel server

https://github.com/alibaba/arthas/releases

2. Arthas tunnel server是一个spring boot fat jar应用,直接java -jar启动:

nohup java -jar arthas-tunnel-server-3.3.3.jar --server.port=8888 > output.log 2>&1 &

默认情况下,arthas tunnel server的web端口是8080(我们可以指定成8888端口,以免和别的系统冲突),arthas agent连接的端口是7777(如果要修改可以打开解压包,拽出application.properties文件,重新指定端口)。

3. 启动arthas,注册到tunnel server,并指定一个agent-id:mytest123456(默认是随机产生):

java -jar arthas-boot.jar --tunnel-server 'ws://172.16.1.133:7777/ws' --agent-id mytest123456

然后根据提示选择要监控的Java进程:

[INFO] arthas-boot version: 3.3.3 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. * [1]: 99057 /mnt/zfbb/zfbb-app-1.0-SNAPSHOT.jar [2]: 102928 SpringBlade.jar [3]: 34759 arthas-tunnel-server-3.3.3.jar 1 [INFO] arthas home: /root/.arthas/lib/3.3.3/arthas [INFO] Try to attach process 99057 [INFO] Attach process 99057 success. [INFO] arthas-client connect 127.0.0.1 3658 ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://alibaba.github.io/arthas tutorials https://alibaba.github.io/arthas/arthas-tutorials version 3.3.3 pid 99057 time 2020-06-11 13:29:19 id mytest123456

当我们看到最后的id mytest123456,就表示agent注册成功。

4. 启动之后,可以访问 http://{yourIP}:8888/,再通过agentId连接到已注册的arthas agent上:

5. 另外通过Spring Boot的Endpoint,可以查看到具体的连接信息: http://{yourIP}:8888/actuator/arthas,登陆用户名是arthas,密码在arthas tunnel server的日志里可以找到,比如:

登录后,就能看到都有哪些agentId注册上来,这样我们可选择性的连接:

看到这我们就明显了,arthas tunnel server和arthas agents是可以分布式部署的,相当于通过tunnel server可以把很多arthas实例管理起来,想连哪个就连哪个(而且不用担心断开,后续可以自动重连成功)。目前在Linux下测试都非常顺利,而将widnows下的agent注册到server端多少会因为防火墙或杀毒软件的影响不太顺利(毕竟依赖于telnet通信)。

另外我们启动arthas,也可以按以下方式,明确IP为agent-id(方便识别),同时明确target-ip(可以同时支持telnet方式和tunnel web-console方式连接),最后再带上要监控的进程号,如下所示:

java -jar arthas-boot.jar --tunnel-server 'ws://172.16.1.133:7777/ws' --target-ip 172.16.1.53 --agent-id 172.16.1.53 99057

这样通过IP就能记住agent-id,省得容易忘记还要通过 session命令重连来获取 agentId。

另外关于分布远程连接,arthas社区里也有人提供了一些解决方案,比如《Arthas Web-Console一站式解决方案》

最后放一张arthas tunnel server的架构示意图,有助于我们理解tunnel server和arthas agent的关系,如下所示:

先写到这吧,本来还打算写点使用心得(以后的吧)。这工具在定位和分析Java性能方面确实挺方便,但是很多开发人员对这个工具的熟悉程度肯定比我这个测试人员高多了,所以我属于班门弄虎了。

转载请注明来源smooth的博客:https://smooth.blog.csdn.net/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有