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

       在使用 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 之后自行探索。

  1. 是否有一个全局视角来查看系统的运行状况?
  2. 为什么 CPU 又升高了,到底是哪里占用了 CPU ?
  3. 运行的多线程有死锁吗?有阻塞吗?
  4. 程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
  5. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  6. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  7. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  8. 有什么办法可以监控到 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 <pid>./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' <pid>./as.sh -f batch.as <pid>./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性能方面确实挺方便,但是很多开发人员对这个工具的熟悉程度肯定比我这个测试人员高多了,所以我属于班门弄虎了。

4. 附带arthas常用命令

基础命令

        help——查看命令帮助信息

        cls——清空当前屏幕区域

        session——查看当前会话的信息

        reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类

        version——输出当前目标 Java 进程所加载的 Arthas 版本号

        quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

        stop ——关闭 Arthas 服务端,所有 Arthas 客户端全部退出

        keymap——Arthas快捷键列表及自定义快捷键

 jvm相关

        dashboard——当前系统的实时数据面板;例子:dashboard -n 10

        thread——查看当前 JVM 的线程堆栈信息;例子:thread [pid](常指定pid线程),thread -n 5(CPU最高的五个线程)

        jvm——查看当前 JVM 的信息

        sysprop——查看和修改JVM的系统属性

        getstatic——查看类的静态属性;例子:getstatic demo.MathGame random

class/classloader相关

        sc——查看JVM已加载的类信息;支持通配符 sc *server*

        sm——查看已加载类的方法信息;支持通过配符 sm  *server*

        dump——dump 已加载类的 byte code 到特定目录;例子:dump *StringUtils

        redefine——加载外部的.class文件,redefine到JVM里;例子:redefine /tmp/Test.class

        jad——反编译指定已加载类的源码(或类中方法的源码);例子:jad java.lang.String toString

        classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor/watch/trace相关

        monitor——方法执行监控;例子(要指定类名和方法名):monitor org.apache.commons.lang.StringUtils isBlank

        watch——方法执行数据观测;例子:watch org.apache.commons.lang.StringUtils isBlank '{params, returnObj}' -x 2

        trace——方法内部调用路径,并输出方法路径上的每个节点上耗时;例子:trace *.commons.lang.StringUtils isBlank

        stack——输出当前方法被调用的调用路径;例子:stack org.apache.commons.lang.StringUtils isBlank

        tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测;例子:tt -t *.commons.lang.StringUtils isEmpty

        请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 shutdown 或将增强过的类执行 reset 命令(因为线上不能随便重启服务,通过reset可以清理内存中的增加类信息)。

options

        options——查看或设置Arthas全局开关;注意设置全局配置有风险(比如引起服务进程异常退出)。

管道

        Arthas支持使用管道对上述命令的结果进行进一步的处理,如:sm org.apache.log4j.Logger | grep getLogger

        grep——搜索满足条件的结果

        plaintext——将命令的结果去除颜色

        wc——按行统计输出结果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353138.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing...

~~因为不太会使用opencv、matlab工具&#xff0c;所以在找一些比较简单的工具。 . 一、NLP标注工具 来源&#xff1a;《构想&#xff1a;中文文本标注工具&#xff08;附开源文本标注工具列表&#xff09;》 Chinese-Annotator 来源&#xff1a;https://github.com/crownpku/…

kube-proxy源码阅读(iptables实现)

Reference 文章目录 1 入口2 ProxyServer创建及调用3 ProxyServer 核心调用流程3.1 func (o *Options) Run() err3.2 func (o *Options) runLoop() error3.3 func (s *ProxyServer) Run() error3.4 func (proxier *Proxier) SyncLoop() 4 资源事件处理流程4.1 Service事件4.2 …

windows_删除多余网络适配器(删除/卸载多余网卡)/删除TAP虚拟网卡NIC

文章目录 Device Manager检查所有NIC状态利用资源监视器查看网卡情况接入不同网络对于计算机网络环境造成不同的影响接入传统的wifi接入手机热点的wifi Device Manager 删除指定的Network adapter(网卡又称为网络适配器)完成之后你可能需要重启才可以上网 检查所有NIC状态 包…

值得一阅的Kali系统的使用小技巧

目录 写在最前1.软件安装软件源关于AMD显卡驱动浏览器中文输入法下载工具代理软件QQSteam 2.使用优化ssh服务开启Grub修改Zsh和PowerShell命令标头修改VSCode内置终端字体间距过大问题 Aria2配置文件 写在最前 不定期更新 1.软件安装 软件源 推荐使用中科大源&#xff0c;官…

基于geoserver开发地图发布服务

写在前面&#xff1a;我在github上创建了对应的项目&#xff0c;可点此跳转&#xff0c;本文的所有源码均可在项目里找到&#xff0c;欢迎大家访问交流 一、开发背景 在gis领域&#xff0c;geoserver是后端地图发布的开源项目。目前我们在启动服务后&#xff0c;可通过自带的…

CIPSTAT

AT_TCPIP_CmdFunc_CIPSTART //start up tcpip connection 1&#xff09;if (gCipBearer ! BEARER_WIFI) 承载是GPRS(1)还是WIFI&#xff08;2&#xff09;&#xff0c;若非WIFI&#xff0c;获取SimStatus 2)if ((!cipMux_multiIp && (CIP_INITIALg_uCipContexts.nBeare…

Cloud Computing:云计算的简介、必要性以及安全上云与企业数字化转型(从陈坤/辛芷蕾主演电视剧《输赢》看云计算的未来)的关系

Cloud Computing&#xff1a;云计算的简介、必要性以及安全上云与企业数字化转型(从陈坤/辛芷蕾主演电视剧《输赢》看云计算的未来)的关系 目录 云计算的简介、必要性以及安全上云与企业数字化转型(从陈坤/辛芷蕾主演电视剧《输赢》看云计算的未来)的关系 从陈坤/辛芷蕾主演电…

relation-graph关系图谱组件2.0版本遇到的问题

前提&#xff1a;之前已经写过一篇1.1版本的问题&#xff0c;这里就不过多讲了&#xff08;如果想要解决火狐低版本兼容&#xff0c;看那个就行&#xff09; 这次主要讲的是和1.X版本的区别和一些其它问题 区别 参数名不同&#xff1a;以前的links>lines (虽然现在links也…

高压放大器在微流控技术的应用研究

随着微流控技术的不断发展&#xff0c;其在生物医学、环境监测、化学分析等领域中的应用越来越广泛&#xff0c;也对相关器件的性能提出了更高的要求。其中&#xff0c;高压放大器作为一种电子元器件&#xff0c;在微流控技术中具有重要的作用。下面安泰电子将从高压放大器在微…

仙境传说RO:添加商店物品教程

仙境传说RO&#xff1a;添加商店物品教程 我是艾西&#xff0c;今天跟大家分享下仙境传说RO游戏中我们自己怎么创建商店卖东西装备等&#xff0c;首先看看下图以及自己创建商店时需要在文档里创建的脚本格式 //*------------------shop普通商店------------------ //带坐标的…

Java养成类小游戏

此周是做项目 做一个java的养成类的小游戏 我是用控制台写的小游戏 建了很多的UI地图&#xff0c;部分代码&#xff0c; 然后让我们来看实现的样子&#xff1a; 好啦&#xff0c;部分内容就到这啦 早点洗洗睡叭&#xff01;

Java游戏合集

游戏1&#xff1a;猜数字小游戏&#xff1a; import java.util.Scanner; class GuessNumber{public static void main(String args[]){int number (int)(Math.random()*100)1;System.out.println("请输入一个数据&#xff08;1-100&#xff09;用于猜数字。");whil…

JAVA学习之路-简单的城堡游戏(一)

简单的文字城堡游戏&#xff08;一&#xff09; 最近在学习后台的一些功能&#xff0c;发现自己的基础不是很牢固&#xff0c;所以想写点小程序&#xff0c;巩固一下以前学的知识&#xff0c;融合一下。 之前在慕课上学的课程中就有一个这样的小程序&#xff0c;写一个简单的…

Nginx的优化,安全与防盗链

目录 一、Nginx的页面优化 1&#xff09;Nginx的网页压缩 2&#xff09;配置Nginx的图片缓存 3&#xff09;Nginx的连接超时设置 4&#xff09;Nginx的并发设置 查看cpu的核心数&#xff0c;根据核心数来设置工作进程数 修改工作进程核心数 &#xff1a; 测试结果&…

java做RPG小游戏

题目 java课设&#xff0c;一个游戏中有多种角色(Character)&#xff0c;例如&#xff1a;国王&#xff08;King&#xff09;、皇后&#xff08;Queen&#xff09;、骑士&#xff08;Knight&#xff09;、老怪&#xff08;Troll&#xff09;。 角色之间可能要发生战斗(fight)&…

【Java游戏合集】手把手教你制作游戏

家人们&#xff0c;今天我们来看一下学Java必练的10款游戏项目&#xff01; 大家都知道学习编程必须要做的就是敲代码和做项目练手了&#xff0c;那项目有难有易&#xff0c;很多小伙伴不知道从哪里找项目来练习&#xff0c;今日我们来看一下初级项目中都有哪些能让我们来练手…

Java桌面游戏巡礼——国外Java游戏合集(第一回)

1、 Virus Effect 这是一个2D的Java横板射击游戏&#xff0c;作者在其中融入了很多FPS&#xff08;First Personal Shooting Game&#xff09;要素&#xff0c;角色能够进行换枪、调整射击角度、装弹拆弹等仿真操作&#xff0c;并于游戏内设置有教学关卡&#xff0c;即使是从未…

java保姆级教程—— 1.什么是游戏

引言&#xff1a; Java保姆级教程是笔者在暑假时&#xff0c;为学弟们准备的java游戏教程&#xff0c;今天整理了一下&#xff0c;共享给网友们&#xff0c;笔者也是学生&#xff0c;若有大神发现文中存在误区&#xff0c;还请私信笔者。注&#xff1a;java游戏保姆级教程&…

Java游戏开发——对对碰

游戏介绍&#xff1a; 对对碰游戏在n*n的游戏池中进行&#xff0c;每个格子中有一个图案。鼠标连续选中两个横排或竖排相邻的图案&#xff0c;它们的位置会互换&#xff0c;互换后如果横排或者竖排有3个以上相同的图像&#xff0c;则可以消去该图像&#xff0c;并得分。 游戏…

连连看游戏的设计与实现——基于JAVA语言的小游戏

说明&#xff1a;本篇博客主要讲述练练看游戏的设计与实现。前半部分为分析与类和属性的说明&#xff0c;后半部分为程序的实现与程序代码。第一次写小游戏&#xff0c;仍存在许多问题&#xff0c;也借鉴了CSDN前辈的代码想法&#xff0c;如有不妥&#xff0c;还望多批评指正。…