可能同学经常会遇到生产环境下的某台跑Java的服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高或负载飙高等现象,好一点的负载或CPU一天比一天高,差的情况,就是随机进行抖动,后又恢复正常,给运维及开发同学带来了不少困扰。当然,出现此问题时,后续要如何改进,诸如:代码上线前要进行review、相关强弱依赖服务隔离/降级等、单元测试、回归测试、SQL上线审核、基础及业务监控、相关流程制度等。
若CPU使用率或负载飙高,且持续时间较长,网上也有大量的排查步骤
方法一
1.使用top定位占用CPU高的进程PID
top
2.获取线程信息
ps -mp PID -o THREAD,tid,time | sort -rn
3.将需要的线程ID转换为16进制格式
printf "%x\n" tid
4.打印线程的堆栈信息
jstack pid |grep tid #这里的tid就是步骤3生成的 十六进制格式的tid
方法二(推荐)
可快速定位thread及thread的cpu使用率#!/bin/bash
[email protected]
# Find out the most cpu consumed threads of java,and print the stack trace of these threads.
#
[email protected]
# $./javacpu -h
#
PROG=`basename $0`
usage(){
cat <<