Arthas 使用方法简介

news2024/11/24 23:10:20

在这里插入图片描述

一、背景

不知道大家有没有遇到这种情况,接口业务逻辑写完后,用 postman 一调,发现接口响应时间好长,不得不对接口进行优化。但是此时接口的代码往往逻辑比较复杂,调用层次也比较多,很难定位到耗时较长的代码块

遇到这种情况大家都是如何定位耗时代码块的呢?

我看到很多人都是直接用System.currentTimeMillis()对代码进行埋点

public static void main(String[] args) {  
    Long startTime = System.currentTimeMillis();  
    exec();  
    Long endTime = System.currentTimeMillis();  
    log.info("exec 方法执行耗时:{}ms", endTime - startTime);  
}  

或者用StopWatch打印方法耗时

public static void main(String[] args) throws InterruptedException {  
    StopWatch stopWatch = new StopWatch();  
    stopWatch.start("exec");  
    exec();  
    stopWatch.stop();  
    System.out.println(stopWatch.prettyPrint());  
}  

这两种方法本质上是一样的,都是通过手动在代码块上进行埋点,打印出方法的耗时,该方法不仅费时费力,而且对代码有侵入,修复问题后删掉代码还是一个麻烦事

下面介绍如果通过Arthas定位耗时代码块

二、Arthas 简介

Arthas是阿里开源的一款 Java 诊断工具,可以在无需重启 JVM 的情况下,实时查看应用 load、内存、gc、线程等状态信息,还能实时查看方法调用入参、出参、方法调用耗时等

三、Arthas 快速开始

直接下载Arthasjar 包,然后用java -jar命令启动即可

$ curl -O https://arthas.aliyun.com/arthas-boot.jar  
$ java -jar arthas-boot.jar  

Arthas启动的时候,会打印出当前运行的 java 进程

$ java -jar arthas-boot.jar  
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_351.jdk/Contents/Home/jre  
[INFO] arthas-boot version: 3.6.9  
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.  
* [1]: 12512 com.huangxy.springstudy.SpringStudyApplication  
  [2]: 12511 org.jetbrains.jps.cmdline.Launcher  

然后可以选择我们需要 attach 的 java 进程,这里我们选择 1,然后按回车。Arthas 会 attach 到目标进程上,并输出日志:

[INFO] arthas home: /Users/huangxiaoyu/.arthas/lib/3.6.9/arthas  
[INFO] Try to attach process 12512  
[INFO] Attach process 12512 success.  
[INFO] arthas-client connect 127.0.0.1 3658  
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.  
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'  
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.  
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |  
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'  
  
wiki       https://arthas.aliyun.com/doc  
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html  
version    3.6.9  
main_class com.huangxy.springstudy.SpringStudyApplication  
pid        12512  
time       2023-07-25 09:14:22  

到这里,Arthas 已经 attach 到我们的目标进程上了,我们尝试使用dashboad命令,查看进程的信息


$ dashboard  
ID   NAME                           GROUP          PRIORITY  STATE     %CPU      DELTA_TIME TIME      INTERRUPT DAEMON  
36   DestroyJavaVM                  main           5         RUNNABLE  0.0       0.000      0:1.748   false     false  
-1   C1 CompilerThread3             -              -1        -         0.0       0.000      0:0.761   false     true  
-1   VM Periodic Task Thread        -              -1        -         0.0       0.000      0:0.237   false     true  
24   http-nio-8081-exec-1           main           5         WAITING   0.0       0.000      0:0.098   false     true  
-1   VM Thread                      -              -1        -         0.0       0.000      0:0.071   false     true  
25   http-nio-8081-exec-2           main           5         WAITING   0.0       0.000      0:0.055   false     true  
54   arthas-NettyHttpTelnetBootstra system         5         RUNNABLE  0.0       0.000      0:0.054   false     true  
-1   GC task thread#8 (ParallelGC)  -              -1        -         0.0       0.000      0:0.043   false     true  
-1   GC task thread#1 (ParallelGC)  -              -1        -         0.0       0.000      0:0.043   false     true  
-1   GC task thread#7 (ParallelGC)  -              -1        -         0.0       0.000      0:0.042   false     true  
-1   GC task thread#6 (ParallelGC)  -              -1        -         0.0       0.000      0:0.042   false     true  
-1   GC task thread#0 (ParallelGC)  -              -1        -         0.0       0.000      0:0.042   false     true  
-1   GC task thread#9 (ParallelGC)  -              -1        -         0.0       0.000      0:0.042   false     true  
-1   GC task thread#2 (ParallelGC)  -              -1        -         0.0       0.000      0:0.042   false     true  
-1   GC task thread#3 (ParallelGC)  -              -1        -         0.0       0.000      0:0.042   false     true  
-1   GC task thread#5 (ParallelGC)  -              -1        -         0.0       0.000      0:0.042   false     true  
-1   GC task thread#4 (ParallelGC)  -              -1        -         0.0       0.000      0:0.042   false     true  
Memory                    used     total    max     usage    GC  
heap                      83M      432M     7282M   1.14%    gc.ps_scavenge.count           4  
ps_eden_space             72M      212M     2688M   2.69%    gc.ps_scavenge.time(ms)        24  
ps_survivor_space         0K       21504K   21504K  0.00%    gc.ps_marksweep.count          2  
ps_old_gen                10M      199M     5461M   0.20%    gc.ps_marksweep.time(ms)       61  
nonheap                   53M      56M      -1      94.71%  
code_cache                6M       7M       240M    2.87%  
metaspace                 40M      43M      -1      94.45%  
compressed_class_space    5M       5M       1024M   0.53%  
direct                    16K      16K      -       100.01%  
mapped                    0K       0K       -       0.00%  
Runtime  
os.name                                                      Mac OS X  
os.version                                                   13.0.1  
java.version                                                 1.8.0_351  
java.home                                                    /Library/Java/JavaVirtualMachines/jdk1.8.0_351.jdk/Contents/  
                                                             Home/jre  
systemload.average                                           3.80  
processors                                                   12  

可以看到dashboad命令会展示一个实时的数据面板,列出了我们平时比较关心的数据指标,如内存使用量,gc 状态等。更多命令的使用,可以参考官网的命令列表。

四、使用 Trace 命令统计方法耗时

trace命令能主动搜索class-pattern/method-pattern对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路

比如下面接口

@RestController  
public class HelloController {  
  
    @GetMapping("/test")  
    public String test() throws InterruptedException {  
       one();  
       two();  
       return "hello";  
    }  
  
    private void two() throws InterruptedException {  
        Thread.sleep(20);  
        three();  
    }  
  
    private void three() throws InterruptedException {  
        Thread.sleep(1000);  
    }  
  
    private void one() throws InterruptedException {  
        Thread.sleep(100);  
    }  
  
}  

启动Arthas进程,并 attach 到我们的 springboot 项目上,接着使用trace命令跟踪方法的调用情况
trace方法第一个参数是要 attach 的类的路径,第二个参数是方法名称,接着我们调用一遍接口,就能看到 hello 方法的调用堆栈及其耗时
在这里插入图片描述
可以看到,这里耗时比较严重的是tow()方法,花了 1029ms,占了 90.73% 的比重

不过需要注意的是,trace 命令只会 trace 匹配到的函数里的子调用,并不会向下 trace 多层,如果需要 trace 多层,可以用正则匹配多个函数,如

$ trace -E com.huangxy.springstudy.controller.HelloController test|two  

在这里插入图片描述
这下更清晰的定位到,导致耗时过长的方法是three()方法,定位到方法后,针对性的优化耗时代码块即可

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

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

相关文章

小黑day5那拉提空中草原上午因下雨关闭改去河谷草原,下午薰衣草基地,入住伊宁江苏酒店附近吃当地特色羊肉串的leetcode之旅:209. 长度最小的子数组

小黑代码 class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:# 数组长度n len(nums)# 定义双指针head 0tail 0# 中间变量sum_ 0# 结果变量min_ n 1# 开始迭代 while head < n:# 尾部指针右移while tail < n and sum_ < target…

快速掌握Postman实现接口测试

快速掌握Postman实现接口测试 Postman简介 Postman是谷歌开发的一款网页调试和接口测试工具&#xff0c;能够发送任何类型的http请求&#xff0c;支持GET/PUT/POST/DELETE等方法。Postman非常简单易用&#xff0c;可以直接填写URL&#xff0c;header&#xff0c;body等就可以发…

企业权限管理(十一)-角色操作

