接口性能耗时排查

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命令找到其子方法的耗时。
上次更新时间: