最近在提升软件性能,用到了Perf工具.网上有很多文章都在介绍,这里只简单记录使用历程.
一、软件必备
我们必须安装perf工具,可以通过yum方式进行安装:
yum install -y perf
使用perf通常和火焰图结合,有了火焰图就比较直观.火焰图用到另外一个软件,可从github中克隆出来
git clone https://github.com/brendangregg/FlameGraph.git
二、脚本
下面是我自己写的脚本,输入进程id或者进程名字用于统计,默认统计时间为45s, 将该脚本放到FlameGraph根目录下面
#!/bin/sh
if [ $# -eq 0 ]; then
echo "Error: please input proccess name or pid!!!"
echo "e.g"
echo " --> sh flame.sh [ProcessName|Pid] [Sleep Time]"
exit
fi
SCRIPT_NAME="$0"
PROC_NAME="$1"
SLEEP_TIME=$2
expr $PROC_NAME "+" 10 &> /dev/null
if [ $? -eq 0 ];then
pid=`expr $1 + 0`
else
num=`ps -ef | grep "${PROC_NAME}" | grep -v "${SCRIPT_NAME}" | grep -v "grep" | grep -v "bash" | wc -l`
if [ $num -eq 0 ]; then
echo "Error: not found process: ${PROC_NAME}."
exit
fi
if [ $num -gt 1 ]; then
echo "Error: found too many processes."
exit
fi
pid=`ps x | grep "${PROC_NAME}" | grep -v "${SCRIPT_NAME}" | grep -v "grep" | grep -v "bash" | awk '{print $1}'`
fi
if [ "x$SLEEP_TIME" == "x" ]; then
SLEEP_TIME=45
fi
perf record -F 99 -p $pid -g -- sleep $SLEEP_TIME
perf script -i perf.data &> perf.unfold
./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded
./FlameGraph/flamegraph.pl perf.folded > perf.svg
利用火焰图,能够比较清晰的看出堆栈信息以及时间占用情况.
三、通过命令方式(高级模式)
火焰图是比较直观的方式,通常能够解决大部分问题,但是如果想看指令级别(汇编),就需要通过命令方式.常用命令:
perf report -i perf.data
最终显示界面如下:
进入上图后经常使用的命令:
命令 | 描述 |
? | 查看帮助 |
up/down (上/下键) | 查看函数内部信息 |
a | 选中某个函数,查看汇编信息 |
四、JAVA程序火焰图使用方法
Java程序也是可以通过火焰图进行定位,具体使用方法可参考: 使用火焰图做性能分析