论坛首页 Java企业应用论坛

通过top和jstack确定哪些线程耗尽了CPU?这些线程在做什么?

浏览 11830 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-10-18  

1. 背景

有时,线上集群load会突然飙升,无法响应正常请求。

那么引起load飙升的线程究竟在做什么?哪些线程霸占了CPU?可以通过top和jstack命令进行定位。

 

2. 定位步骤

1. 使用终端1进入目标机器,执行top命令,默认是进程视图,其中PID是进程号,截图如下:


 

在这里,我们只能看到java进程占用CPU达到115%,那么究竟是那些线程非常耗CPU呢?

2. 由于我们要看到线程,在终端1,按下“H”键或者“shift+h”,top视图会切换到线程视图,其中PID是线程号,截图如下:


 

可以发现红框内的线程的CPU使用率非常高,占用CPU时间达到1秒左右,显然不正常,但是这些线程在做什么?

3. 

  1. 打开终端2,使用jstack命令输出这一时刻的线程栈,保存到文件,命名为jstack.log。注意:输出线程栈和保存top命令快照尽量同时进行。
  2. 4. 由于jstack.log文件记录的线程ID是16进制,需要将top命令展示的线程号转换为16进制,以15100为例,在linux下输入命令:printf 0x%x 15100,得到15100的十六进制为0x3afc
  3. 5. 在jstack.log中搜索0x3afc关键字,可以清晰看到该线程在做刷新地址列表,如下图:
  4.  

3. 总结

以前碰到集群load飙升时,有时会束手无策,不知从何查起。以后再发生类似问题时,可以使用这个方法,看下究竟是那些线程在长时间占用CPU,尽快定位问题和解决问题。

 

  • 大小: 141.3 KB
  • 大小: 117.5 KB
  • 大小: 167 KB
   发表时间:2013-10-18  
同学,把公司的东西拿出来分享可是很危险的哦~
0 请登录后投票
   发表时间:2013-10-19  
江城明月再战江湖 写道
同学,把公司的东西拿出来分享可是很危险的哦~

谢谢提醒,稍等我把一些关键信息隐掉
0 请登录后投票
   发表时间:2013-10-20  
不错, up
0 请登录后投票
   发表时间:2013-10-23  
淘宝的~~~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics