当前位置:首页 > 科技  > 软件

接口响应慢该如何排查

来源: 责编: 时间:2023-10-23 17:05:59 386观看
导读不知道大家有没有遇到这种情况,接口业务逻辑写完后,用 postman 一调,发现接口响应时间好长,不得不对接口进行优化。但是此时接口的代码往往逻辑比较复杂,调用层次也比较多,很难定位到耗时较长的代码块。遇到这种情况大家都

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

SGl28资讯网——每日最新资讯28at.com

遇到这种情况大家都是如何定位耗时代码块的呢?SGl28资讯网——每日最新资讯28at.com

我看到很多人都是直接用System.currentTimeMillis()对代码进行埋点:SGl28资讯网——每日最新资讯28at.com

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

或者用StopWatch打印方法耗时:SGl28资讯网——每日最新资讯28at.com

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

这两种方法本质上是一样的,都是通过手动在代码块上进行埋点,打印出方法的耗时,该方法不仅费时费力,而且对代码有侵入,修复问题后删掉代码还是一个麻烦事。SGl28资讯网——每日最新资讯28at.com

下面介绍如果通过Arthas定位耗时代码块。SGl28资讯网——每日最新资讯28at.com

Arthas 简介

Arthas是阿里开源的一款 Java 诊断工具,可以在无需重启 JVM 的情况下,实时查看应用 load、内存、gc、线程等状态信息,还能实时查看方法调用入参、出参、方法调用耗时等。SGl28资讯网——每日最新资讯28at.com

Arthas 快速开始

直接下载Arthasjar 包,然后用java -jar命令启动即可:SGl28资讯网——每日最新资讯28at.com

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

Arthas启动的时候,会打印出当前运行的 java 进程:SGl28资讯网——每日最新资讯28at.com

$ 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 到目标进程上,并输出日志:SGl28资讯网——每日最新资讯28at.com

[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/doctutorials  https://arthas.aliyun.com/doc/arthas-tutorials.htmlversion    3.6.9main_class com.huangxy.springstudy.SpringStudyApplicationpid        12512time       2023-07-25 09:14:22

到这里,Arthas 已经 attach 到我们的目标进程上了,我们尝试使用dashboad命令,查看进程的信息:SGl28资讯网——每日最新资讯28at.com

$ dashboardID   NAME                           GROUP          PRIORITY  STATE     %CPU      DELTA_TIME TIME      INTERRUPT DAEMON36   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     true24   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     true25   http-nio-8081-exec-2           main           5         WAITING   0.0       0.000      0:0.055   false     true54   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     trueMemory                    used     total    max     usage    GCheap                      83M      432M     7282M   1.14%    gc.ps_scavenge.count           4ps_eden_space             72M      212M     2688M   2.69%    gc.ps_scavenge.time(ms)        24ps_survivor_space         0K       21504K   21504K  0.00%    gc.ps_marksweep.count          2ps_old_gen                10M      199M     5461M   0.20%    gc.ps_marksweep.time(ms)       61nonheap                   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%Runtimeos.name                                                      Mac OS Xos.version                                                   13.0.1java.version                                                 1.8.0_351java.home                                                    /Library/Java/JavaVirtualMachines/jdk1.8.0_351.jdk/Contents/                                                             Home/jresystemload.average                                           3.80processors                                                   12

可以看到dashboad命令会展示一个实时的数据面板,列出了我们平时比较关心的数据指标,如内存使用量,gc 状态等。SGl28资讯网——每日最新资讯28at.com

使用 Trace 命令统计方法耗时

trace命令能主动搜索class-pattern/method-pattern对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。SGl28资讯网——每日最新资讯28at.com

比如下面接口:SGl28资讯网——每日最新资讯28at.com

@RestControllerpublic 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命令跟踪方法的调用情况:SGl28资讯网——每日最新资讯28at.com

$ trace com.huangxy.springstudy.controller.HelloController test

trace方法第一个参数是要 attach 的类的路径,第二个参数是方法名称,接着我们调用一遍接口,就能看到 hello 方法的调用堆栈及其耗时SGl28资讯网——每日最新资讯28at.com

SGl28资讯网——每日最新资讯28at.com

可以看到,这里耗时比较严重的是tow()方法,花了 1029ms,占了 90.73% 的比重。SGl28资讯网——每日最新资讯28at.com

不过需要注意的是,trace 命令只会 trace 匹配到的函数里的子调用,并不会向下 trace 多层,如果需要 trace 多层,可以用正则匹配多个函数,如:SGl28资讯网——每日最新资讯28at.com

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

SGl28资讯网——每日最新资讯28at.com

这下更清晰的定位到,导致耗时过长的方法是three()方法,定位到方法后,针对性的优化耗时代码块即可。SGl28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-14624-0.html接口响应慢该如何排查

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 2023 年 WebAssembly 现状:第四种 Web 语言

下一篇: 软件设计模式之MVC、MVP、MVVM、HMVC、MVA、MVI和VIPER

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • Golang 中的 io 包详解:组合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是对Reader和Writer接口的组合,
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top