前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从cpu消耗到定位代码的剖析过程(送自动化分析脚本)

从cpu消耗到定位代码的剖析过程(送自动化分析脚本)

作者头像
周辰晨
发布2020-02-19 10:26:17
3400
发布2020-02-19 10:26:17
举报

当我们在执行性能测试过程中,会发现服务端的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了,示例如下

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师影响力 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • !/bin/bash
  • line=top -H -o %CPU -b -n 1 -p $pid | sed '1,/^$/d' | grep -v $pid | awk 'NR==2'
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档