BCOS区块链性能分析工具的安装和使用perf+火焰图

安装Perf

perf的全称是Performance Event,在2.6.31版本后的Linux内核中均有集成,是Linux自带的强力性能分析工具,使用现代处理器中的特殊硬件PMU(Performance Monitor Unit,性能监视单元)和内核性能计数器统计性能数据。
perf的工作方式是对运行中的进程按一定频率进行中断采样,获取当前执行的函数名及调用栈。如果大部分的采样点都落在同一个函数上,则表明该函数执行的时间较长或该函数被频繁调用,可能存在性能问题。
1、终端输入perf,根据提示进行安装
在这里插入图片描述
2、输入perf得到 usage: perf [–version] [–help] [OPTIONS] COMMAND [ARGS]…
表示安装成功
在这里插入图片描述
安装完成后,开始正式使用perf工具。
1、使用perf需要首先对目标进程进行采样:
$ sudo perf record -F 1000 -p pidof fisco-bcos -g – sleep 60
在上述命令中, 我们使用perf record指定记录性能的统计数据;使用-F指定采样的频率为1000Hz,即一秒钟采样1000次;使用-p指定要采样的进程ID(既fisco-bcos的进程ID),我们可以直接通过pidof命令得到;使用-g表示记录调用栈信息;使用sleep指定采样持续时间为60秒。
可能出现的错误:Workload failed: No such file or directory
在这里插入图片描述
解决方法:
在终端输入ps查看当前进程的快照状态
在这里插入图片描述
重新数入命令行,将pidof fisco-bcos改为需要采样的进程ID
sudo perf record -F 10000 -p 4569 -g – sleep 60
输出为:
在这里插入图片描述
待采样完成后,perf会将采集到的性能数据写入当前目录下的perf.data文件中。
Ps:我在采样前创建了perf文件夹,在里面执行了采集命令,所以我的采集数据会在perf文件夹下。
在这里插入图片描述
2、在采样数据的文件夹下执行$ perf report -n
上述命令会读取perf.data并统计每个调用栈的百分比,且按照从高到低的顺序排列,如下图所示:
在这里插入图片描述
可能出现的问题:
failed to open perf.data: Permission denied
解决方法:
sudo perf report -n

以上信息已足够丰富,但可读性仍然不太友好。尽管示例中perf的用法较为简单,但实际上perf能做的远不止于此。配合其他工具,perf采样出的数据能够以更加直观清晰的方式展现在我们面前,这便是我们接下来要介绍的性能分析神器——火焰图。

火焰图

火焰图,即Flame Graph,藉由系统性能大牛 Brendan Gregg提出的动态追踪技术而发扬光大,主要用于将性能分析工具生成的数据进行可视化处理,方便开发人员一眼就能定位到性能问题所在。火焰图的使用较为简单,我们仅需将一系列工具从github上下载下来,置于本地任一目录即可:
wget https://github.com/brendangregg/FlameGraph/archive/master.zip
unzip master.zip
在这里插入图片描述

CPU火焰图

当我们发现FISCO BCOS性能较低时,直觉上会想弄清楚到底是哪一部分的代码拖慢了整体速度,CPU是我们的首要考察对象。
首先使用perf对FISCO BCOS进程进行性能采样:(上面已经讲述过)
1.cd FlameGraph-master/
2.sudo perf record -F 10000 -p 4569 -g – sleep 60
执行完毕生成perf.data文件
在这里插入图片描述

对采样数据文件进行解析生成堆栈信息

sudo perf script > cpu.unfold
会生成cpu.unfold文件
中间有报错,不知道什么原因,我暂时忽略了。
Failed to open /home/hehongyu/fisco/nodes/127.0.0.1/fisco-bcos, continuing without symbols
在这里插入图片描述
生成了采样数据文件后,接下来调用火焰图工具生成火焰图:

对perf.unfold进行符号折叠

sudo ./stackcollapse-perf.pl cpu.unfold > cpu.folded
生成 cpu.folded文件
在这里插入图片描述

生成SVG格式的火焰图

sudo ./flamegraph.pl cpu.folded > cpu.svg
在这里插入图片描述

纵轴表示调用栈。每一层都是一个函数,也是其上一层的父函数,最顶部就是采样时正在执行的函数,调用栈越深,火焰就越高。
横轴表示抽样数。注意,并不是表示执行时间。若一个函数的宽度越宽,则表示它被抽到的次数越多,所有调用栈会在汇总后,按字母序列排列在横轴上。
火焰图使用了SVG格式,可交互性大大提高。在浏览器中打开时,火焰的每一层都会标注函数名,当鼠标悬浮其上,会显示完整的函数名、被抽样次数和占总抽样字数的百分比,如上图。

你可能感兴趣的:(区块链学习之路,区块链,软件测试)