当我们在执行性能测试过程中,会发现服务端的cpu会飙高,可能刚入门的性能测试小伙伴会直接找开发去定位了,其实这个过程我们测试也可自行完成,接下来我将自己写一个实例去解析这个过程;我自己写了一个java方法,打包成jar包,放到服务器上,然后启动,top观察
我们看到了java进程号31600,通过进程号去分析线程,top -Hp 31600
看到占用相对较高的线程号为31601,
通过我们的命令 jstack 31600|grep -A 20 7b71
这个过程也可以通过shell脚本实现
脚本如下:
!/bin/bash
if [ $# -eq 0 ];then
代码语言:javascript复制echo "please enter java pid"
exit -1
fi
pid=$1
jstack_cmd=""
if [[ $JAVA_HOME != "" ]]; then
代码语言:javascript复制jstack_cmd="$JAVA_HOME/bin/jstack"
else
代码语言:javascript复制r=`which jstack 2>/dev/null`
if [[ $r != "" ]]; then
jstack_cmd=$r
else
echo "can not find jstack"
exit -2
fi
fi
line=top -H -o %CPU -b -n 1 -p $pid | sed '1,/^$/d' | grep -v $pid | awk 'NR==2'
line=top -H -b -n 1 -p $pid | sed '1,/^$/d' | sed '1d;/^$/d' | grep -v $pid | sort -nrk9 | head -1
echo "$line" | awk '{print "tid: "$1," cpu: %"$9}'
tid_0x=printf "%0x" $(echo "$line" | awk '{print $1}')
$jstack_cmd $pid | grep $tid_0x -A20 | sed -n '1,/^$/p'
将上述的shell编辑成test.sh,再更改下文件可执行权限就ok了,示例如下