Java线上监控诊断产品Arthas(续集)

news2024/11/17 9:25:33

Java线上监控诊断产品Arthas(续集)

  • 前言
  • 1.auth指令
  • 2.monitor指令
    • 解读
  • 3.classloader指令
    • 场景
  • 4.dump指令
    • 场景
  • 5.getstatic指令
    • 场景
  • 6.heapdump指令
    • 场景
  • 7.profiler指令
    • 场景
  • 8.sc指令
    • 场景
  • 9.trace指令
    • 场景

前言

在去年,我发表了一片文章,Java线上监控诊断产品Arthas,今年又重新回顾了一下这门技术,发现了以前忽略了很多技术点,这篇文章用来作补充,并且思考了一下这些技术点可以用来哪些场景。

1.auth指令

在 attach 时,可以在命令行指定密码。比如:

java -jar arthas-boot.jar --password admin
  • 可以通过 --username 选项来指定用户,默认值是arthas。
  • 也可以在 arthas.properties 里中配置 username/password。命令行的优先级大于配置文件。
  • 如果只配置username,没有配置password,则会生成随机密码,打印在~/logs/arthas/arthas.log中

本地连接不鉴权
为了方便本地开发和调试,Arthas 默认允许本地连接不进行鉴权。,在arthas.properties文件里有配置:

arthas.localConnectionNonAuth=true

这样,即使设置了密码,本地连接也无需进行认证。
telnet链接鉴权
远程连接后,需要输入auth指令,输入正确密码,这样才能执行arthas的命令。

[arthas@37430]$ auth admin
Authentication result: true

不然会提示:

Error! command not permitted, try to use 'auth' command to authenticates.

2.monitor指令

案例一:最简单的应用,-c参数:统计周期,默认为120秒,我这5秒一次

monitor -c 5 com.example.demo.controller.ArthasController test

输入之后界面这样,没有任何输出:

[arthas@2719]$ monitor -c 5 com.example.demo.controller.ArthasController test
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 220 ms, listenerId: 2

然后我在浏览器疯狂请求这个接口几次,看看输出:

 timestamp                            class                                                  method                                                  total             success            fail              avg-rt(ms)         fail-rate        
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-08-26 14:54:40                  com.example.demo.controller.ArthasController           test                                                    1                 1                  0                 5.53               0.00%            

 timestamp                            class                                                  method                                                  total             success            fail              avg-rt(ms)         fail-rate        
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-08-26 14:54:45                  com.example.demo.controller.ArthasController           test                                                    6                 6                  0                 1.91               0.00%            

 timestamp                            class                                                  method                                                  total             success            fail              avg-rt(ms)         fail-rate        
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-08-26 14:54:47                  com.example.demo.controller.ArthasController           test                                                    9                 9                  0                 0.13               0.00%            

 timestamp                            class                                                  method                                                  total             success            fail              avg-rt(ms)         fail-rate        
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-08-26 14:54:55                  com.example.demo.controller.ArthasController           test                                                    0                 0                  0                 0.00               0.00%        

案例二:
此指令还支持条件匹配式,我这里举个最简单的例子:
“params[0]<=2”,表示接口的第一个参数必须<=2

monitor -c 5 com.example.demo.controller.ArthasController test "params[0]<=2"

经过测试,我参数传2的时候,可以检测到,当我参数num传3的时候,就检测不到:
接口:http://172.16.72.132:8081/arthast/inputNum?num=3

timestamp                            class                                                  method                                                  total             success            fail              avg-rt(ms)         fail-rate        
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-08-26 14:59:31                  com.example.demo.controller.ArthasController           test                                                    1                 1                  0                 0.21               0.00%            

 timestamp                            class                                                  method                                                  total             success            fail              avg-rt(ms)         fail-rate        
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-08-26 14:59:41                  com.example.demo.controller.ArthasController           test                                                    0                 0                  0                 0.00               0.00%          

解读

1.由上面的场景可以看出来,这个指令可以监控一个方法,在一定时间(-c控制)里被请求了多少次,可以用来压测、或者是热点接口监控,可以显示成功和失败率,并且可以显示平均 RT。
2.指令的条件匹配式,还可以帮助我们筛选想要的请求进来统计。

3.classloader指令

查看 classloader 的继承树,urls,类加载信息

  • classloader -l 按类加载实例进行统计

    [arthas@2719]$ classloader -l
     name                                                            loadedCount  hash      parent                                                                                                                                                  
     BootstrapClassLoader                                            4393         null      null                                                                                                                                                    
     com.taobao.arthas.agent.ArthasClassloader@dfd4a07               1702         dfd4a07   jdk.internal.loader.ClassLoaders$PlatformClassLoader@71423665                                                                                           
     jdk.internal.loader.ClassLoaders$AppClassLoader@5c29bfd         47           5c29bfd   jdk.internal.loader.ClassLoaders$PlatformClassLoader@71423665                                                                                           
     jdk.internal.loader.ClassLoaders$PlatformClassLoader@71423665   115          71423665  null                                                                                                                                                    
     org.springframework.boot.loader.LaunchedURLClassLoader@9629756  10082        9629756   jdk.internal.loader.ClassLoaders$AppClassLoader@5c29bfd                                                                                                 
    Affect(row-cnt:5) cost in 11 ms.
    
  • classloader -t 打印所有 ClassLoader 的继承树

    [arthas@2719]$ classloader -t
    +-BootstrapClassLoader                                                                                                                                                                                                                          
    +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@71423665                                                                                                                                                                                 
      +-com.taobao.arthas.agent.ArthasClassloader@dfd4a07                                                                                                                                                                                           
      +-jdk.internal.loader.ClassLoaders$AppClassLoader@5c29bfd                                                                                                                                                                                     
        +-org.springframework.boot.loader.LaunchedURLClassLoader@9629756                                                                                                                                                                            
    Affect(row-cnt:5) cost in 11 ms.
    

注意:上面打印出来的信息,尾部有@9629756 这种编号,这是类加载器的HashCode值,后面我们如果要指定类加载器,参数跟的就是这一串HashCode

  • classloader -c 显示类加载器位置,配合load参数,可以指定用某个类加载器去加载某个类。
[arthas@2719]$ classloader -c 9629756 --load com.example.demo.controller.FileController
load class success.
 class-info        com.example.demo.controller.FileController                                                                                                                                                                                   
 code-source       file:/data/demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/                                                                                                                                                                       
 name              com.example.demo.controller.FileController                                                                                                                                                                                   
 isInterface       false                                                                                                                                                                                                                        
 isAnnotation      false                                                                                                                                                                                                                        
 isEnum            false                                                                                                                                                                                                                        
 isAnonymousClass  false                                                                                                                                                                                                                        
 isArray           false                                                                                                                                                                                                                        
 isLocalClass      false                                                                                                                                                                                                                        
 isMemberClass     false                                                                                                                                                                                                                        
 isPrimitive       false                                                                                                                                                                                                                        
 isSynthetic       false                                                                                                                                                                                                                        
 simple-name       FileController                                                                                                                                                                                                               
 modifier          public                                                                                                                                                                                                                       
 annotation        org.springframework.stereotype.Controller,org.springframework.web.bind.annotation.RequestMapping                                                                                                                             
 interfaces                                                                                                                                                                                                                                     
 super-class       +-java.lang.Object                                                                                                                                                                                                           
 class-loader      +-org.springframework.boot.loader.LaunchedURLClassLoader@9629756                                                                                                                                                             
                     +-jdk.internal.loader.ClassLoaders$AppClassLoader@5c29bfd                                                                                                                                                                  
                       +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@71423665                                                                                                                                                          
 classLoaderHash   9629756  

场景

可以让指定的 classloader 去 getResources,打印出所有查找到的 resources 的 url。并且还可以指定类类的加载器,对于ResourceNotFoundException比较有用。

4.dump指令

dump 已加载类的 bytecode 到特定目录

场景

将 JVM 中实际运行的 class 的 byte code dump 到指定目录,适用场景批量下载指定包目录的 class 字节码;如需反编译单一类、实时查看类信息,可参考 jad。

  • dump -d /xx dump到指定目录

    [arthas@2719]$ dump -d /data com.example.demo.controller.UserInfoController
     HASHCODE  CLASSLOADER                                                          LOCATION                                                                                                                                                        
     9629756   +-org.springframework.boot.loader.LaunchedURLClassLoader@9629756     /data/org.springframework.boot.loader.LaunchedURLClassLoader-9629756/com/example/demo/controller/UserInfoController.class                                       
                 +-jdk.internal.loader.ClassLoaders$AppClassLoader@5c29bfd                                                                                                                                                                          
                   +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@71423665                                                                                                                                                                  
    Affect(row-cnt:1) cost in 202 ms.
    

    我们看看/data下面的目录文件:

    [root@localhost data]# ll /data/
    总用量 100884
    -rw-r--r--. 1 root root   141899 82 23:45 arthas-boot.jar
    drwxr-xr-x. 2 root root       24 84 01:46 arthas-output
    -rw-r--r--. 1 root root 99038636 826 14:39 demo-0.0.1-SNAPSHOT.jar
    -rw-r--r--. 1 root root      179 82 23:14 Dockerfile
    drwxr-xr-x. 2 root root      227 826 11:04 logs
    -rw-r--r--. 1 root root     4120 83 00:34 math-game.jar
    -rw-------. 1 root root  4097224 826 14:59 nohup.out
    drwxr-xr-x. 3 root root       17 826 15:50 org.springframework.boot.loader.LaunchedURLClassLoader-9629756
    -rw-r--r--. 1 root root      598 84 03:04 Test.class
    -rw-r--r--. 1 root root      446 823 16:17 Test.java
    

    org.springframework.boot.loader.LaunchedURLClassLoader-9629756,这个文件就是我们刚刚dump出来的目录,我们进入目录一直点下去,就能看到最终的class文件:

    [root@localhost controller]# ll
    总用量 4
    -rw-r--r--. 1 root root 2010 826 15:50 UserInfoController.class
    
  • dump --classLoaderClass sun.misc.Launcher$AppClassLoader UserInfoController
    用–classLoaderClass参数+ ClassLoader 的类名来指定类加载器加载,这里ClassLoader 实例必须唯一。classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而 java 11 的 classloader 是 jdk.internal.loader.ClassLoaders$AppClassLoader

5.getstatic指令

场景

想要知道某个类中的某个static修饰的字段的值是多少
示例:
我目前ArthasController 中的sum字段的值类型为Integer,值为6

[arthas@3126]$ getstatic com.example.demo.controller.ArthasController sum
field: sum
@Integer[6]
Affect(row-cnt:1) cost in 14 ms.

6.heapdump指令

场景

导出当前java的堆栈信息。
示例:

[arthas@3126]$ heapdump /data/testDump.hprof
Dumping heap to /data/testDump.hprof ...
Heap dump file created

cd到/data目录后,就可以看到了:

-rw-------. 1 root root 76268636 826 16:32 testDump.hprof

PS:这里的/data目录(本文几乎所有目录),是虚拟机的目录,不是arthas的目录,我们虽然attach上了arthas,控制台变了,但是我们还是可以访问宿主机的目录。默认路径是你arthas-boot.jar文件的目录

7.profiler指令

场景

生成火焰图
示例:
1.开始采样

[arthas@3126]$ profiler start
Profiling started

2.停止,会自动保存

[arthas@3126]$ profiler stop
OK
profiler output file: /data/arthas-output/20240826-170650.html

3.查看
官方说的是用 http://localhost:3658/arthas-output/就能查看,但是我物理机去访问这个地址,ip和端口都没问题,但是就是访问不起,不知道啥情况, 最后只有将文件复制到Windows,然后用浏览器查看。
最后结果就长这样,目前还不知道这个图怎么看,后面学习了再补充上。
在这里插入图片描述

8.sc指令

场景

查看 JVM 已加载的类信息
可选参数-d,就是detail

[arthas@3126]$ sc -d com.example.demo.controller.UserInfoController 
 class-info        com.example.demo.controller.UserInfoController                                                                                                                                                                               
 code-source       file:/data/demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/                                                                                                                                                                       
 name              com.example.demo.controller.UserInfoController                                                                                                                                                                               
 isInterface       false                                                                                                                                                                                                                        
 isAnnotation      false                                                                                                                                                                                                                        
 isEnum            false                                                                                                                                                                                                                        
 isAnonymousClass  false                                                                                                                                                                                                                        
 isArray           false                                                                                                                                                                                                                        
 isLocalClass      false                                                                                                                                                                                                                        
 isMemberClass     false                                                                                                                                                                                                                        
 isPrimitive       false                                                                                                                                                                                                                        
 isSynthetic       false                                                                                                                                                                                                                        
 simple-name       UserInfoController                                                                                                                                                                                                           
 modifier          public                                                                                                                                                                                                                       
 annotation        org.springframework.web.bind.annotation.RestController,org.springframework.web.bind.annotation.RequestMapping                                                                                                                
 interfaces                                                                                                                                                                                                                                     
 super-class       +-java.lang.Object                                                                                                                                                                                                           
 class-loader      +-org.springframework.boot.loader.LaunchedURLClassLoader@9629756                                                                                                                                                             
                     +-jdk.internal.loader.ClassLoaders$AppClassLoader@5c29bfd                                                                                                                                                                  
                       +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@71423665                                                                                                                                                          
 classLoaderHash   9629756                                                                                                                                                                                                                      

Affect(row-cnt:1) cost in 110 ms.

可选参数-f,需要配合-d一起使用,显示字段信息。

9.trace指令

场景

输出方法内部调用路径,从上往下层级调用输出,并输出方法路径上的每个节点上耗时

[arthas@3126]$ trace com.example.demo.controller.UserInfoController fileUpload
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 1030 ms, listenerId: 1
`---ts=2024-08-26 18:03:41;thread_name=http-nio-8081-exec-8;id=30;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@2ca6546f
    `---[75.03077ms] com.example.demo.controller.UserInfoController:fileUpload()
        +---[98.91% 74.209617ms ] com.example.demo.service.UserInfoService:list() #36
        `---[0.11% 0.084421ms ] com.example.demo.vo.ResultMsg:success() #37

这个接口的list方法耗时74.209617ms,占比98.91%,而ResultMsg:success()方法耗时0.084421ms,占比0.11%

以上就是对第一篇Java线上监控诊断产品Arthas内容的补充,如果后续有新的体会,出个3.0版本也说不一定,或者在本文继续补充。

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

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

相关文章

心血管内科常用评估量表汇总,附操作步骤与评定标准

心血管内科常用量表来评估患者病情、预测风险&#xff0c;量表在制定治疗方案和预测疾病进展等方面发挥着重要作用。常笑医学整理了6个心血管内科常用的评估量表&#xff0c;支持下载和在线使用&#xff0c;供临床医护人员参考。 01 GRACE缺血风险评估 &#xff08;完整量表请点…

Qt 学习第7天:Qt核心特性

元对象系统Meta-object system 来自AI生成&#xff1a; Qt中的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架的一个核心特性&#xff0c;它为Qt提供了一种在运行时处理对象和类型信息的能力。元对象系统主要基于以下几个关键概念&#xff1a; 1. QObject&a…

【91-136】行为型模式

目录 一.模板方法模式 1.1 概述 1.2 结构 1.3 案例 1.4 优缺点 1.5 使用场景 二.策略模式 2.1 概述 2.2 结构 2.3 案例 2.4 优缺点 2.5 使用场景 2.6 JDK 源码解析 三.命令模式 3.1 概述 3.2 结构 3.3 案例 3.4 优缺点 3.5 使用场景 四.责任链模式 4.1 概…

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 翻译

NeRF&#xff1a;将场景表示为用于视图合成的神经辐射场 引言。我们提出了一种方法&#xff0c;该方法通过使用稀疏的输入视图集优化底层连续体场景函数来实现用于合成复杂场景的新视图的最新结果。我们的算法使用全连通&#xff08;非卷积&#xff09;深度网络来表示场景&…

设计模式(一):七大原则

*设计模式的目的* 编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好 1) 代码重用性 (即:相同功能的代码,不用多次编写) 2) 可读性 (即:编程规范性, 便于其他程序员的阅读和理…

【C++ 第十七章】封装 unordered_map / unordered_set

声明&#xff1a;上一章讲解了 哈希结构的原理与实现&#xff0c;本章主要将上一章学过的拉链法的哈希结构封装进 unordered_map / unordered_set&#xff0c;所以需要先学过相关知识&#xff0c;才能更好吸收本章知识 上一章的链接&#xff1a;【C 第十六章】哈希 1. unorder…

Ubuntu24.04 安装向日葵远程访问工具

目录 安装向日葵远程访问工具 解决方案&#xff1a; 1.下载软件包 2.远程Ubuntu桌面控制卡住 卸载向日葵远程访问工具 安装向日葵远程访问工具 安装命令&#xff1a;sudo dpkg -i 文件名.deb sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 提示错误如下&#xf…

后端修改资源后重新运行项目了,浏览器刷新资源没更新问题

修改后重启项目&#xff0c;去浏览器刷新&#xff1a; 没有改变&#xff1f; 解决办法&#xff1a; F12去调试器里“网络”工具栏下找到“禁用缓存”按钮即可解决

视频转换成文字的5种方法,看一遍就能学会

视频已成为我们获取信息的重要渠道之一。然而&#xff0c;有时我们更需要将视频中的精华内容以文字形式提取出来&#xff0c;以便进行编辑、整理或分享。今天&#xff0c;就为大家介绍五种视频转换成文字的高效方法&#xff0c;一起来了解下吧。 方法一&#xff1a;口袋视频转换…

如何抠图把背景换成透明怎么做?

要抠图并将背景变为透明&#xff0c;这样做的好处是可以方便地将所选物体从原始图像中分离出来&#xff0c;并在其他背景上自由组合。怎么把图片变成透明底&#xff0c;抠图攻略分享&#xff1a;让你轻松上手抠图&#xff01; 通过抠图和背景透明化&#xff0c;您可以创建更多种…

深入理解微服务中的负载均衡算法与配置策略

负载均衡算法 我们首先来探讨一下默认情况下Ribbon使用的负载均衡算法。有些人可能会说它使用轮询算法&#xff0c;因为在本地测试时&#xff0c;我们经常会看到轮询的效果。然而&#xff0c;简单地依赖这种表面的观察来回答面试题是有风险的。实际上&#xff0c;忽略了深入理解…

Superset 无需登录访问分享的图表

1&#xff0c;进入Superset安装目录找到config.py文件 2&#xff0c;修改config.py中的配置项 添加 PUBLIC_ROLE_LIKE: Optional[str] "Gamma" # Grant public role the same set of permissions as for a selected builtin role. # This is useful if one wants to…

Large Bin Attack 源码调试

Large Bin Attack 分配跟 large bin 有关的 chunk&#xff0c;要经过 fastbin&#xff0c;unsorted bin&#xff0c;small bin 的分配&#xff0c;建议在学习 large bin attack 之前搞清楚 fastbin&#xff0c;unsorted bin 分配的流程。 large bin中双向链表的连接方法&…

五款伪原创文章生成器软件,为创作者快速生成高质量内容

在内容为王的时代&#xff0c;创作者们面临着巨大的压力&#xff0c;需要不断地产出高质量、有深度的文章。在这个过程中&#xff0c;伪原创文章生成器软件成为了许多创作者的得力助手。本文将为你详细介绍5款伪原创文章生成器软件&#xff0c;帮助你快速生成高质量内容。 一、…

vue part4

收集表单数据 v-model label直接包住input不用关联也可以获取焦点 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>收集表单数据</title><script type"text/javascript" src&quo…

SpringBoot校园万能墙系统的设计与实现97395

目 录 1 绪论 1.1研究背景与意义 1.2研究现状 1.3论文结构与章节安排 2 相关技术介绍 2.1 springboot框架介绍 2.2 JavaScript 2.3 Mysql数据库 2.4 Vue.js 主要功能 3 系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 法律可行性分析…

“领导让我帮忙买30杯奶茶,实际花费535元,但领导却只转了500元,我该如何提醒领导转我35元的差额?”

在职场中&#xff0c;我们时常会遇到一些让人哭笑不得的小事&#xff0c;它们虽小&#xff0c;却足以反映出职场中的微妙关系和处事哲学。 一位行政朋友曾发帖称&#xff1a;“我是一名5年工作经验的企业行政助理&#xff0c;也不是小白。但有一次&#xff0c;业务部门领导让我…

【机器学习】嘿马机器学习(科学计算库)第4篇:Matplotlib,学习目标【附代码文档】

本教程的知识点为&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位 机器学习概述 机器学习概述 1.5 机器学习算法分类 1 监督学习 机器学习概述 1.7 Azure机器学习模型搭建实验 Azure平台简介 Matplotlib 3.2 基础绘图功能 — 以折线图为例 1 完善原…

为什么每个Java开发者都应该掌握CompletableFuture?深入探索这一强大的并发工具!

文章目录 1 如何正确处理异步任务的异常情况&#xff1f;2 如何设置 CompletableFuture 的超时时间&#xff1f;3 如何取消正在执行的CompletableFuture任务&#xff1f; 1 如何正确处理异步任务的异常情况&#xff1f; 想象一下&#xff0c;用餐厅的例子来比喻 CompletableFut…

计算机组成与设计 - 1.7 功耗墙 - 1.8 单处理器向多处理器的转变 - 1.9 基准

1.7 功耗墙 25 年间 1ntel x86 八代微处理器的时钟频率和功耗 。 奔腾 4 处理器时钟频率和功耗提高很大 &#xff0c;但是性能提升不大 。 Prescott 发热问题导致奔腾 4 处理器的生产线被放弃 。 Core 2 生产线恢复使用低时钟频率的简单流水线和片上多处理器 。 Core i5 采用同…