主题
面试速答(先看这里)
**一句话结论:**1、首先就是通过各种监控系统,发现慢的现象或者问题。
60秒标准回答:
想要定位一个接口响应慢,有一个神器必备,那就是阿里巴巴推出的arthas,很快的就能定位到接口RT慢的问题,具体有一个案例,大家可以看下
使用Arthas定位接口慢的步骤大致如下
1、首先就是通过各种监控系统,发现慢的现象或者问题。 我们明确的知道了具体是哪个接口慢了。然后才能开始分析
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**想要定位一个接口响应慢,有一个神器必备,那就是阿里巴巴推出的arthas,很快的就能定位到接口RT慢的问题,具体有一个案例,大家可以看下:
- **要点2:**使用Arthas定位接口慢的步骤大致如下:
- **要点3:**2、安装arthas, arthas就是一个命令工具,他通过字节码插桩的方式来统计接口耗时的,很多公司的生产环境也都是可以用的,包括我司的生产环境都是可以用的,目前没发现什么副作用。
- **要点4:**如下面一个trace的输出信息,可以看到,一个接口整体耗时在265ms左右,但是其中有221ms是耗时在com.alibaba.fin.pricing.*.ExercisePriceDomainService:queryMatchedEffectiveExercisePrice() #167 这里的,所以就可以直接去看代码,分析下这里为什么有耗时了。
- **要点5:**6、耗时优化, 在定位到具体耗时的代码时,就可以分析了,是请求执行慢了,还是SQL慢了,还是哪里慢了,然后就想办法优化:
**记忆锚点:**arthas → trace → comalibabafinpricing → arthasaliyuncom → 很快的就能定位到接口 → 知道了具体是哪个接口
加分表达:
- 2、安装arthas, arthas就是一个命令工具,他通过字节码插桩的方式来统计接口耗时的,很多公司的生产环境也都是可以用的,包括我司的生产环境都是可以用的,目前没发现什么副作用。
- 比如直接查看一次真实请求的耗时情况(例子来自官网,大家可以自己实践一下): 如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数。
- 6、耗时优化, 在定位到具体耗时的代码时,就可以分析了,是请求执行慢了,还是SQL慢了,还是哪里慢了,然后就想办法优化:
追问准备:
- 围绕「arthas」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「trace」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「comalibabafinpricing」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
想要定位一个接口响应慢,有一个神器必备,那就是阿里巴巴推出的arthas,很快的就能定位到接口RT慢的问题,具体有一个案例,大家可以看下:
使用Arthas定位接口慢的步骤大致如下:
**1、首先就是通过各种监控系统,发现慢的现象或者问题。**我们明确的知道了具体是哪个接口慢了。然后才能开始分析。
**2、安装arthas,**arthas就是一个命令工具,他通过字节码插桩的方式来统计接口耗时的,很多公司的生产环境也都是可以用的,包括我司的生产环境都是可以用的,目前没发现什么副作用。
plain
curl -L http://start.alibaba-inc.com/install.sh | sh以上命令即可安装。
**3、运行,**比较简单,执行命令就行:
plain
sh as.sh4、查看接口耗时,这个就需要借助arthas的trace命令了,详见 https://arthas.aliyun.com/ 官网,trace命令的主要作用就是查看方法内部调用路径,并输出方法路径上的每个节点上耗时。
参数说明如下:

比如直接查看一次真实请求的耗时情况(例子来自官网,大家可以自己实践一下):
plain
$ trace demo.MathGame run
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 28 ms.
`---ts=2019-12-04 00:45:08;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[0.617465ms] demo.MathGame:run()
`---[0.078946ms] demo.MathGame:primeFactors() #24 [throws Exception]
`---ts=2019-12-04 00:45:09;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[1.276874ms] demo.MathGame:run()
`---[0.03752ms] demo.MathGame:primeFactors() #24 [throws Exception]如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数。比如下面的例子里,捕捉到一次调用就退出命令:
plain
$ trace demo.MathGame run -n 1
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 20 ms.
`---ts=2019-12-04 00:45:53;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[0.549379ms] demo.MathGame:run()
+---[0.059839ms] demo.MathGame:primeFactors() #24
`---[0.232887ms] demo.MathGame:print() #25
Command execution times exceed limit: 1, so command will exit. You can set it with -n option.也可以做一些过滤,比如耗时超过一定时长的再进行观测:
plain
$ trace demo.MathGame run '#cost > 1000'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 41 ms.
`---ts=2018-12-04 01:12:02;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[12.033735ms] demo.MathGame:run()
+---[0.006783ms] java.util.Random:nextInt()
+---[11.852594ms] demo.MathGame:primeFactors()
`---[0.05447ms] demo.MathGame:print()以上就是只观测耗时超过1000Ms的请求。
5、分析耗时。
如下面一个trace的输出信息,可以看到,一个接口整体耗时在265ms左右,但是其中有221ms是耗时在com.alibaba.fin.pricing.*.ExercisePriceDomainService:queryMatchedEffectiveExercisePrice() #167 这里的,所以就可以直接去看代码,分析下这里为什么有耗时了。
plain
[arthas@1658]$ trace com.alibaba.fin.pricing.**.PriceCalculateService trial '#cost > 50' -n 3
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 427 ms, listenerId: 6
`---ts=2021-11-08 15:10:24;thread_name=HSFBizProcessor-DEFAULT-8-thread-224;id=2d7c1;is_daemon=true;priority=10;TCCL=com.taobao.pandora.boot.loader.LaunchedURLClassLoader@783e6358;trace_id=2132e43116363554229592404e58b8;rpc_id=9.40.6
`---[264.85838ms] com.alibaba.fin.pricing.**.service.PriceCalculateService:trial()
+---[0.012009ms] com.alibaba.fin.pricing.**.request.PriceCalculateRequest:getTenant() #95
+---[0.001564ms] com.alibaba.fin.pricing.**.request.PriceCalculateRequest:getProduct() #96
...
...
...
+---[221.884809ms] com.alibaba.fin.pricing.*.ExercisePriceDomainService:queryMatchedEffectiveExercisePrice() #167
+---[0.002242ms] com.alibaba.fin.pricing.**.service.PriceQueryRequest:<init>() #170
`---[0.012586ms] com.alibaba.fin.pricing.**.service.PriceCalculateService:getTieredPrice() #170**6、耗时优化,**在定位到具体耗时的代码时,就可以分析了,是请求执行慢了,还是SQL慢了,还是哪里慢了,然后就想办法优化:
https://www.yuque.com/laiyanhong-9tr5c/zwpzru/izs89qgmcg3wpzrr
https://www.yuque.com/laiyanhong-9tr5c/zwpzru/aif93575gq6k95g3
https://www.yuque.com/laiyanhong-9tr5c/zwpzru/hxbm347o9cnrf7h6