一、定位问题
测试接口响应时间长,可能有以下几种问题:
- 代码质量差,jvm有大量blocked线程,可以通过jstack -pid查看。
- 接口逻辑链路复杂,需要调用很多关联应用。这个时候需要打开日志,观察各个关联应用的调用返回时间。
- 参数异常,正常应该传3天的时间段,结果传入1个月的时间段,在app上看是正常的,但是后台大量cpu被消耗在无意义的计算上。
- 使用中间件问题,用了不该用的工具,比如使用tair做排队,性能很差,换为redis就好很多。
- sql效率问题,mysql index问题。
二、定位代码
1. 查找最消耗cpu的线程
- 执行top
- shift + h,打开线程
- shift + p,按cpu使用率排列
- 查找最消耗cpu的进程pid
- jstack –pid > jvm.txt,将监控的jvm堆栈信息打印文件。
- 用计算器,将最消耗cpu的pid转换为16进制
- 在jvm.txt中查找此16进制数,一般情况下可以看到那些线程消耗了最多的cpu。
2. 查找存在阻塞的线程
在jvm.txt中查找“BLOCKED”关键字,可以查看那些线程有存在阻塞。