Arthas使用教程—— 阿里开源线上监控诊断产物

打印 上一主题 下一主题

主题 838|帖子 838|积分 2514


1 简介

Arthas 是一款线上监控诊断产物,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题举行诊断,包括查看方法调用的出入参、非常,监测方法实行耗时,类加载信息等,大大提升线上问题排查效率。当你遇到以下雷同问题而束手无策时,Arthas 可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有实行到?岂非是我没 commit?分支搞错了?
遇到问题无法在线上 debug,岂非只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到 JVM 的实时运行状态?
······
2背景

通常,本地开辟情况无法访问生产情况。假如在生产情况中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产情况中调试是不可担当的,因为它会暂停所有线程,导致服务暂停。
开辟职员可以尝试在测试情况大概预发情况中复现生产情况中的问题。但是,某些问题无法在差别的情况中轻松复现,甚至在重新启动后就消失了。
假如您正在思量在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题大概无法解决,因为一旦 JVM 重新启动,它大概无法复现,如上文所述。
Arthas 旨在解决这些问题。开辟职员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永久不会暂停正在运行的线程。
3 图形界面工具 arthas 阿里开源

下载地址:https://arthas.aliyun.com/
简介:Arthas 是一款线上监控诊断产物,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题举行诊断,包括查看方法调用的出入参、非常,监测方法实行耗时,类加载信息等,大大提升线上问题排查效率。
3.1 :启动 arthas

直接通过java -jar 启动arthas的jar包文件
选择应用 java 进程:jvm-test 进程是第 1 个,则输入 1,再输入回车/enter。Arthas 会 attach 到目标进程上,并输出日志:

3.2 help :查看arthas所有命令




  • JVM 相关:

    • dashboard - 当前系统的实时数据面板
    • getstatic - 查看类的静态属性
    • heapdump - dump java heap, 雷同 jmap 命令的 heap dump 功能
    • jvm - 查看当前 JVM 的信息
    • logger - 查看和修改 logger
    • mbean - 查看 Mbean 的信息
    • memory - 查看 JVM 的内存信息
    • ognl - 实行 ognl 表达式
    • perfcounter - 查看当前 JVM 的 Perf Counter 信息
    • sysenv - 查看 JVM 的情况变量
    • sysprop - 查看和修改 JVM 的系统属性
    • thread - 查看当前 JVM 的线程堆栈信息
    • vmoption - 查看和修改 JVM 里诊断相关的 option
    • vmtool - 从 jvm 里查询对象,实行 forceGc

  • class/classloader 相关:

    • classloader - 查看 classloader 的继续树,urls,类加载信息,使用 classloader 去 getResource
    • dump - dump 已加载类的 byte code 到特定目次
    • jad - 反编译指定已加载类的源码
    • mc - 内存编译器,内存编译.java文件为.class文件
    • redefine - 加载外部的.class文件,redefine 到 JVM 里
    • retransform - 加载外部的.class文件,retransform 到 JVM 里
    • sc - 查看 JVM 已加载的类信息
    • sm - 查看已加载类的方法信息

  • monitor/watch/trace 相关:

    • monitor - 方法实行监控
    • stack - 输出当火线法被调用的调用路径
    • trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
    • tt - 方法实行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些差别的时间下调用举行观测
    • watch - 方法实行数据观测

  • 基础命令

    • base64 - base64 编码转换,和 linux 里的 base64 命令雷同
    • cat - 打印文件内容,和 linux 里的 cat 命令雷同
    • cls - 清空当前屏幕区域
    • echo - 打印参数,和 linux 里的 echo 命令雷同
    • grep - 匹配查找,和 linux 里的 grep 命令雷同
    • help - 查看命令帮助信息
    • history - 打印命令汗青
    • keymap - Arthas 快捷键列表及自界说快捷键
    • pwd - 返回当前的工作目次,和 linux 命令雷同
    • quit - 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
    • reset - 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
    • session - 查看当前会话的信息
    • stop - 关闭 Arthas 服务端,所有 Arthas 客户端全部退出
    • tee - 复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令雷同
    • version - 输出当前目标 Java 进程所加载的 Arthas 版本号

3.3 查看 dashboard

输入 dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断实行。
可以看到进程里面有哪些线程,每个线程的状态、吃CPU的情况等。
在Memory中我们可以看到内存的占用情况:


  • 新生代:eden_space、survivor_space
  • 老年代:tenured_space
  • 非堆内存:nonheap

3.4 thread 列出当前进程所有线程占用CPU和内存情况


thread pid会打印线程 ID pid 的栈,通常pid 1是 main 函数的线程。
thread -b 寻找死锁
3.5 jvm 查看该进程的各项参数 (类比 jinfo)


我们在garbage collectors(GC)里面可以看到这里垃圾接纳的统计情况


  • Copy(复制算法)用了49次,耗时506
  • MarkSweepCompact(标记整理算法)用了3次,耗时795
3.6 通过 jad 来反编译 UserController Class



3.8 monitor 监控方法的实行情况

监控com.example.jvm.controller.TestController类的 “getStr”方法 ,并且每5S更新一次状态。
  1. monitor com.example.jvm.controller.TestController getStr -c 5
复制代码

监控的维度阐明
监控项阐明timestamp时间戳classJava类method方法(构造方法、平凡方法)total调用次数success成功次数fail失败次数rt均匀耗时fail-rate失败率 3.9 watch:检测函数返回值

方法实行数据观测,让你能方便的观察到指定方法的调用情况。
能观察到的范围为:返回值、抛出非常、入参,通过编写OGNL 表达式举行对应变量的查看。
参数名称参数阐明class-pattern类名表达式匹配method-pattern方法名表达式匹配express观察表达式condition-express条件表达式在方法调用之前观察before[e]在方法非常之后观察 exception在方法返回之后观察 success[f]在方法结束之后(正常返回和非常返回)观察 finish[E]开启正则表达式匹配,默以为通配符匹配[x:]指定输出结果的属性遍历深度,默以为 1 这里重点要阐明的是观察表达式,观察表达式的构成紧张由ognl 表达式组成,以是你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。
特别阐明


  • watch 命令界说了4个观察事件点,即 -b 方法调用前,-e 方法非常后,-s 方法返回后,-f 方法结束后
  • 4个观察事件点 -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式举行求值并输出
  • 这里要留意方法入参方法出参的区别,有大概在中间被修改导致前后不一致,除了 -b 事件点 params 代表方法入参外,其余事件都代表方法出参
  • 当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或非常均不存在
通过watch命令可以查看函数的参数/返回值/非常信息。

  • 查看方法实行的返回值
  1. watch com.example.jvm.controller.UserController list returnObj
复制代码

3.10 trace:根据路径追踪,并记录消耗时间

   对方法内部调用路径举行追踪,并输出方法路径上的每个节点上耗时。
  简介:
trace 命令能自动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。
观察表达式的构成紧张由ognl 表达式组成,以是你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。
很多时间我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法实行的耗时来举行过滤了,例如trace *StringUtils isBlank '#cost>100’表示当实行时间凌驾100ms的时间,才会输出trace的结果。
watch/stack/trace这个三个命令都支持#cost耗时条件过滤。
参数阐明:
参数名称参数阐明class-pattern类名表达匹配method-pattern方法名表达式匹配condition-express条件表达式,使用OGNL表达式[E]开启正则表达式匹配,默认是通配符匹配[n:]设置命令实行次数#cost方法实行耗时,单位是毫秒 案例:
  1. #        trace函数指定类的指定方法
  2. trace com.example.jvm.controller.UserController list
复制代码

  1. #        在浏览器上进行登录操作,检查最耗时的方法
  2. trace *.DispatcherServlet *
复制代码

3.11 tt:时间隧道,记录多个哀求

   time-tunnel 时间隧道。
  记录下指定方法每次调用的入参和返回信息,并能对这些差别时间下调用的信息举行观测
  参数解析:
tt的参数阐明-t记录某个方法在一个时间段中的调用-l显示所有已经记录的列表-n 次数只记录多少次-s 表达式搜索表达式-i 索引号查看指定索引号的具体调用信息-p重新调用:指定的索引号时间碎片 案例:
  1. #        最基本的使用来说,就是记录下当前方法的每次调用环境现场。
  2. tt -t com.example.jvm.controller.UserController list
复制代码

模拟报错:
  1.     @Operation(summary = "业务接口模拟测试")
  2.     @Parameters({
  3.             @Parameter(name = "str",description = "字符串参数",in = ParameterIn.QUERY),
  4.     })
  5.     @GetMapping("work")
  6.     public ResponseEntity<String> work(@RequestParam("str") String str){
  7.         if (str.equals("1")){
  8.             throw new RuntimeException("异常");
  9.         }
  10.         testService.work1();
  11.         testService.work2();
  12.         testService.work3();
  13.         return ResponseEntity.ok().body("success");
  14.     }
  15.     public void work1() {
  16.         try {
  17.             Thread.sleep(1000);
  18.         }catch (InterruptedException e){
  19.             e.printStackTrace();
  20.         }
  21.         log.info("work1");
  22.     }
  23.     public void work2() {
  24.         try {
  25.             Thread.sleep(2000);
  26.         }catch (InterruptedException e){
  27.             e.printStackTrace();
  28.         }
  29.         log.info("work2");
  30.     }
  31.     public void work3() {
  32.         try {
  33.             Thread.sleep(3000);
  34.         }catch (InterruptedException e){
  35.             e.printStackTrace();
  36.         }
  37.         log.info("work3");
  38.     }
复制代码

  1. #        对现有记录进行检索
  2. tt -l
复制代码

  1. #        需要筛选出 `primeFactors` 方法的调用信息
  2. tt -s 'method.name=="getStr"'
复制代码

  1. #        查看某条记录详细信息
  2. tt -i 1007
复制代码

3.12 redefine 界说class

可以在不制止项目标情况下,修改java文件,通过javac 类名.java编译 再通过redefine 界说class上传到远程
我在Linux上放了一个小程序,输出zyw.

  1. # 编辑T.java文件
  2. vim T.java
  3. # 编译T.java生成T.class文件
  4. javac T.java
  5. # 启动arthas 绑定TestMain进程
  6. java -jar arthas-boot.jar
  7. # 重新定义T.class 文件
  8. redefine T.class
复制代码

3.13 退出 arthas

假如只是退出当前的毗连,可以用quit大概exit命令。Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次毗连时可以直接毗连上。
假如想完全退出 arthas,可以实行stop命令。

4 项目中应用



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表