Linux性能分析工具与图形化方法

在项目开发中,经常会遇到程序启动时间过长、CPU使用率过高等问题,这个时候需要依靠性能分析工具来定位性能的消耗点 。本文介绍三个常用的工具的入门级使用及图形化方法,供大家参考 。
本文介绍perf、gprof和valgrind三个性能分析工具,及其分析结果图形化的方法,旨在让大家更快的上手使用工具 。出于篇幅的限制,本文不会对每种工具的使用参数及结果分析做详细的介绍,只做入门级的使用说明 。
每个工具的介绍会分成简介、使用说明、图形化方法三个部分 。
每种工具的结果都会基于下面这段代码:
#include <unistd.h>using namespace std;#define NUM 500000void init(int* int_array){ for(int i=0;i<NUM;i++){int_array[i]=i; }}void accu(int* int_array,long& sum ){ for(int i=0;i<NUM;i++){sum+=int_array[i];usleep(3); } }int main(){ int int_array[NUM]; init(int_array); long sum=0; accu(int_array,sum);}这段代码在V615机器上执行了31s,最大CPU使用率为8.3%(top结果)
一、Perf1.1 简介Perf是内置于linux内核源码树中的性能剖析(profiling)工具 。其基于事件采样原理,以性能事件为基础,常用于性能瓶颈的查找与热点代码的定位 。
1.2 使用perf的使用可以分为两种方式:

  • 直接使用perf启动服务
  • 挂接到已启动的进程
第一种方式不需要root权限,第二种方式需要root权限
基于入门级使用这一前提,直接介绍一下使用方式:
perf record -e cpu-clock -g./run或者perf record -e cpu-clock -g-p 4522使用ctrl+c中断perf进程,或者在程序执行结束后,会产生perf.data的文件,使用
perf report会产生结果分析,如图
Linux性能分析工具与图形化方法

文章插图
 
1.3 图形化方法perf的结果可以生成火焰图 。生成火焰图需要借助Flame Graph
clone代码或者直接下载压缩包到服务器上 。以压缩包为例,是一个命名为:FlameGraph-master.zip的文件,假设其解压后的目录为:/data
基于1.2产生的perf.data,后续步骤如下:
1、使用perf script工具对perf.data进行解析perf script -i perf.data &> perf.unfold2、将perf.unfold中的符号进行折叠:/data/stackcollapse-perf.pl perf.unfold &> perf.folded3、最后生成svg图:/data/flamegraph.pl perf.folded > perf.svg生成的火焰图如下:
Linux性能分析工具与图形化方法

文章插图
【Linux性能分析工具与图形化方法】 
关于火焰图的含义及分析网上有很多文章,这里不再赘述
需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享
Linux性能分析工具与图形化方法

文章插图
 
二、Gprof2.1 简介gprof用于监控程序中每个方法的执行时间和被调用次数,方便找出程序中最耗时的函数 。在程序正常退出后,会生成gmon.out文件,解析这个文件,可以生成一个可视化的报告
2.2 使用方法使用gprof,需要在编译时,加入-pg选项
另外只有在程序正常退出后才会生成gmon.out,kill进程的方法是没法生成gmon.out的 。对于那些线程会一直run的服务,需要修改代码,让程序在某个时间点停止 。
重新编译后,正常启动程序即可;然后在程序运行结束后,会生成gmon.out文件
使用如下命令,生成报名文件(其中run是二进制的名字):
gprof -b run gmon.out >>report.txtreport.txt打开如下图所示:
Linux性能分析工具与图形化方法

文章插图
 
2.3 图形化方法gprof的结果文件需要借助gprof2dot.py和graphviz来展示
使用gprof2dot.py生成dot文件
Python gprof2dot.pyreport.txt>report.dot 需要说明的是,这里要求服务器已经安装了python,并且要求gprof2dot.py与安装的python版本匹配 。这两者是否匹配是一个需要运气、并且解决起来很无聊的事情,我的服务器上安装的python是2.6.6,第一次从网上下载的gprof2dot-2017.9.19与python版本就不匹配,执行会出错 。目前使用的版本与2.6.6是兼容的,如果需要可以与我联系 。
dot的打开需要graphviz工具,我是在windows下安装的graphviz,这个工具下载很简单 。下载后使用gvedit.ext打开前一个步骤产生的report.dot文件即可
Linux性能分析工具与图形化方法


推荐阅读