角色操作-查询所有 RoleController RequestMapping("/role") Controller public class RoleController {Autowiredprivate IRoleService roleService;RequestMapping("/findAll.do")public ModelAndView findAll() throws Exception {ModelAndView mv n…

网络通信TCP/IP协议逐层分析数据链路层(第四十课)

Ethernet Ⅱ帧,也称为Ethernet V2帧,是如今局域网里最常见的以太帧,是以太网事实标准。如今大多数的TCP/IP应用(如HTTP、FTP、SMTP、POP3等)都是采用Ethernet II帧承载。 1、MAC地址概述 -MAC地址,即以太网地址,用来标识一个以太网上的某个单独设备或一组设备 -长度…

SGL论文中相关公式推导

SGL论文中相关公式推导 题记对文中公式14到15进行推导对文中公式16进行解析对文中公式20进行补充说明对文中公式21进行补充说明参考博文及感谢 题记 关于Wu2021_SIGIR_paper_Self-supervised graph learning for recommendation》这篇文章已经有很多大神整理过了&#xff0c;具…

TVP走进南京文投:数字化浪潮下,文旅业如何迈向发展“快车道”?

引言 随着数字经济的蓬勃发展&#xff0c;文旅业也面临着数字化浪潮的冲击与挑战。如何实现数字技术与文化内涵的有机结合&#xff0c;成为行业内绕不开的热点话题。8 月 4 日&#xff0c;腾讯云 TVP 联合腾讯文旅&#xff0c;携手南京文投集团&#xff0c;在南京大报恩寺遗址景…

【QGIS】处理带坐标的Excel、csv格式的数据文件

1、场景描述 项目中客户提供了某地区的地址数据Excel&#xff0c;让我发布地图服务。 2、处理过程 arcgis有导入Excel的功能&#xff0c;只需要指定横纵坐标和坐标系即可。可是我对arcgis不熟悉&#xff0c;查了一下QGIS是否有导入Excel的功能。暂时没查到直接导入Excel的文…

Redis持久化——RDB和AOF

Redis数据库是内存数据库&#xff0c;一旦出现服务宕机&#xff0c;那么内存中的数据就容易丢失。所以需要进行redis的持久化动作。 Redis持久化是指将Redis内存数据持存储到磁盘中&#xff0c;若出现了Redis服务宕机后&#xff0c;能够从硬盘中再恢复到Redis内存中。 Redis的持…

软件测试面试题【2023整理版(含答案)】

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分方法 边界值分析方法 错误推测方法 因果图方法 判定表驱动分析方法 正交实验设…

现有的vue3+ts+vite项目集成electron

效果图 什么时Electron Electron是使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。 Electron兼容Mac、Windows和Linux,可以构建出三个平台的应用程序。 现有的vue3项目集成Electron 安装依赖 原来有一个vue3+ts+vite+pnpm的项目,其中sub-modules是子项目,web是…

威海--游记

威海盛夏已至&#xff0c;气温攀升的同时&#xff0c;小伙伴们出去玩的心也都藏不住了。 作为离韩国最近的城市&#xff0c;不出国门就能轻松get到浓浓的“韩范儿”&#xff01;从韩式建筑、小吃甜品&#xff0c;再到各种宝藏打卡小店&#xff0c;玩法超多&#xff0c;好吃好看…

计算机竞赛 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

__ob__: Observer 后缀的数组的取值方式

开发中&#xff0c;经常从接口、父组件中&#xff0c;拿到数组然后给新的数组使用&#xff0c; 但是&#xff0c;有时候会发现带有 __ob__: Observer 后缀的数组&#xff0c;对这种数组来说&#xff0c;你是无法取到这个数组的值的&#xff0c; 而且&#xff0c;离谱的是consol…

【广州华锐互动】物联网工程VR虚拟课件有哪些特色?

物联网工程VR虚拟课件由广州华锐互动制作&#xff0c;是一种利用虚拟现实技术&#xff0c;将物联网的概念和应用场景通过模拟的方式呈现给学生的教学工具。相比传统的教学方式&#xff0c;物联网工程VR虚拟课件具有以下特色&#xff1a; 1.交互性强 物联网工程VR虚拟课件可以让…

七夕音乐照片墙制作教程,打造独一无二的浪漫礼物

大家好&#xff0c;我是机灵鹤。 一年一度的七夕马上到了。 我准备送女朋友一个亲手制作的&#xff0c;有创意的&#xff0c;有程序员特色的礼物。 女朋友特别喜欢林俊杰&#xff0c;于是我决定做一个林俊杰歌曲的 NFC 音乐相框 送给她 。 只需要用手机 NFC 在歌曲照片上贴…

韧性数据安全体系组成:多层级快速响应 |CEO专栏

风险是可以具象化和可感知的对象&#xff0c;是数据安全的衡量标准之一&#xff0c;上期「构建适应性进化的韧性数据安全体系」专栏&#xff0c;对韧性数据安全体系的组成-适应性动态风险展开介绍。 本期内容&#xff0c;将介绍韧性数据安全体系的另一个重要组成—多层级快速响…

Dubbo 与 gRPC、Spring Cloud、Istio 的关系

很多开发者经常会问到 Apache Dubbo 与 Spring Cloud、gRPC 以及一些 Service Mesh 项目如 Istio 的关系&#xff0c;要解释清楚它们的关系并不困难&#xff0c;你只需要跟随这篇文章和 Dubbo 文档做一些更深入的了解&#xff0c;但总的来说&#xff0c;它们之间有些能力是重合…

家纺家居小程序商城搭建指南

随着移动互联网的快速发展&#xff0c;小程序成为了商家们开展电商业务的重要方式之一。家纺家居行业作为一个庞大的市场&#xff0c;也可以通过搭建小程序商城来实现线上销售。下面就为大家介绍一下如何搭建家纺家居小程序商城。 首先&#xff0c;我们需要找一个专业成熟的小程…

el-tree通过default-expand-all动态控制展开/折叠

1、如下图通过勾选框动态控制展开/折叠&#xff0c;全选/清空 2、实现方式如下&#xff1a;定义key&#xff0c;监听checked2修改treeKey&#xff0c;重新渲染tere&#xff1b;附加全选和清空。 <div class"tree"><el-checkbox v-model"checked1"…

Salesforce 为什么能够在 CRM 市场获得成功?

Salesforce 为什么能够在 CRM 市场获得成功&#xff1f; 虽然salesforce有着水土不服&#xff0c;数据安全等问题&#xff0c;但依旧受到了国内CRM系统使用者的追捧。 但是近年来国内的一些CRM平台也做得很不错了&#xff0c;我认为没必要执着于非本土系统。 下面就以一个CR…