问题:公司一个系统在测试单个功能登录上,并发才5个用户时,CPU使用率就瞬间飙升到100%
排查过程:
1、首先查看系统资源占用信息,使用top命令,查看那个进程占用CPU高
发现正在运行的JAVA项目CPU占用率很高,百分之364.2了,那么问题一定出在这个程序中
2、通过 top -H -p pid 找到导致cpu高的线程
备注:也可以通过Ps -mp pid -o THREAD,tid,time查看
在这里可能会出现三种情况:
- 第一种情况,某个线程一直CPU利用率100%,则说明是这个线程有可能有死循环,那么请记住这个PID。
- 第二种情况,某个线程一直在TOP十的位置,这说明这个线程可能有性能问题。
- 第三种情况,CPU利用率TOP几的线程在不停变化,说明并不是由某一个线程导致CPU偏高。
如果是第一种情况,也有可能是GC造成,我们可以用jstat命令看下GC情况,看看是不是因为持久代或年老代满了,产生Full GC,导致CPU利用率持续飙高,命令如下。
[test@iZ8vb8rrw7wiwqwx22tcsrZ log]$ jstat -gcutil 377 1000 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 26.33 11.63 11.99 97.36 93.41 63 2.600 5 2.399 4.998
0.00 26.33 25.30 11.99 97.36 93.41 63 2.600 5 2.399 4.998
0.00 26.33 40.19 11.99 97.36 93.41 63 2.600 5 2.399 4.998
0.00 26.33 53.16 11.99 97.36 93.41 63 2.600 5 2.399 4.998
0.00 26.33 65.35 11.99 97.36 93.41 63 2.600 5 2.399 4.998
3、定位线程具体问题,将TID转换成16进制,通过printf '0x%x' tid
命令,因为线程堆栈情况记录的是线程的16进制id:
[test@iZ8vb8rrw7wiwqwx22tcsrZ log]$ /usr/bin/printf '0%x\n' 12095
02f3f
4、jstack pid | grep tid
找到线程堆栈
jstack 11572 | grep 02f3f -A 30
分析:
(1)查看下TCP连接状态
[test@iZ8vb8rrw7wiwqwx22tcsrZ log]$ netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
1 established)
1 Foreign
7 LISTEN
111 ESTABLISHED
(2)用jstack dump看看这些线程都在做什么
也可以将线程dump出来,看看究竟是哪个线程,执行什么代码造成的CPU利用率高。执行以下命令,把线程dump到文件dump01里。
jstack 11572 > dump01
(3)统计下所有线程分别处于什么状态
[test@iZ8 ~]$ grep java.lang.Thread.State dump01 | awk '{print $2$3$4$5}' | sort | uniq -c
8 RUNNABLE
26 TIMED_WAITING(onobjectmonitor)
40 TIMED_WAITING(parking)
4 WAITING(onobjectmonitor)
52 WAITING(parking)
(4)查看处于WAITING(parking)的线程信息
后续待定。。。。。
- 查看Java线程数 ps -eLf | grep java -c