使用堆栈进行问题排查,如机器占用 CPU 高问题排查、死锁
前言
运维经常会遇到 CPU 过高的情况。针对这种情况需要一定的处理机制
定位方法
传统的方案一般是4步
1 top oder by with P // 首先按进程负载排序找到 maxLoad(pid)
2 top -Hp 进程PID // 找到相关负载 线程PID
3 printf “0x%x ” 线程PID // 将线程PID转换为 16进制,为后面查找 jstack 日志做准备
4 jstack 进程PID | grep "0x6bd9" -C 50 | less // 将进程PID所在行的上下 50 行搜索出来
但是对于线上问题定位来说,分秒必争,上面的 4 步还是太繁琐耗时了
淘宝的 oldratlee 同学就将上面的流程封装为了一个工具:show-busy-java-threads.sh
该工具可以很方便的定位线上的这类问题
安装
这里选择下载和运行单个文件,其他方式可以参阅下载使用
1 | wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads |
使用
使用案例可以参阅下方几个链接了解
可以处理CPU过高、线程死锁导致程序 hang 住的情景
有时候基于经验判断后不太确定,可以多多执行几次show-busy-java-threads,如果情况高概率出现,则可以确定判定。
因为调用越少代码执行越快,则出现在线程栈的概率就越低。
脚本有自动多次执行的功能,指定 重复执行的间隔秒数/重复执行的次数 参数
扩展
除了正文提到的 show-busy-java-threads.sh,oldratlee 同学还整合和不少常见的开发、运维过程中涉及到的脚本工具
- show-duplicate-java-classes 找出jar文件和class目录中的重复类。用于排查Java类冲突问题
- find-in-jars 在目录下所有jar文件里,查找类或资源文件
参考链接2里也提到一些其他的工具,我暂未了解,因此不在叙述。
参考链接