Linux环境下寻找java进程消耗cpu过高的原因

前言

实际开发与维护java项目的时候,经常会遇上cpu消耗过多的情况,导致接口响应迟缓。造成cpu过高的原因很多,比如线程互相等待,线程死锁,网络带宽跟不上等等。本文将通过jdk自带的工具jstack查询日志定位原因。

操作步骤

查找java进程

通过top命令查询消耗cpu最高的java进程,然后shitf+p 倒序,如图:

user表示该进程的所属用户,在后续的jstack中需要用到。

根据进程号查询cpu利用率最高的线程号

在终端执行 top -H -p <pid>,查询pid进程下的所有线程消耗cpu的情况,然后shift+p倒序找到消耗cpu最高的线程id,如图:

线程id转换

日志文件中线程id是采用16进制的,所以要将查询出来的10进制线程id转换成16进制,数字转换的方式有很多中,在这里通过linux命令printf转换,如下:

使用jstack下载堆栈信息

使用jstack下载堆栈信息日志文件,sudo -u appadmin jstack 179258 >/usr/local/test2.txt,如下:

因为当前用户是root,而非179258进程所属用户appadmin,因此需要切换用户。然后根据进程id将对应的日志重定向到某个目录下,当然也可以在线查找 sudo -u appadmin jstack <进程id> | grep -a <16进制线程id>.

查找日志

生成的日志文件位于linux上,可以通过sz下载到windows下进行查找,根据上文转成16进制的线程id进行全局搜索,就能定位到具体的原因,如图:

总结

根据以上步骤能快速找到问题所在,但是这个日志文件的分析是需要经验积累的,只有当出现诸如线程死锁的情况下,会出现很明显的日志,deadLock关键字样,并且能提示出现问题的代码所在行。其他问题如网络带宽,文件io等硬件资源跟不上的原因导致,是需要有一定的经验积累才能发现的,最后希望各位小伙伴都能百尺竿头更进一步!

猜你喜欢

转载自blog.csdn.net/tianmlin1/article/details/87900511