AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

接口響應(yīng)慢該如何排查

來(lái)源: 責(zé)編: 時(shí)間:2023-10-23 17:05:59 304觀看
導(dǎo)讀不知道大家有沒(méi)有遇到這種情況,接口業(yè)務(wù)邏輯寫(xiě)完后,用 postman 一調(diào),發(fā)現(xiàn)接口響應(yīng)時(shí)間好長(zhǎng),不得不對(duì)接口進(jìn)行優(yōu)化。但是此時(shí)接口的代碼往往邏輯比較復(fù)雜,調(diào)用層次也比較多,很難定位到耗時(shí)較長(zhǎng)的代碼塊。遇到這種情況大家都

不知道大家有沒(méi)有遇到這種情況,接口業(yè)務(wù)邏輯寫(xiě)完后,用 postman 一調(diào),發(fā)現(xiàn)接口響應(yīng)時(shí)間好長(zhǎng),不得不對(duì)接口進(jìn)行優(yōu)化。但是此時(shí)接口的代碼往往邏輯比較復(fù)雜,調(diào)用層次也比較多,很難定位到耗時(shí)較長(zhǎng)的代碼塊。6Si28資訊網(wǎng)——每日最新資訊28at.com

6Si28資訊網(wǎng)——每日最新資訊28at.com

遇到這種情況大家都是如何定位耗時(shí)代碼塊的呢?6Si28資訊網(wǎng)——每日最新資訊28at.com

我看到很多人都是直接用System.currentTimeMillis()對(duì)代碼進(jìn)行埋點(diǎn):6Si28資訊網(wǎng)——每日最新資訊28at.com

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

或者用StopWatch打印方法耗時(shí):6Si28資訊網(wǎng)——每日最新資訊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());}

這兩種方法本質(zhì)上是一樣的,都是通過(guò)手動(dòng)在代碼塊上進(jìn)行埋點(diǎn),打印出方法的耗時(shí),該方法不僅費(fèi)時(shí)費(fèi)力,而且對(duì)代碼有侵入,修復(fù)問(wèn)題后刪掉代碼還是一個(gè)麻煩事。6Si28資訊網(wǎng)——每日最新資訊28at.com

下面介紹如果通過(guò)Arthas定位耗時(shí)代碼塊。6Si28資訊網(wǎng)——每日最新資訊28at.com

Arthas 簡(jiǎn)介

Arthas是阿里開(kāi)源的一款 Java 診斷工具,可以在無(wú)需重啟 JVM 的情況下,實(shí)時(shí)查看應(yīng)用 load、內(nèi)存、gc、線程等狀態(tài)信息,還能實(shí)時(shí)查看方法調(diào)用入?yún)ⅰ⒊鰠ⅰ⒎椒ㄕ{(diào)用耗時(shí)等。6Si28資訊網(wǎng)——每日最新資訊28at.com

Arthas 快速開(kāi)始

直接下載Arthasjar 包,然后用java -jar命令啟動(dòng)即可:6Si28資訊網(wǎng)——每日最新資訊28at.com

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

Arthas啟動(dòng)的時(shí)候,會(huì)打印出當(dāng)前運(yùn)行的 java 進(jìn)程:6Si28資訊網(wǎng)——每日最新資訊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 進(jìn)程,這里我們選擇 1,然后按回車(chē)。Arthas 會(huì) attach 到目標(biāo)進(jìn)程上,并輸出日志:6Si28資訊網(wǎng)——每日最新資訊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 已經(jīng) attach 到我們的目標(biāo)進(jìn)程上了,我們嘗試使用dashboad命令,查看進(jìn)程的信息:6Si28資訊網(wǎng)——每日最新資訊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命令會(huì)展示一個(gè)實(shí)時(shí)的數(shù)據(jù)面板,列出了我們平時(shí)比較關(guān)心的數(shù)據(jù)指標(biāo),如內(nèi)存使用量,gc 狀態(tài)等。6Si28資訊網(wǎng)——每日最新資訊28at.com

使用 Trace 命令統(tǒng)計(jì)方法耗時(shí)

trace命令能主動(dòng)搜索class-pattern/method-pattern對(duì)應(yīng)的方法調(diào)用路徑,渲染和統(tǒng)計(jì)整個(gè)調(diào)用鏈路上的所有性能開(kāi)銷(xiāo)和追蹤調(diào)用鏈路。6Si28資訊網(wǎng)——每日最新資訊28at.com

比如下面接口:6Si28資訊網(wǎng)——每日最新資訊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);    }}

啟動(dòng)Arthas進(jìn)程,并 attach 到我們的 springboot 項(xiàng)目上,接著使用trace命令跟蹤方法的調(diào)用情況:6Si28資訊網(wǎng)——每日最新資訊28at.com

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

trace方法第一個(gè)參數(shù)是要 attach 的類的路徑,第二個(gè)參數(shù)是方法名稱,接著我們調(diào)用一遍接口,就能看到 hello 方法的調(diào)用堆棧及其耗時(shí)6Si28資訊網(wǎng)——每日最新資訊28at.com

6Si28資訊網(wǎng)——每日最新資訊28at.com

可以看到,這里耗時(shí)比較嚴(yán)重的是tow()方法,花了 1029ms,占了 90.73% 的比重。6Si28資訊網(wǎng)——每日最新資訊28at.com

不過(guò)需要注意的是,trace 命令只會(huì) trace 匹配到的函數(shù)里的子調(diào)用,并不會(huì)向下 trace 多層,如果需要 trace 多層,可以用正則匹配多個(gè)函數(shù),如:6Si28資訊網(wǎng)——每日最新資訊28at.com

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

6Si28資訊網(wǎng)——每日最新資訊28at.com

這下更清晰的定位到,導(dǎo)致耗時(shí)過(guò)長(zhǎng)的方法是three()方法,定位到方法后,針對(duì)性的優(yōu)化耗時(shí)代碼塊即可。6Si28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-14612-0.html接口響應(yīng)慢該如何排查

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Fiber Golang:Golang中的強(qiáng)大Web框架

下一篇: 當(dāng)年很流行,現(xiàn)在已經(jīng)淘汰的前端技術(shù),請(qǐng)不要再繼續(xù)學(xué)了!

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top