0%

Linux 用户态 CPU 使用率高

使用堆栈进行问题排查,如机器占用 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
2
3
4
wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads
chmod +x show-busy-java-threads

./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里也提到一些其他的工具,我暂未了解,因此不在叙述。


参考链接