注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

being23

写给未来的自己

 
 
 

日志

 
 
关于我

真正的坚定,就是找到力量去做自己喜欢的事情,并为之努力,这样才会觉得生活是幸福的。

网易考拉推荐

GPT使用之CPUProfile  

2013-05-18 14:32:34|  分类: work@oppo |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

本文内容翻译自Work with Google performance tools

其他参考资料见
Google CPUProfile
C++ Profiler工具之初体验

Google Performance Tools (GPT)是一组工具集,可用于性能分析、内存分配检测以及查找内存泄漏。

安装

GPT几乎在所有的类unix操作系统中都能正常工作——Linux、FreeBSD、Solaris、Mac OS X(Darwin),包括对下列处理器的支持——x86、x86_64和PowerPC。此外,用户可以在MS Windows中编译tcmalloc,并对程序进行内存分配分析和内存泄漏检测。

在类unix系统上安装非常简单——安装包使用标准的自动化工具,所以只需从项目主页下载源码,并执行下面的命令:

./configure
make
make install

上述命令将会完成配置,构建并安装程序和库。使用./configure的命令行选项,可以将其安装到指定的目录。
在64位系统上,建议安装libunwindlibunwind是一个用于解析程序调用栈的C++库,由于glibc内建的栈回滚功能在64位系统上有bug,因此GPT建议使用libunwind

简单使用

GPT由两个库文件组成:

  • tcmalloc(Thread-Caching Malloc)

tcmalloc——malloc函数的急速实现版(速度优于glic2.3中的malloc)。该库可用于分析内存使用,检测内存泄漏。tcmalloc的内部结构见项目主页

  • profile

该库用于可执行代码的性能分析。

用户可通过两种方式来使用这些库——将库文件链接到程序中(使用-l选项),或者使用LD_PRELOAD载入库文件。开发人员建议使用第一种方式,第二种方式通常在看不到源码的情形下使用。

需要注意的是,链接(或者载入)并不会自动启用分析函数。要启用这些函数,需要设置后面提到的环境变量。在某些操作中,会把收集到的数据记录到文本文件中。可以使用pprof工具来分析这些数据。

性能分析

使用性能分析,只需要将profiler库文件链接到程序中,并通过环境变量CPUPROFILE指定用来保存数据的文件:

#CPUPROFILE=/tmp/cpuprofile.log ./your-program

或者

#LD_PRELOAD=/usr/lib/libprofiler.so.0.0.0 CPUPROFILE=/tmp/cpuprofile.log ./your-program

不过在项目主页上,有这么一段:

“In your code, bracket the code you want profiled in calls to ProfilerStart() and ProfilerStop(). (These functions are declared in <google/profiler.h>.) ProfilerStart() will take the profile-filename as an argument.”

即需要将性能检测的代码用函数ProfilerStart()ProfilerStop()括起来,并且将保存数据的文件名作为参数传给ProfilerStart()函数。我在实际使用中,并没有这么做,仅仅将libprofiler链接到可执行文件中。

除了环境变量CPUPROFILE,还可以通过设置其他变量来控制库的行为。例如变量CPUPROFILE_FREQUENCY可以用来控制采样的频率。

当程序结束后,收集到的数据存储在指定的文件中,可以通过工具pprof来做分析。分析后的数据可以以文本的形式呈现

23   2.4%  42.6%      309  32.4% std::less::operator

或者图形的形式。

当以文本的形式呈现时,pprof会打印出函数的列表,及其相关的信息(对应各列)

  1. Number of profiling samples in this function(进入该函数的次数?)
  2. Percentage of profiling samples in this function (进入该函数的频度?)
  3. Percentage of profiling samples in the functions printed so far (到目前为止进入该函数的频度?)
  4. Number of profiling samples in this function and its callees (进入该函数及其调用函数的次数?)
  5. Percentage of profiling samples in this function and its callees (进入该函数及其调用函数的频度?)

当以图形方式呈现时,除了上述信息(函数名,进入次数等),还能获得函数之间的调用关系。

GPT使用之CPUProfile - 柒.smilence - on the way.柒
 
 
图中每个节点表示一个过程。箭头从调用者指向被调用者。每个节点的内容如下
Class Name
Method Name
local (percentage)
of cumulative (percentage)

最后一行或者两行含有时间信息。(性能分析是通过采样实现的,一秒钟默认采样100次。因此输出的每个时间单位相当于执行时间10ms。)local时间是执行当前过程中的指令花费的时间(以及通过内联方式进入当前过程的其他过程)。cumulative时间是local时间和被调用者时间的总和。如果cumulative时间和local时间是一致的,那么不会显示cumulative时间。

例如,上图中函数test_main_thread耗时155个时间单位(大约1.55s)执行位于其内的代码,以及200个时间单位执行函数test_main_thread和它的调用函数,例如snprintf()

每个节点的大小与local值成正比。(这一点非常有用,据此第一眼就可以看出最耗时的函数是哪个)每个节点显示的百分比有local值除以程序的运行时间,即main函数的cumulative值。

每个调用关系箭头上的数字,表示被调函数执行耗时。一般来说有如下关系成立:

cumulative_time = ∑local_time

不过一些节点由于采样低于某一阈值(如图中的”Dropped nodes with <= 1 abs(samples)”)没有显示出来,所以上述关系总有偏差,不过不影响分析。

关于性能和数据分析的更多细节请参见项目主页

pprof工具

pprof工具可用来对收集到的数据进行分析。命令如下:

pprof [options] program_name results_file_name

有些选项对所有文件来说是通用的,有些命令则只适用于特定场合。通用选项用于指定输出信息的格式和丰富程度——选项--addresses--lines--functions(默认选项)或者--files可用于打印出下列信息——物理地址、行号、函数名或者文件名。

信息可以以文本的形式(--text选项)或者图形的形式(--gif--ps--pdf或者其他选项)输出。也可以以源码注解的形式?(annotated source code)(--list选项),或者反汇编机器码的形式(--disasm)输出。如果没有指定格式选项,会进入交互模式,可以输入不同的命令,命令名与命令行选项一致(没有--标识)。

当分析性能数据时,可以控制丰富程度。例如,通过--ignore选项可以不包含匹配给定的正则表达式的某些对象。选项--nodecount--nodefraction--edgefraction控制图形的丰富程度。

pprof的完整描述请参见随安装发行的手册页。在文档中可以找到更多描述GPT组件的例子。



使用GPT对后台一个服务的进行分析,将收集到的数据转成pdf,命令如下

pprof -pdf stat_sdk_server.perf stat_sdk_server.prof > stat_sdk_server.pdf

使用-pdf选项需要提前安装dotps2pdf,搜索了一下发现只要安装graphviz就可以了。

结果如下图所示(话说这个图看着真是赏心悦目哈),其中耗时较多的函数是inet_addr(因为这个节点最大),根据调用关系顺藤摸瓜找到函数datetime_str_to_unixtime,发现在该函数中调用的系统函数mktime

GPT使用之CPUProfile - 柒.smilence - on the way.柒

将该函数替换成自定义的函数后,分析后的结果如下:

GPT使用之CPUProfile - 柒.smilence - on the way.柒

修改之后,函数datetime_str_to_unixtime的耗时百分比从之前的28.7%下降到0.7%,使用top命令查看,发现进程的CPU占用率从之前50%多下降到5%,还是不错哈。(完)

2013-05-18

@深圳南山迈科龙

  评论这张
 
阅读(393)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017