(补充说明:其实top看不出来是哪个进程,是因为自己水平菜,用top -H或者top进去后,输入H就可以根据线程来查看,这样就能发现cpu占用高的线程了)
今天发现一台机器cpu跑高了,第一时间用top查看
top.png
并没有发现占用cpu高的进程,但是cpu使用的确很高。
使用另外一个命令htop
htop.png
使用htop发现是一个pid为32442的进程占用了100%的cpu,按后面的运行参数,并根据自身的业务,可以判断这是一个业务进程的其中一个线程。
使用ps命令查看业务进程pid,查出来是31519
先计算线程的16进制的值
printf "%x\n" 32442
7eba
然后用jstack pid将堆栈信息打印出来
jstack 31519 | grep 74ba -B 15 -A 15
堆栈信息打印出来后,就交给开发来处理了。
注:
使用jstack的时候报了个错,
Unable to open socket file: target process not responding or HotSpot VM not loaded
原因如下:
jvm运行时会生成一个目录hsperfdata_$USER($USER是启动java进程的用户),在linux中默认是/tmp,目录下会有些pid文件,存放jvm进程信息,而jmap,jstack等工具会读取/tmp/hsperfdata_$USER下的pid文件获取连接信息。所以需要运行这个jvm的用户来执行jstack命令
我这边使用tomcat用户来运行的,所以需要切换到tomcat用户来执行jstack即可
网友评论