【脚本分享】linux cpu使用率高诊断用

脚本用途:
linux JVM进程使用很高时,可以使用该脚本一键获取jvm进程top线程占用的CPU情况,协助定位问题代码。

su - service
#java的进程号(必须修改)
pid=254
#按线程cpu使用量降序排列,取top,默认10(按需修改)
topcpun=10
#按线程数量降序排列,取top,默认10(按需修改)
topnum=10
mydate=$(date +%s);

#jstack命令的绝对路径
cmd=$(ls -l /proc/$pid/exe | awk '{print $NF}' | sed 's/java$/jstack/')
#获取JVM线程堆栈
$cmd $pid > /tmp/threaddump_$mydate;

#获取使用CPU最高top 10线程
top -b -Hp $pid -n 1 -d 1 | awk '$1~/[0-9]+$/{print}' | awk 'BEGIN{ORS=" "}{print $9;printf "0x%x\n", $1}' | sort -rnk 1 | uniq -f 1 | head -n $topcpun > /tmp/topcputhread_$mydate;awk -v fname=/tmp/threaddump_$mydate -v topcpun=$topcpun 'BEGIN{ORS="";print "\n========1.TOP "topcpun" thread(cpu)============\n";print "cpu%\tTID\tThreadName\n"}{print $1"\t"$2"\t";system("grep nid="$2 " "fname" |sed 's/#.*$//'")}' /tmp/topcputhread_$mydate;

#获取指定线程的堆栈详细信息(trace details)
awk 'BEGIN{print "\n=======================trace details=======================\n"}';awk '{print $2}' /tmp/topcputhread_$mydate | xargs -I v1 awk '/nid=v1/,/^$/ {print}' /tmp/threaddump_$mydate;

#按线程数量降序排列,取top,默认10
awk -v topnum=$topnum 'BEGIN{print "\n=======================2.TOP "topnum" thread(count)=======================\n";printf("%-50s\t%10s\n","ThreadName","Count")}' ;awk '/nid=0x/ {ary[$1]++}END{for (i in ary) {printf("%-50s\t%10d\n",i,ary[i])}}' /tmp/threaddump_$mydate |sort -rnk 2 | head -$topnum | tee /tmp/topnumthread_$mydate;

你可能感兴趣的:(高效工具类,linux,jvm,java)