接口性能耗时排查
1. 使用Arthas辅助排查
Arthas
的官方文档地址:https://arthas.aliyun.com/
1.1 下载并启动Arthas
# 下载到当前目录下
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 启动
java -jar arthas-boot.jar
# 等到出现 类似 [1]: 12345 /home/admin/example/demo.jar 这种的列表时,输入[]中的序号后按回车即可监听到目标 Java进程,见到如下命令行即可输入 arthas 的各种命令
[arthas@12345]$
# 退出arthas,用完arthas后,输入 stop 后按回车 即可。否则 arthas会在后台继续运行。
[arthas@12345]$ stop
curl
参数-O
:(大写字母O)使用远程文件的原始名称保存文件。-o
:(小写字母o)可以指定输出文件名,例如curl -o output.txt http://example.com/file.txt
。
1.2 使用trace
命令
使用情况:明确知道某个方法很慢,但不清楚具体是方法内哪段代码慢。
- 作用:输出方法内部的每个子方法的耗时。
- 注意:每次只能跟踪一级方法的调用链路。
# 根据调用方法耗时过滤,超过200毫秒的打印出来,捕捉10次
trace org.redisson.spring.data.connection.RedissonConnection get -n 10 '#cost > 200'
- 参数解析
-n 10
:指定捕捉结果的次数,默认100
次。'#cost > 100'
:捕捉RedissonConnection类
的get方法
耗时超过200ms
的调用。
- 结束
trace
命令- 如果收集到足够次数会自动结束本次
trace
。 - 如果要手动结束,按下
Q
或者Ctrl + C
也可以结束本次trace
。 - 结束本次trace后,输入
reset后按回车
取消对类和方法的增强,否则影响性能。
- 如果收集到足够次数会自动结束本次
写笔记时已经没有想要的例子,给出如下结果做分析,体会其过程。
[arthas@1452252]$ trace org.redisson.spring.data.connection.RedissonConnection get -n 10 '#cost > 2'
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 524 ms, listenerId: 1
`---ts=2024-12-28 13:11:30.609;thread_name=http-nio-8090-exec-123;id=21741;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@503f91c3
`---[4.702433ms] org.redisson.spring.data.connection.RedissonConnection:get()
`---[81.17% 3.817142ms ] org.redisson.spring.data.connection.RedissonConnection:read() #484
- 结果分析
- 一般会把耗时最长的方法标红显示。
- 上例可以看到是
RedissonConnection
的get
方法耗时最长。 - 接着就是对耗时最长的方法
进行优化
或者进一步排查
,进一步排查时可以继续使用trace
命令找到其子方法的耗时。