线上服务占用cpu过多问题定位

  • 线上服务占用cpu过多问题定位已关闭评论
  • 115,091 views
  • A+
所属分类:系统运维 编程开发

 

 

 

场景

某互联网支撑大并发并且合理的利用资源,一台服务器部署n个tomocat的java微服务是很正常的,但是往往就有实例cpu负载高导致异常报警,当然,最简单的方法就是扩容,但是这样往往解决不了实质性的问题,那么我们怎么排查此类问题呢,我这里举例说明

步骤一、找到最耗CPU的进程

工具:top

方法

  • 执行top -c ,显示进程运行信息列表
  • 键入P (大写p),进程按照CPU使用率排序

图示

线上服务占用cpu过多问题定位

如上图,最耗CPU的进程PID为878

 

步骤二:找到最耗CPU的线程

工具:top

方法

  • top -Hp 878 ,显示一个进程的线程运行信息列表
  • 键入P (大写p),线程按照CPU使用率排序

图示

线上服务占用cpu过多问题定位

如上图,进程878内,最耗CPU的线程PID为883

 

步骤三:将线程PID转化为16进制

工具:printf

方法:printf “%x\n” 883

图示

线上服务占用cpu过多问题定位

如上图,883对应的16进制是0x373,当然,这一步可以用计算器。

 

之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。

 

步骤四:查看堆栈,找到线程在干嘛

工具:pstack/jstack/grep

方法:jstack 10765 | grep ‘0x373’ -C5 --color

  • 打印进程堆栈
  • 通过线程id,过滤得到线程堆栈

图示

线上服务占用cpu过多问题定位

如上图,找到了耗CPU高的线程对应的线程名称“Server-1”,以及看到了该线程正在执行代码的堆栈。

步骤五:有时四不一定能出来结果,如线程调用,那我们就直接jstack写到文件

工具:jstack

方法:jstack -l 878> 878.stack

  • 打印进程堆栈
  • 通过线程id,到878.stack

线上服务占用cpu过多问题定位

希望对经常进行线上CPU问题排查的同学有帮助,如果有更好的实践,也欢迎分享。

  • 安卓客户端下载
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar