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

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

C++程序CPU热点定位工具和方法(小结篇)  

来自左琴   2014-10-08 14:22:03|  分类: 性能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++程序的CPU定位工具很多,其中部分工具同样适用于linux系统的CPU热点定位,对

其做了相关的调用和对比,将其分为两类:

采样型

通过周期性中断,来纪录相关的性能信息,如处理器指令指针、线程id和事件计数器等

这种方法开销小,精确度高

Linux系统中比较常见的有OprofilePerf

插桩型

可以使用直接的二进制插桩,也可以通过编译器在应用中插入分析代码

在应用中增加计时函数,带来的开销较大,但提供了更多的功能,如调用树,调用次数等

Linux系统中比较常见的有GprofGperftool 

 

Perf

内核自带,系统级性能分析的利器

几乎能够处理所有与性能相关的事件

函数级与指令级的热点查找

Oprofile

OProfileLinux上的性能监测工具,通过CPU硬件提供的性能计数器对事件(如CPU Cycle

Cache Miss等)进行采样,可以帮助开发者从代码层面分析程序的性能消耗情况。内核驱动

工作的时候分为三种模式:硬件事件计数器模式、RTC模式、TimeInterrupt模式。Oprofile

包含daemon组件主要用于收集内核驱动采样数据,并且将采样数据dump外部文件。可执

行程序是bin/oprofiled.附加组件,通过读取dump出来的外部文件,得到采样数据并且进

行加工。

Gprof

Gprof工具通过打印出程序运行中各个函数消耗的时间,可以帮助程序员找出众多函数中耗

时多的函数。产生程序运行时候的函数调用关系,包括调用次数,可以帮助程序分析程序的

运行流程。

它通过在编译和链接你的程序的时候(使用 -pg 编译和链接选项),gcc 在你应用程序的每

个函数中都加入了一个名为mcount ( or  “_mcount”  , or  “__mcount” , 依赖于编译器或操

作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount, mcount 会在内

存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调

用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。

 grof工具有自己的局限性,主要包括:对多线程支持不好,不准确必须正常退出exit()才行

它只能分析应用程序在运行过程中所消耗掉的用户时间,无法得到程序内核空间的运行时间。

对内核态的调用分析无能为力。如果程序系统调用比率比较大,就不适合

Gperftool

Goolgle performance toolsgoogle公司开发的一套用于C++Profile的工具集。其中包括:

一个优化的内存管理算法—tcmalloc性能优于malloc

一个用于CPU profile的工具,用于检测程序的性能热点,这个功能和gprof类似

一个用于堆检查工具,用于检测程序在是够有内存泄露,这个功能和valgrind类似

一个用于Heap profile的工具,用于监控程序在执行过程的内存使用情况。

小结

对于服务器程序,插桩型的profile工具作用比较局限,因为它们需要程序能够正常退出,而

服务器程序是一直运行的,所以需要一些工具辅助。其中gprof工具因为不支持动态链接库

和多线程的profile,所以在服务器程序中基本无用武之地Gperftool工具虽然支持动态链接

库和多线程profile,但它要求程序能够一次运行正常退出,需结合GDB工具进行使用,但

依赖插桩函数的位置,所以采样不准确。而Perfoprofile这类基于时间采样的工具,在定

位服务器CPU消耗时能够较为准确地定位出热点函数,唯一的缺点就是没有调用关系图。

前段时间针对这几个工具在项目中进行了应用,总结了各自优缺点,后续将会对各个工具进

行详细描述。

 

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

历史上的今天

评论

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

页脚

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