一、背景
最近测试反馈测试环境接口偶现有访问超时,然后APP提示是网络失败,看了一下测试环境的应用完全没啥问题,一直以为是网络问题。
今天测试有反馈了,赶紧看了一下测试服务器,这次终于有症状了,CPU直接飙到300%了。
尽然问题复现了,直接开干,定位问题
二、解决思路
1、定位问题应用进程
使用top命令,然后按照CPU排序,如下图所示,进程PID为13258的Java应用占用300%的CPU资源。
Java应用造成CPU高的主要原因一般是线程一直处于可运行(Runnable)状态,通常这些线程在执行无阻塞操作、循环、正则或纯粹的计算等任务,
另一个可能造成CPU高的原因是频繁GC
所以现在进程的线程情况
2、查看进程中线程使用情况
使用命令 top -H -p 查看如下图:
#-H:所有线程占用资源情况。
#-p<进程号>:指定进程;
top -H -p 13258
发现有三个线程实时CPU占用率较高,并且处理器使用时间非常长,25438线程实际占有处理器的时间甚至达到190分钟。
现在问题已经找到了,就是这三个线程持续占用CPU资源,下面我们再具体看一下这个线程再干嘛
3、查看线程的快照
通过jstack 命令查看线程14689的快照
jstack 13258 |grep "3961" -A 30
jstack后面的参数是PID的值,3961是线程id 14689 的十六进制。
可以通过以下命令把线程id转成16进制
printf "%x\n" 14689
通过观察输出,可以看到线程长期处于可运行状态,直接根据堆栈信息找到对应的代码。
4、最后
找到对应代码修改后基本就解决问题了