简介
上周碰到一个Java进程占用CPU较高的例子, 通过查询资料查出问题所在并对几个linux命令,以及命令之间的配合使用更加了解。
问题描述
一个基于Springboot的Web服务启动之后CPU占比一直居高不下,对于我们这个服务在启动时由于需要进行数据加载,CPU占比肯定会较高,但是数据加载完成后CPU占比仍然没有掉下来,另外查看该服务没有任何调用,就让人比较疑惑。
问题查看
通过使用linux命令top和ps可以定位到该服务的进程id(pid),通过jstack和pid可以打印进程的堆栈信息,但是不知道怎么来定位这个问题。另外判断出代码中应该哪里存在死循环,但是时间上不允许去一行一行的检查代码。
查看资料发现有很多人都遇到了这种类型的问题,我在这里找到的答案:线上应用故障排查之一:高CPU占用 。
根据博客中的方法我很快定位到出现问题的线程,找到了那段出现死循环的代码,修复之后问题得以解决。
解决步骤
通过那篇博客才知道自己使用的top, ps和jstack命令并没有真正使用好,之前只知道定位到进程,但是对于线程却不知道如何处理,随后又去翻了一下top和ps的man文档,算是再一次认识到这两个命令的强大。
其实我们这个CPU占用较高的问题定位并不复杂,主要步骤总结如下:
-
定位进程
通过top可以定位到服务的pid;或者通过ps 和grep直接定义服务的pid
-
定位线程
通过ps -mp [pid] -o THREAD,tid,time 可以定位到CPU高的线程,其中tid是线程id
-
打印堆栈信息
由于jstack中堆栈信息线程是十六进制,将tid转换为十六进制, tid_x=printf “%x” [tid]
然后再使用jstack [pid] | grep “tid=0x[tid_x]” 定位到具体线程。
-
查可能出现死循环的代码
定位到线程后就可以找到对应的class,然后仔细分析可能出现死循环的代码,问题基本就解决了。
总结
针对那些使用的比较频繁的linux命令还是要仔细的阅读下man文档,做到对该命令的能力更加了解,才能再遇到问题时做好命令之间的配合使用,快速解决问题。
友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen**)