下载Arthas的jar包

https://arthas.aliyun.com/

上传jar包到你的服务器启动

启动 arthas

在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):


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

执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -u admin -EH java -jar arthas-boot.jar。

如果 attach 不上目标进程,可以查看~/logs/arthas/ 目录下的日志。

如果下载速度比较慢,可以使用 aliyun 的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http

java -jar arthas-boot.jar -h 打印更多参数信息。

选择你要排查的JAVA运行的服务

监控成功就进入

找到你代码里面的耗时比较慢的接口

例如:
@PostMapping("/createOrder")
@Override
public Result<Object> createOrder(@RequestBody PreOrderBusinessOrderRequest requestBody)

执行Arthas的监控命令--监控这个接口

监控方法-----整体耗时 monitor命令

monitor -c 5 com.xxxx.cashier.payment.interfaces.service.PaymentServiceController create

监控方法-----整体耗时 monitor命令得到结果

Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 835 ms, listenerId: 1
timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2024-05-14 10:50:06 com.xxxx.cashier.payment.interfaces.serv create 1 1 0 5732.03 0.00%
ice.PaymentServiceController timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2024-05-14 10:50:15 com.xxxx.cashier.payment.interfaces.serv create 0 0 0 0.00 0.00%
ice.PaymentServiceController

监控方法-----每行执行结果耗时 trace 命令

trace  com.xxxxx.cashier.payment.interfaces.service.PaymentServiceController create

监控方法-----每行执行结果耗时 trace 命令执行结果

Press Q or Ctrl+C to abort.

Affect(class count: 1 , method count: 1) cost in 178 ms, listenerId: 2

---ts=2024-05-14 10:52:27;thread_name=http-nio-8291-exec-19;id=74;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@592cb470 ---[6373.19803ms] com.xxxx.platform.cashier.payment.interfaces.service.PaymentServiceController:create()

