前言:
最近线上环境某个接口服务响应时间偏长,致使用户体验感超差;当出现这种状况时,咱们该怎么快速的排查这类问题呢?html
经常使用的排查思路:java
-
为代码添加上详细的打印日志; 不建议 ,一是线上环境,无法随便的从新部署更换了详细日志的代码,二是 添加详细的日志输出,那就意味这会生成大量的日志文件,这些日志文件会占据大量服务器磁盘空间。git
-
搭建一个模拟了线上环境的测试环境进行复盘排查;额,出现了这种问题哪有那么多的时间让你进行环境复盘排查,因此此方案也是 不建议的 。github
-
线上诊断神器 Arthas ,这个工具是阿里开源的,专门用于线上环境问题排查的,这个工具提供了不少的 命令 用来排查问题; 当出现上面的响应时间偏长的问题,就能够使用 Arthas 提供的 trace 命令进行排查,使用这个工具的 trace 命令能够统计到方法中整个调用链路上的全部性能开销和追踪调用链路,查找其中耗时比较长的方法再具体排查便可。spring
文章接下来将从两方面展开:数据库
①、搭建模拟线上服务接口响应时间偏长的环境;SpringBoot 服务接口 + JMeter 模拟服务接口调用;springboot
②、使用诊断神器 Arthas 提供的命令 trace 命令进行响应时间偏长的问题排查;服务器
模拟线上服务环境:
一、SpringBoot 项目搭建,而且编写好服务接口;工具
注意:服务接口代码为了简便,只写了 一些大循环的代码 来模拟较长的耗时;除此以外,实际上还包含不少多其它常见的状况,例如:性能
-
服务接口方法中存在不少的 JDBC 操做 ,而且因为数据库中数据量太大,致使不少的 JDBC 查询很是耗时,而且此时可能因为尚未建立合适的索引,致使查询耗时更加的长,最终致使服务接口响应时间偏长;
-
此服务接口中调用了 其它的服务接口 ,因为内部调用的其它服务接口出现问题等,致使此其它服务接口执行耗时比较长,进而致使服务接口响应时间偏长;
服务接口代码以下:
test一、test2方法以下:
二、JMeter 模拟用户调用的测试脚本配置:
三、服务接口 SpringBoot 代码 和 JMeter 测试脚本的所在项目位置:
服务接口代码准备好后,使用IDEA开发工具将其导出为 Jar 包 。
服务接口代码和JMeter脚本获取地址:模拟Demo源码地址
为了模拟最为真实的线上环境,需将准备好的 服务接口Jar包 放到 Linux 服务器中,而后使用命令 java -jar .jar 运行起 Jar 包;
最后使用 JMeter 进行接口的调用,在 聚合报告 中发现平均响应时间偏长;如图:
若是有用户反映某功能响应时间太长了,别着急,根据下面使用Arthas的方法进行排查,绝对方便又快速的找到问题缘由。嘿嘿嘿 . . . . . .
Arthas 进行问题排查:
按照下面的步骤来,你必定会成功快速的排查出问题缘由的;
一、 首先须要下载阿里开源的Arthas 的诊断工具 Jar 包,下载地址:arthas-boot.jar ;而后将 Jar 包放到 部署服务接口项目的服务器中 。
二、 而后使用 ps 命令,查询出当前运行服务接口的程序进程号;例如:本文章模拟的服务接口程序 Jar 包名称为 springboot_arthas-1.0.0.jar ,因此命令为: ps -ef | grep springboot_arthas-1.0.0 。
三、 而后运行Arthas 诊断工具,命令:java -jar arthas-boot.jar ;开始运行的界面如图:
此时诊断工具尚未运行完,须要手动选择要诊断/监控的java 进程,而且此工具也会列出所有的java进程号,你只须要输入 它们最前的序号 [1] 便可;如图:
四、 运行完后,就能够使用 trace命令 统计服务接口方法调用链路上的所有节点的耗时;
trace
命令能主动搜索class-pattern
/method-pattern
对应的方法调用路径,渲染和统计整个调用链路上的全部性能开销和追踪调用链路。具体命令格式: trace [全限定类名] [类中的方法名]
例如:统计的本服务接口:
com.lyl.controller.TestController : 全限定类名
process:TestController 类中的方法;
具体命令: trace com.lyl.controller.TestController process
五、 trace 命令执行结果展现,如图:
经过trace 命令监控统计的调用链路各个方法的执行耗时,能够发现调用的 com.lyl.util.StringUtil 类中的 test2() 方法执行耗时比较大;
因此须要特别去查看这个方法的代码是否存在问题;
若是这个代码中还存在许多的方法调用链路,则须要再次使用 trace 命令进行监控调用链路的耗时,找出具体可能存在问题的方法。
Arthas 阿里开源的诊断工具还提供了不少的命令供使用,你们能够自行去查看学习,地址:命令列表 。
注意:
①、使用Arthas 诊断的程序代码,在打包时 不能混淆 ,不然在使用trace 命令会报 类或方法找不到 ;
②、在使用trace命令监控统计时,须要JMeter测试脚本正在运行调用服务接口,若是服务接口没有正在调用中,则统计不到内部调用链路的耗时状况;
❤ 点赞 + 评论 + 转发 哟
若是本文对您有帮助的话,请挥动下您爱发财的小手点下赞呀,您的支持就是我不断创做的动力,谢谢!
您还能够VX搜索【木子雷】公众号,坚持高质量原创java技术文章,福利多多哟!