背景
由于最近上线业务经常接收到CPU过高的警告,影响了服务的正常运行,于是就想着排查一下。但是按照一般的流程:
1.jps 查看java进程。
2.top -Hp java进程ID获取到线程ID。
3.打印出线程ID的16进制值。
4.jstack java进程ID | grep 线程ID的16进制值。
这一系列操作,必定费时一定时间,等我敲完命令之后都不一定我这个线程还存在,所以就搞了一个shell脚本,手动执行一下。
脚本
#!/bin/bash
javaId=`pgrep java`
echo "java 进程ID为 $javaId"
topJavaId=`top -b -n 1 -Hp ${javaId}|grep java|head -n 1|awk '{print $1}'`
cpuUsage=`top -b -n 1 -Hp ${javaId}|grep java|head -n 1|awk '{print $9}'`
echo "最耗cpu的使用率为 $cpuUsage"
topJavaId16=`printf "%x" ${topJavaId}`
topJavaId16ThreadName="nid=0x${topJavaId16}"
echo "最耗cpu的java线程ID 16进制为 $topJavaId16ThreadName"
threadDetail=`jstack ${javaId}|grep ${topJavaId16} -C 10`
echo "$threadDetail"
实战结果
可以很清楚的看出占用CPU过高的是那些应用,然后进行一些优化即可。