從cpu消耗到定位程式碼的剖析過程(送自動化分析腳本)

  • 2020 年 2 月 19 日
  • 筆記

當我們在執行性能測試過程中,會發現服務端的cpu會飆高,可能剛入門的性能測試小夥伴會直接找開發去定位了,其實這個過程我們測試也可自行完成,接下來我將自己寫一個實例去解析這個過程;我自己寫了一個java方法,打包成jar包,放到伺服器上,然後啟動,top觀察

我們看到了java進程號31600,通過進程號去分析執行緒,top -Hp 31600

看到佔用相對較高的執行緒號為31601,

通過我們的命令 jstack 31600|grep -A 20 7b71

這個過程也可以通過shell腳本實現

腳本如下:

!/bin/bash

if [ $# -eq 0 ];then

echo "please enter java pid"    exit -1

fi

pid=$1

jstack_cmd=""

if [[ $JAVA_HOME != "" ]]; then

jstack_cmd="$JAVA_HOME/bin/jstack"

else

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了,示例如下

Tags: