- A+
所属分类:未分类
场景
某互联网支撑大并发并且合理的利用资源,一台服务器部署n个tomocat的java微服务是很正常的,但是往往就有实例cpu负载高导致异常报警,当然,最简单的方法就是扩容,但是这样往往解决不了实质性的问题,那么我们怎么排查此类问题呢,我这里举例说明
步骤一、找到最耗CPU的进程
工具:top
方法:
- 执行top -c ,显示进程运行信息列表
- 键入P (大写p),进程按照CPU使用率排序
图示:
如上图,最耗CPU的进程PID为878
步骤二:找到最耗CPU的线程
工具:top
方法:
- top -Hp 878 ,显示一个进程的线程运行信息列表
- 键入P (大写p),线程按照CPU使用率排序
图示:
如上图,进程878内,最耗CPU的线程PID为883
步骤三:将线程PID转化为16进制
工具:printf
方法:printf “%x\n” 883
图示:
如上图,883对应的16进制是0x373,当然,这一步可以用计算器。
之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。
步骤四:查看堆栈,找到线程在干嘛
工具:pstack/jstack/grep
方法:jstack 10765 | grep ‘0x373’ -C5 --color
- 打印进程堆栈
- 通过线程id,过滤得到线程堆栈
图示:
如上图,找到了耗CPU高的线程对应的线程名称“Server-1”,以及看到了该线程正在执行代码的堆栈。
步骤五:有时四不一定能出来结果,如线程调用,那我们就直接jstack写到文件
工具:jstack
方法:jstack -l 878> 878.stack
- 打印进程堆栈
- 通过线程id,到878.stack
希望对经常进行线上CPU问题排查的同学有帮助,如果有更好的实践,也欢迎分享。
- 安卓客户端下载
- 微信扫一扫
- 微信公众号
- 微信公众号扫一扫