欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~。

作者:赵坤|腾讯魔王工作室后台开发工程师

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

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

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

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

#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);}

这段代码在普通PC上执行了31s,最大CPU使用率为8.3%

Perf1.1 简介

Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。其基于事件采样原理,以性能事件为基础,常用于性能瓶颈的查找与热点代码的定位。

1.2 使用

perf的使用可以分为两种方式:

  1. 直接使用perf启动服务

  2. 挂接到已启动的进程

第一种方式不需要root权限,第二种方式需要root权限

基于入门级使用这一前提,直接介绍一下使用方式:

perf record -e cpu-clock -g ./run
或者
perf record -e cpu-clock -g -p 4522

使用ctrl+c中断perf进程,或者在程序执行结束后,会产生perf.data的文件,使用

perf report

会产生结果分析,如图

1.3 图形化方法

perf的结果可以生成火焰图。生成火焰图需要借助Flame Graph

Flame Graph项目位于GitHub:

https://github.com/brendangregg/FlameGraph

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

生成的火焰图如下:

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

Gprof2.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打开如下图所示:

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文件即可

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

Valgrind3.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的结果:

4工具比较

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

4.1 启动方式

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

4.2 程序侵入

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

4.3 结果展示

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

4.4 监控原理

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

问答

linux实时调度算法?

Linux中的多线程处理?

相关阅读

Linux 常用性能工具简介

常见Linux调优命令和工具

性能优化:Linux环境下合理配置大内存页


此文已由作者授权腾讯云+社区发布,转载请注明文章出处

 原文链接:https://cloud.tencent.com/developer/article/1063652

Linux性能分析工具与图形化方法的更多相关文章

  1. Linux 性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  2. [转]Linux性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  3. 超全整理!Linux性能分析工具汇总合集

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

  4. (转)超全整理!Linux性能分析工具汇总合集

    超全整理!Linux性能分析工具汇总合集 原文:http://rdc.hundsun.com/portal/article/731.html 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望, ...

  5. Linux 性能分析 工具命令

    背景知识:具备背景知识是分析性能问题时需要了解的.比如硬件 cache:再比如操作系统内核.应用程序的行为细节往往是和这些东西互相牵扯的,这些底层的东西会以意想不到的方式影响应用程序的性能,比如某些程 ...

  6. Linux性能分析利器——火焰图的安装使用

    火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的 ...

  7. Linux性能分析工具的安装和使用

    转自:http://blog.chinaunix.net/uid-26488891-id-3118279.html Normal 0 7.8 磅 0 2 false false false EN-US ...

  8. Linux性能分析工具top命令详解

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析. top命令说明 [www.linuxidc.com@linuxidc-t-tomcat-1 ...

  9. UAVStack JVM监控分析工具:图形化展示采集及分析监控数据

    摘要:UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据:同时提供JVM基本参数获取.内存dump.线程分析.内存分配采样和热点方法分析等功能. 引言 ...

随机推荐

  1. Jenkins系列——使用checkstyle进行代码规范检查【升级版】

    1.背景 在<Jenkins系列——使用checkstyle进行代码规范检查>一文中完成了ant实现代码规范检查的例子.但存在以下缺陷: 每个作业都需要配置一个不同的checkstyle ...

  2. hihoCoder 1036 Trie图 AC自动机

    题意:给定n个模式串和一个文本串,判断文本中是否存在模式串. 思路:套模板即可. AC代码 #include <cstdio> #include <cmath> #includ ...

  3. 【Learning】 莫比乌斯反演

    莫比乌斯反演 ​ 对于两个定义域为非负整数的函数\(F(n)\)和\(f(n)\) ​ 若满足:\(F(n)=\sum\limits_{d|n}f(d)\),则反演得到\(f(n)=\sum\limi ...

  4. java.net.UnknownHostException

    java.net.UnknownHostException 错误解决方向 查看 测试真机或者模拟机是否连上了网络.     如果不是第一步错误的话,一般就是测试机没有链接上网络,可以打开个网页或者其他 ...

  5. SpringBoot实战 之 接口日志篇

    在本篇文章中不会详细介绍日志如何配置.如果切换另外一种日志工具之类的内容,只用于记录作者本人在工作过程中对日志的几种处理方式. 1. Debug 日志管理 在开发的过程中,总会遇到各种莫名其妙的问题, ...

  6. JavaScript基础教程1-20160612

    1.javascript是一门浏览器运行的脚本语言和java没关系 2.javascript语言写在哪里? (1)可以写单独的文件里面去调用(推荐采用此方法) index.html <head& ...

  7. Hadoop分布式集群配置

    硬件环境: 安装一个Hadoop集群时,需要专门指定一个服务器作为主节点. 三台虚拟机搭建的集群:(搭建集群时主机名不能一样,主机名在/etc/hostname修改) master机器:集群的主节点, ...

  8. javascript获取网页地址栏的id

    //获取网页的uid (function ($) { $.getUrlParam = function (name) { var reg = new RegExp("(^|&)&qu ...

  9. JavaScript函数的柯里化(currying)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...

  10. C# 枚举特性 FlagAttribute 的应用

    写在前面 枚举Enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型.可以看出枚举的出现时为了使我们可以在程序中方便的使用一些特定值的常量,一般的使用大家都比较熟 ...