+---[0.00% 0.155539ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setStateId() #38

+---[0.00% 0.020813ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getPhoneNo() #39

+---[0.00% 0.020437ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setCreator() #39

+---[0.00% 0.021332ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getUserId() #40

+---[0.00% 0.019115ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setCreatorId() #40

+---[99.99% 6372.41672ms ]com.xxxx.platform.cashier.payment.application.PaymentService:order() #43

+---[0.00% 0.027684ms ] com.xxxx.common.domain.model.Result:ok() #48

`---[0.00% 0.01374ms ] com.xxxx.common.domain.model.Result:setResponse() #49

得到结果:-[99.99% 6372.41672ms ]com.xxxx.platform.cashier.payment.application.PaymentService:order()

方法里面嵌套的这个方法调取耗时---继续追踪

[arthas@1711210]$ trace com.xxxx.platform.cashier.payment.application.impl.PaymentServiceImpl order

PaymentServiceImpl order 的耗时追踪

Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 2) cost in 453 ms, listenerId: 3
`---ts=2024-05-14 10:54:32;thread_name=http-nio-8291-exec-22;id=77;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@592cb470
`---[5546.383883ms] com.xxxx.platform.cashier.payment.application.impl.PaymentServiceImpl$$EnhancerBySpringCGLIB$$5fc9f056:order()
`---[100.00% 5546.162384ms ] org.springframework.cglib.proxy.MethodInterceptor:intercept()
`---[99.95% 5543.406012ms ] com.xxxx.platform.cashier.payment.application.impl.PaymentServiceImpl:order()
+---[0.00% 0.037904ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getPayChannel() #83
+---[0.00% 0.01964ms ] com.xxxx.platform.cashier.domain.model.PayTypeEnum:getDesc() #85
+---[0.00% 0.030665ms ] com.xxxx.platform.cashier.payment.application.CheckCommonService:payOrderCreateCheck() #89
+---[0.00% 0.01448ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getMerchantId() #94
+---[0.05% 2.768826ms ] com.xxxx.platform.cashier.merchant.application.MerchantService:getThatMerchantNo() #96
+---[0.00% 0.03542ms ] com.xxxx.platform.cashier.merchant.domain.model.Merchant:getStatus() #98
+---[0.00% 0.014544ms ] com.xxxx.platform.cashier.merchant.domain.model.Merchant:getFee() #102
+---[0.00% 0.015929ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getAmount() #104
+---[0.00% 0.017196ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setMerchantFee() #105
+---[0.00% 0.014196ms ] com.xxxx.platform.cashier.domain.model.PaymentStatusEnum:code() #107
+---[0.00% 0.015284ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setStatus() #107
+---[0.00% 0.013615ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getUserId() #109
+---[0.00% 0.015292ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setPayerId() #109
+---[0.00% 0.017296ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getPhoneNo() #110
+---[0.00% 0.014007ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setPayerName() #110
+---[0.00% 0.011935ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getMerchantId() #112
+---[0.00% 0.013289ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getOrderNo() #112
+---[0.03% 1.53837ms ] com.xxxx.platform.cashier.common.RedisLockUtils:lock() #112
+---[0.00% 0.019698ms ] com.xxxx.platform.cashier.domain.model.TransactionTypeEnum:code() #117
+---[0.00% 0.019657ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setTransactionType() #117
+---[0.00% 0.014411ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getCurrencyType() #120
+---[0.00% 0.055756ms ] org.apache.commons.lang3.StringUtils:isEmpty() #120
+---[0.00% 0.016267ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setCurrencyType() #120
+---[0.00% 0.053548ms ] com.xxxx.platform.cashier.common.RuleCommonUilt:getOrderNoNextValue() #123
+---[0.00% 0.014304ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setPaymentNo() #123
+---[99.64% 5523.18862ms ] com.xxxx.platform.cashier.payChannel.application.WxPayService:unifiedOrderV3() #126
+---[0.00% 0.031283ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getPrepayId() #129
+---[0.00% 0.019875ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setChannelFlowNo() #130
+---[0.00% 0.014413ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getCodeUrl() #132
+---[0.00% 0.015808ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setCodeUrl() #132
+---[0.00% 0.014376ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getExpireTime() #134
+---[0.19% 10.32507ms ] com.xxxx.platform.cashier.payment.infra.persistent.PaymentRepository:save() #137
+---[0.00% 0.013414ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getMerchantId() #139
+---[0.00% 0.0138ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getOrderNo() #139
+---[0.05% 2.851317ms ] com.xxxx.platform.cashier.common.RedisLockUtils:unlock() #139
+---[0.00% 0.034698ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:<init>() #140
+---[0.00% 0.017892ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getPaymentNo() #141
+---[0.00% 0.01654ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:setPaymentNo() #141
+---[0.00% 0.01323ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getNonceStr() #142
+---[0.00% 0.0158ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:setNonceStr() #142
+---[0.00% 0.012434ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getCodeUrl() #143
+---[0.00% 0.01343ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:setCodeUrl() #143
+---[0.00% 0.01348ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getTimeStamp() #144
+---[0.00% 0.014787ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:setTimeStamp() #144
+---[0.00% 0.01276ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getSignType() #145
+---[0.00% 0.014926ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:setSignType() #145
+---[0.00% 0.014566ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:setPrepayId() #146
+---[0.00% 0.01013ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getPrepayId() #147
+---[0.00% 0.013928ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:setPackgeVal() #147
+---[0.00% 0.019242ms ] com.xxxx.platform.cashier.payChannel.callback.vo.WxPayRespDto:getPaySign() #148
`---[0.00% 0.01396ms ] com.xxxx.platform.cashier.domain.dto.PayRespDto:setPaySign() #148

PaymentServiceImpl order 的耗时追踪结果

[99.64% 5523.18862ms ] com.xxxx.platform.cashier.payChannel.application.WxPayService:unifiedOrderV3() #126

WxPayService:unifiedOrderV3() 耗时比较高---继续追踪


trace com.xxxx.platform.cashier.payChannel.handler.JsapiPrepayHandler handlePrepay

WxPayService:unifiedOrderV3() 耗时比较高---继续追踪---结果

Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 270 ms, listenerId: 6
`---ts=2024-05-14 11:06:59;thread_name=http-nio-8291-exec-34;id=83;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@592cb470
`---[5495.001335ms] com.xxxx.platform.cashier.payChannel.handler.JsapiPrepayHandler:handlePrepay()
+---[0.00% 0.031287ms ] com.xxxx.platform.cashier.payChannel.application.WxConfigService:getWxConfig() #58
+---[0.24% 12.980429ms ] com.xxxx.platform.cashier.payChannel.application.WxConfigService:getWxCallBackUrl() #59
+---[0.00% 0.013296ms ] com.xxxx.platform.cashier.payChannel.application.WxConfigService:getPayChannel() #60
+---[0.00% 0.051999ms ] com.xxxx.platform.cashier.payChannel.domain.model.PayChannel:getMid() #62
+---[0.00% 0.014014ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:setPayChannelId() #62
+---[0.00% 0.01112ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:<init>() #66
+---[0.00% 0.008355ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getAppId() #68
+---[0.00% 0.007783ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setAppid() #68
+---[0.00% 0.032611ms ] com.wechat.pay.java.core.Config:createCredential() #70
+---[0.00% 0.012989ms ] com.wechat.pay.java.core.auth.Credential:getMerchantId() #70
+---[0.00% 0.007349ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setMchid() #70
+---[0.00% 0.007852ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getDescription() #72
+---[0.00% 0.007496ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setDescription() #72
+---[0.00% 0.008485ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getExpireTime() #74
+---[0.00% 0.014132ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setTimeExpire() #80
+---[0.00% 0.006621ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setNotifyUrl() #87
+---[0.00% 0.008656ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getPaymentNo() #89
+---[0.00% 0.00741ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setOutTradeNo() #89
+---[0.00% 0.008734ms ] com.wechat.pay.java.service.payments.jsapi.model.Amount:<init>() #91
+---[0.00% 0.007847ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getAmount() #92
+---[0.00% 0.008955ms ] com.wechat.pay.java.service.payments.jsapi.model.Amount:setTotal() #92
+---[0.00% 0.007979ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getCurrencyType() #93
+---[0.00% 0.006736ms ] com.wechat.pay.java.service.payments.jsapi.model.Amount:setCurrency() #93
+---[0.00% 0.008146ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setAmount() #94
+---[0.00% 0.005114ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getPaymentNo() #96
+---[0.00% 0.008387ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getOrderNo() #96
+---[0.00% 0.007641ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setAttach() #96
+---[0.00% 0.00908ms ] com.wechat.pay.java.service.payments.jsapi.model.Payer:<init>() #98
+---[0.00% 0.007556ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getOpenId() #100
+---[0.00% 0.007754ms ] com.wechat.pay.java.service.payments.jsapi.model.Payer:setOpenid() #100
+---[0.00% 0.013363ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest:setPayer() #101
+---[0.00% 0.008127ms ] com.xxxx.platform.cashier.domain.model.CashierPayment:getClientIp() #103
+---[0.00% 0.024896ms ] org.apache.commons.lang3.StringUtils:isNotBlank() #103
+---[0.00% 0.00985ms ] com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension$Builder:<init>() #109
+---[0.00% 0.008498ms ] com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension$Builder:config() #111
+---[0.00% 0.008683ms ] com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension$Builder:signType() #112
+---[0.00% 0.184347ms ] com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension$Builder:build() #113
+---[99.73% 5480.296786ms ] com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension:prepayWithRequestPayment() #115
+---[0.00% 0.031419ms ] com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse:getPackageVal() #116
+---[0.00% 0.02185ms ] org.apache.commons.lang3.StringUtils:isEmpty() #116
`---[0.00% 0.065744ms ] com.xxxx.platform.cashier.payChannel.handler.JsapiPrepayHandler:buildWxPayRespVo() #121

找到罪魁祸首 JsapiServiceExtension:prepayWithRequestPayment() 耗时全都是他

分析代码:甩锅了

arthas定位接口的耗时排查问题的更多相关文章

  1. iOS7上的地图定位接口BUG

    遇到个BUG,卡了好久,就是在iOS9上定位接口是正常的,但是在iOS7上就一直拿不到回调,但是看系统日志其实已经定位到了.总是在报一句not response,也没有具体函数名 昨天灵机一动,从de ...

  2. 从零开始学 Web 之 HTML5(三)网络监听,全屏,文件读取,地理定位接口,应用程序缓存

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  3. 【原创】基于RBI的性能测试理念,通过jmeter快速定位接口最大并发用户数

    测试工具:jmeter v_5.2 测试对象:某网站的物料获取接口,需登录后操作 测试目的:快速定位该接口最大并发用户数 思路&步骤: 1.模拟一个场景,某天临近下班,主管突然过来让你测下你们 ...

  4. 基于Spring AOP实现对外接口的耗时监控

    AOP是Spring的核心,Spring不但自身对多种框架的集成是基于AOP,并且以非常方便的形式暴露给普通使用者.以前用AOP不多,主要是因为它以横截面的方式插入到主流程中,担心导致主流程代码不够清 ...

  5. 有关于腾讯地图服务端IP定位接口的获取当前城市的处理

    接口说明:http://apis.map.qq.com/ws/location/v1/ip 说明里面写了ip可以缺省,然并卵,经过测试的到结果并不能获取到当前城市,理由是腾讯ip库的对应ip精度没有定 ...

  6. 记一次接口调用耗时服务端PHP-FPM配置调优

    最近测试人员不时有反馈,APP首页打开会出现除了基本的页面布局,需要展示数据的地方都是空白. 想着最近首页接口有过调整,新增数据.会不会是接口改动导致的?? 但APP首页接口都是读取redis的,应该 ...

  7. RCA:收单设备调用云端接口频繁超时排查总结

    研发中心/王鹏 2019年7月 关键词:OKHTTP,安卓,连接复用,开源软件BUG 一.背景知识: OKHTTP已是安卓项目中被广泛使用的网络请求开源库,它有如下特性: 1.支持HTTP/2,允许所 ...

  8. JVM诊断及工具笔记(2)使用arthas定位哪里执行了System#gc()

    笔者是汽车之家实时计算平台的一名小伙伴.负责flink平台,数据湖及kafka平台的设计与开发.平时擅长做平台设计,定位及解决各种疑难杂症.第二篇文章,讲的点依旧很小,但是这次图多!!! 在这里感谢支 ...

  9. axis2 和 xfire 接口调用问题排查

    背景: 1个运营商厂家开发人员离职,我们为了上线对接接口,迁就对方客户端调用.对方客户端框架用的是xfire.调用方式基本为:   Service serviceModel = new ObjectS ...

  10. jmeter配置脚本录制进行抓包并快速分析、定位接口问题

    对于测试人员.开发人员来说,善用抓包工具确实是快速分析和定位问题的一大必备神技,现将配置过程记录如下: 1.打开jmeter后,首先添加一个线程组: 2.线程组可以重新命名按项目名称分类 3.然后在工 ...

随机推荐

  1. 2025年了,你还不会配置Jetson Orin NX嘛?

    2025年了,你还不会配置Jetson Orin NX嘛? 我的设备为:Jetson Orin NX 16G + JetPack6.1+达妙科技载板 帅气的Jetson Orin NX拿到手了,都20 ...

  2. spark (四) RDD概念

    目录 1. RDD基本概念 1.1 弹性 1.2 分布式 1.3 数据集 1.4 数据抽象 1.5 不可变 1.6 可分区.并行计算 2. WordCount为例,看RDD特性 3. RDD的五大属性 ...

  3. Datawhale AI 夏令营-天池Better Synth多模态大模型数据合成挑战赛-task3持续上分(更新中)

    在大数据.大模型时代,随着大模型发展,互联网数据渐尽且需大量处理标注,为新模型训练高效合成优质数据成为新兴问题."天池 Better Synth - 多模态大模型数据合成挑战赛"应 ...

  4. 在Quartz .NET的工作类中使用依赖注入

    Quartz .NET默认的Execute方法是不支持非空的构造函数的,所以.net core常用的构造函数依赖注入也搞不来,网上搜索一番搞定了这个问题. 解决方案简单来说就是自定义一个任务工厂,替换 ...

  5. 零基础学习Modbus通信协议

    大家好!我是付工. 2012年开始接触Modbus协议,至今已经有10多年了,从开始的懵懂,到后来的顿悟,再到现在的开悟,它始终岿然不动,变化的是我对它的认知和理解. 今天跟大家聊聊关于Modbus协 ...

  6. CDS标准视图:维护计划数据 C_MaintenancePlanDEX

    视图名称:维护计划数据 C_MaintenancePlanDEX 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'CMAINTPLANDEX' @Aba ...

  7. C#调用IronOcr识别文字不理想

    识别文字不理想,不知道什么原因,文字太小就几乎无法识别.... void Test() { DateTime d1 = DateTime.Now; var ocr = new IronTesserac ...

  8. YUV 格式

    1. YUV比例 分三种:YUV44,YUV422,YUV420 2. YUV排布 分三种:YUV planar,YUV Semi-Plannar,YUV packed 以YUV422 8*4 为例 ...

  9. 同态加密技术及其在FL/MPC中的应用-洪澄

    转载:链接 Pailler是具有一次乘法同态的. Pailler 我好像一直叫的都是 "拍利尔" . 关于定理的证明,参考:Pailler 同态性 安全性 语义安全 DCR问题 简 ...

  10. Sybaris pg walkthrough Intermediate 从redis 到 rce

    nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A 192.168.166.93 Starting Nmap 7.94SVN ( https://nmap.org ...