收到服务器报警,服务端的一个java服务占用cpu200%多。该服务里面跑了很多线程,于是想找到是谁引起的
1、首先dump出该进程的所有线程及状态
使用命令 jstack PID 命令打印出CPU占用过高进程的线程栈.
jstack -l 5683 > 5683.stack
将进程id为5683的线程栈输出到了文件
2、使用top命令找到耗cpu的线程
使用top -H -p PID 命令查看对应进程是哪个线程占用CPU过高.
[goocar@LoginSVR ~]$ top -H -p 5683 top - 09:14:06 up 270 days, 18:33, 8 users, load average: 7.94, 9.70, 10.31 Tasks: 48 total, 2 running, 46 sleeping, 0 stopped, 0 zombie Cpu(s): 20.4% us, 30.5% sy, 0.0% ni, 43.8% id, 5.4% wa, 0.0% hi, 0.0% si Mem: 16625616k total, 16498560k used, 127056k free, 22020k buffers Swap: 16771820k total, 9362112k used, 7409708k free, 2224132k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5728 ecar 16 0 2442m 1.3g 288m R 38.3 8.4 208:06.62 java 5726 ecar 16 0 2442m 1.3g 288m S 37.3 8.4 209:08.91 java 5727 ecar 16 0 2442m 1.3g 288m R 37.3 8.4 213:14.04 java 5729 ecar 16 0 2442m 1.3g 288m S 35.6 8.4 211:39.23 java 5683 ecar 16 0 2442m 1.3g 288m S 0.0 8.4 0:00.00 java 5685 ecar 18 0 2442m 1.3g 288m S 0.0 8.4 0:01.62 java 5686 ecar 16 0 2442m 1.3g 288m S 0.0 8.4 21:13.33 java
可以看到是 5726 ~ 5729这4个线程占用的cpu比较高
3. 将线程的pid 转成16进制,比如5729 = 0x1661
到第一步dump出来的 5683.stack 里面找0x1661 就知道是哪个线程了
"Server-3" prio=10 tid=0x6f1fc000 nid=0x1661 runnable [0x6d67f000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.FileDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:104)
at sun.nio.ch.IOUtil.write(IOUtil.java:60)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334)
- locked <0x77f3b3c0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
经过查找,是服务线程比较忙,初步解决方法,就是加大服务线程数,重启,问题解决。