您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux

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

时间:2020-05-25 11:04:53  来源:  作者:

在项目开发中,经常会遇到程序启动时间过长、CPU使用率过高等问题,这个时候需要依靠性能分析工具来定位性能的消耗点。本文介绍三个常用的工具的入门级使用及图形化方法,供大家参考。

本文介绍perf、gprof和valgrind三个性能分析工具,及其分析结果图形化的方法,旨在让大家更快的上手使用工具。出于篇幅的限制,本文不会对每种工具的使用参数及结果分析做详细的介绍,只做入门级的使用说明。

每个工具的介绍会分成简介、使用说明、图形化方法三个部分。

每种工具的结果都会基于下面这段代码:

#include <unistd.h>
using namespace std;
#define NUM 500000
void 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结果)

一、Perf

1.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.unfold

2、将perf.unfold中的符号进行折叠:
/data/stackcollapse-perf.pl perf.unfold &> perf.folded

3、最后生成svg图:
/data/flamegraph.pl perf.folded > perf.svg

生成的火焰图如下:

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

 

关于火焰图的含义及分析网上有很多文章,这里不再赘述

需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQLredis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

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

 

二、Gprof

2.1 简介

gprof用于监控程序中每个方法的执行时间和被调用次数,方便找出程序中最耗时的函数。在程序正常退出后,会生成gmon.out文件,解析这个文件,可以生成一个可视化的报告

2.2 使用方法

使用gprof,需要在编译时,加入-pg选项

另外只有在程序正常退出后才会生成gmon.out,kill进程的方法是没法生成gmon.out的。对于那些线程会一直run的服务,需要修改代码,让程序在某个时间点停止。

重新编译后,正常启动程序即可;然后在程序运行结束后,会生成gmon.out文件

使用如下命令,生成报名文件(其中run是二进制的名字):

gprof -b run gmon.out >>report.txt

report.txt打开如下图所示:

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

 

2.3 图形化方法

gprof的结果文件需要借助gprof2dot.py和graphviz来展示

使用gprof2dot.py生成dot文件

Python gprof2dot.py  report.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性能分析工具与图形化方法

 

这个图显的有些萌萌哒,这是因为我们的程序写的比较简单,对于一般的业务而言,这个图会比较复杂。

三、Valgrind

3.1 简介

valgrind不是linux的原生工具,需要自行安装。valgrind自身包含了多个工具:

  • Memcheck:用于内存泄漏检查
  • Callgrind:用于性能分析,会收集程序运行时间和调用关系
  • 以及Cachegrind、Helgrind等

这里我们主要使用的Callgrind工具

3.2 使用方法

首先需要安装valgrind:http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2

解压安装包后,顺次执行:./configue 、make、make install 就可以了

使用valgrind来分析性能,必须使用valgrind来启动程序:

valgrind --tool=callgrind --separate-threads=yes ./run

--separate-threads是指是否按线程来分别统计,如果不加,会将所有线程的结果打到一个文件里;否则会按线程分别打印到不同文件里。

程序执行结束后,会生成形如:callgrind.out.4263-01的文件。这个文件直接分析起来有些困难,必须借助图形化的方式来浏览

3.3 图形化方法

valgrind的图形化需要借助kcachegrind.exe,大家可以自行下载,下载后在windows运行即可。这是打开callgrind.out.4263-01的结果:

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

 

四、工具比较

对于我们的需求:定位执行时间最长、占用CPU最多的函数 来说,这三个工具都可以达到目的。但这三者之间还是有一定的差距:

4.1 启动方式

perf虽然可以挂接进程但需要root权限。在普通权限下,perf和valgrind必须使用前缀启动的方式来启动程序,这在某种程度上会影响到程序的性能。我们在压测的过程中发现使用valgrind启动的时候,可以支持的在线总人数比直接运行程序要少很多。

4.2 程序侵入

perf和valgrind都不需要修改Makefile或者程序,但gprof需要重新编译文件,并且对于线程一直run的服务,还需要修改代码让其自然退出,这在一定程序上侵入了程序。但从对性能影响上来看,gprof可以最大限制的保留原程序的性能

4.3 结果展示

gprof的结果是一颗倒树,这颗树展示了从根到叶子的所有结点的时间消耗;perf的是一个金字塔,与gprof有异曲同工之妙;valgrind的结果是一条单路,指出的是某条调用路径上的时间消耗,并不是一个全局的展示。

4.4 监控原理

这是一个很专业的话题,目前对三者的监控原理还没有摸的太透,所以这里暂时空着。大家有兴趣可以先行研究。



Tags:Linux 性能分析   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在项目开发中,经常会遇到程序启动时间过长、CPU使用率过高等问题,这个时候需要依靠性能分析工具来定位性能的消耗点。本文介绍三个常用的工具的入门级使用及图形化方法,供大家...【详细内容】
2020-05-25  Tags: Linux 性能分析  点击:(64)  评论:(0)  加入收藏
▌简易百科推荐
作用显示文件或目录所占用的磁盘空间使用命令格式du [option] 文件/目录命令功能显示文件或目录所占用的磁盘空间一些写法的区别du -sh xxx 显示总目录的大小,但是不会列出...【详细内容】
2021-12-23  mitsuhide1992    Tags:du命令   点击:(12)  评论:(0)  加入收藏
什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼...【详细内容】
2021-12-23  linux上的码农    Tags:linux内核   点击:(15)  评论:(0)  加入收藏
本文将比较 Linux 中 service 和 systemctl 命令,先分别简单介绍这两个命令的基础用法,然后进行比较。从 CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 service服务(dae...【详细内容】
2021-12-23  软件架构    Tags:systemctl   点击:(14)  评论:(0)  加入收藏
mv是move的缩写,可以用来移动文件或者重命名文件名,经常用来备份文件或者目录。命令格式mv [选项] 源文件或者目录 目标文件或者目录命令功能mv命令中第二个参数类型的不同(...【详细内容】
2021-12-17  入门小站    Tags:mv命令   点击:(23)  评论:(0)  加入收藏
大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 98篇原创内容 -->公众号 Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处...【详细内容】
2021-12-17  仙风道骨的宝石骑士    Tags:sed命令   点击:(22)  评论:(0)  加入收藏
Node是个啥?  写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性地拿了下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段...【详细内容】
2021-12-15  linux上的码农    Tags:node   点击:(25)  评论:(0)  加入收藏
难道只有我一个人觉得Ubuntu的unity桌面非常好用吗?最近把台式机上面的Ubuntu 16.04格式化了,装了黑苹果用了一周,不得不说,MacOS确实很精美,软件生态比Linux丰富很多,比Windows简...【详细内容】
2021-12-14  地球末日村    Tags:ubuntu   点击:(40)  评论:(0)  加入收藏
简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。输出信息含义执行net...【详细内容】
2021-12-13  窥镜天    Tags:Linux netstat   点击:(28)  评论:(0)  加入收藏
对于较多数量的文件描述符的监听无论是select还是poll系统调用都显得捉襟见肘,poll每次都需要将所有的文件描述符复制到内核,内核本身不会对这些文件描述符加以保存,这样的设计...【详细内容】
2021-12-13  深度Linux    Tags:Linux   点击:(19)  评论:(0)  加入收藏
今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。截至目前,业界使用范...【详细内容】
2021-12-10  架构驿站    Tags:eBPF   点击:(29)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条