压测中,服务器CPU过高,异常线程排查
场景:压测JAVA项目时,JAVA进程CPU使用率过高,可通过以下方法排查异常线程
在Java应用的性能测试中,很多性能问题可以通过观察线程堆栈来发现,Jstack是JVM自带dump线程堆栈的工具,很轻量易用,并且执行时不会对性能造成很大的影响。灵活的使用jstack可以发现很多隐秘的性能问题,是定位问题不可多得的好帮手。
第一种方法:
1、top #定位异常的进程
(1)、通过top命令看到1817这个进程占用cpu最高
(2)、使用jstack命令,将进程1817的日志导出,jstack -l 1817>1817.txt
2、top -H -p 1817 #查看进程pid得所有线程
(1)、通过上述命令我们可以看到1817进程的所有线程中,1833这个线程cpu占用率最高
(2)、通过 printf "%x" 1833,可以将1833线程的pid转换成16进制
3、通过1833转换成的16进制 729到步骤1导出的txt里搜索到异常的线程
第二种方法:
top #定位异常的JAVA进程PID
jstack -l pid >/root/test.log #将该进程的日志信息写入root目录的test.log文件里
然后在test.log里搜索是否含有"deadlock"(死锁)
线程状态介绍
-
死锁,Deadlock(重点关注) :一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
- 等待资源,Waiting on condition(重点关注) :等待资源,或等待某个条件的发生。
- 等待获取监视器,Waiting on monitor entry(重点关注)