linux 平台性能分析工具
Linux平台下面有不少性能分析的工具,每个工具有何优劣却很难找到一个完整的列表,这里做一下记录,以便参考。
1. Intel VTune http://software.intel.com/en-us/intel-vtune-amplifier-xe/
大名鼎鼎的分析工具,可以直接启动一个程序来分析,
比如
$vtuneHome/amplxe-cl -collect hotspots -duration 600 -r /apsara/save_result ./myapp para1 para2
也可以针对运行中的进程来分析,
$vtuneHome/amplxe-cl -collect hotspots -duration 600 -r /apsara/save_result -target-pid $myapp_pid
运行结束后,就可以使用gui工具来展示结果,直观易懂,非常方便。
VTune不仅支持对热点函数(hotspots)的分析,还支持对并发、锁等待、不同类型的CPU内存访问(都是Intel自家的)、读写带宽等进行分析,功能强大。
总之,VTune唯一不足的就是收费,免费试用一个月就过期,过期了需要重新申请,比较麻烦。
2. OProfile http://en.wikipedia.org/wiki/OProfile
OProfile最大的好处是方便,一般OS都自带了这个工具,不用做任何准备就可以使用。
该工具设计初衷是针对事件进行采样,比如CPU时钟,L2 cache miss等,其将整个系统当做一个整体来看,对于分析kernel或者系统级别的问题比较有用,而如果用于分析个人开发的应用程序,其显得不足,主要表现在其callgraph不清晰。
比如OProfile告诉你std::find调用占了30%,如果你的程序只有几百行,那么你很快就能定位到使用std::find的地方;而如果程序有几万行,而OProfile的Callgraph很不给力,那么想知道这些std::find都是谁调用的就很困难了。
一句话,对于千行以内的程序或者很少使用stl的程序,OProfile能发挥作用;对于万行程序或者大量使用了stl的程序,OProfile不那么给力。
其基本的使用方法是,
opcontrol --no-vmlinux : 指示oprofile启动检测后,不记录内核模块、内核代码相关统计数据
opcontrol --init : 加载oprofile模块、oprofile驱动程序
opcontrol --start : 指示oprofile启动检测
opcontrol --dump : 指示将oprofile检测到的数据写入文件
启动你的应用程序;
opcontrol --stop
opreport -D smart -l > /tmp/report : 写入分析结果,不包括callgraph,如果需要callgraph,则使用
opreport -c -D smart -l > /tmp/report : 这一步很慢;
还可以分析源代码,会将每行代码标上所耗费CPU的比例;
opannotate -s /lib64/libc-2.4.so : 以代码的角度,针对libc-2.4.so库显示检测结果
还有一些用法,man可以看到更详细的解释;
opcontrol --reset : 清空之前检测的数据记录
opcontrol -h : 关闭oprofile进程
有时候opreport会报告说buffersize不够丢了一些采样点,这时候可以调整buffer size。buffer size不是以byte计数,而是以能做多少sample来计数的;分为两级,一个是总的buffer size,一个是每个cpu的buffer size,如果超过了bufer watershed就flush到磁盘文件中。如下,是修改之后的:
Daemon not running
Session-dir: /var/lib/oprofile
Separate options: library
vmlinux file: none
Image filter: none
Call-graph depth: 25
Buffer size: 1000000
CPU buffer watershed: 256000
CPU buffer size: 32000
Warning: You requested to build with the '--with-kernel' option, but your kernel
headers were not accessible at the given location. Be sure you have run the following
command from within your kernel source tree:
make headers_install INSTALL_HDR_PATH=
Then pass
If you run 'make' now, only the legacy ocontrol-based profiler will be built.
GProf用起来很麻烦,编译时候需要加入-pg 选项,而且默认只能针对单线程程序(这个patch可以支持多线程,http://sam.zoy.org/writings/programming/gprof.html),总之极其不便;
4. Google Perf Tools https://code.google.com/p/gperftools/?redir=1
强大免费的工具来了,Gperf 里面包含内存分配器,内存泄露分析器,CPU使用分析器,callgraph也比较精准,用起来简单方便(只要链接lib然后配置一个环境变量就好了),并且自己可以使用代码精确控制profile的配置,具体参考链接左边的几个文章。
还有一些其他的分析方法和工具,比如连续做几次pstack看看大部分线程在干吗也可以初步判断可能是哪里出了问题。
总之,如果简单的分析一下,那么OProfile是可以胜任的;如果想比较认真仔细的做性能调优,最好使用Google perf tools。