如何找到CPU飙升的原因

CPU飙升在日常系统运维过程中并不少见,本文将介绍如何快速找出Java应用CPU飙升的原因。在开始之前,我们想想,想要定位Java应用的CPU飙升的原因,我们需要知道哪些信息?以下是我的答案:

  • 首先,需要知道哪个进程占用CPU比较高,
  • 其次,需要知道占用CPU高的那个进程中的哪些线程占用CPU比较高,
  • 然后,需要知道这些线程的stack trace。

找出了CPU占用高的线程号和其stack trace并再结合应用日志基本上就可以找到问题根源。接下来,将介绍相应的工具来找到这些问题的答案。

首先,通过top和pgrep来查看系统中Java进程的CPU占用情况。命令如下:

top -p `pgrep -d , java`

其中pgrep是显示系统中java应用的进程号,top -p是只显示这些进程的信息。记录下CPU占用率最高的那个进程号。

其次,通过top来查看进程中CPU占用最高的那些线程,命令为:

top -Hp 12345

这里,假定12345为占用CPU高的进程号。-H是显示该进程中线程的CPU占用情况。同样,记录下CPU占用率高的那些线程号。

然后,通过jstack导出Java应用中线程的stack trace,命令如下:

jstack 12345

这里是最关键的一步,需要把第2步中的线程号和jstack输出结果中的线程号关联起来。因为top中显示的线程号是10进制,jstack的输出结果中的线程号是16进制,所以只需要把top中看到线程号转换成16进制,然后到jstack的输出结果中即可找到对应线程的stacktrace了。

小结一下,我们通过top和jstack来找到CPU占用高的线程的stack trace,其中最关键的是上述第3步中如何将top中观测到的线程号关联到jstack的输出的stack trace。

最后,祝大家的服务稳定运行!

如果对你有帮助,扫描关注我的公众号获得更多信息!
如何找到CPU飙升的原因_第1张图片

你可能感兴趣的:(编程开发)