CPU负载占用过高,该如何排查问题呢?

快过年了,最后两天的工作量相对来说少了很多,于是抽空学了一下Linux相关的基础命令。

才子白问:学了啥子东西,分享一下呗!

成子:学了基础的Linux命令,跟你分享,你听得懂嘛?

才子白:那我考考你,假如你发现测试服务器一个java进程cpu负载占用很高,如何用命令去排查具体是哪行代码引起的呢?

成子怯生生的问了一句:我可以百度吗?

  • 1、首先查看系统资源占用信息,top看一下

top命令下按数字1,就可以看到CPU的核数,如果发现CPU占用率很高的,那么问题肯定出在这个程序中(据某人说,按数字1的话,电脑会爆炸喔!)

  • 然后通过ps -mp pid -o THREAD,tid,time命令,来查看这个程序的线程信息、tid代码线程ID以及线程已经运行的时间。

但是发现,使用用户为root权限的PID的时候,运行ps -mp命令的话,数据并不会出来,只出现表头。于是,使用service用户的PID:

然后,我们又发现了一个问题,cpu都是为0的,压根没有任何一点起伏。

扫描二维码关注公众号,回复: 12473575 查看本文章

故而,我们用了一个简化版的命令:top -H -p 599,通过这个命令,看到的都是599进程下面的线程

将排在第一位的pid当作tid,也就是printf "%x\n" 1423,这个操作是把八进制的语言转换为十六进制的,方便下面在jstack进行查找。

  • jstack查看进程信息:可以用jstack pid |  grep xxx -A 10

这里的话,即jstack 599 | grep 599 -A 10(这里有个值得注意的地方就是,假如你最开始是root权限,运行这条命令的之前,需要用su service命令来切换用户)

好了,以上的操作就可以解答才子白的问题了。

假如工作中出现了cpu占用高的进程(表象一般都是请求服务超时),你们就可以用这个方法尝试去定位下,当然,如果你有代码权限,还可以看着是哪行代码,直接截图丢给开发。开发会觉得你很专业。不过,还是给开发留点面子吧,到这一步的话,就可以的啦。

猜你喜欢

转载自blog.csdn.net/weixin_39456575/article/details/113780635