| 2011年12月18日 07:00 | |
2.2 使用Intel® VTune进行性能分析
Intel VTune性能分析器可以帮助程序员定位并定性程序中与性能问题有关的方方面面。VTune可以在程序运行的系统平台上自动搜集性能数据,可以将所获得的性能数据在各个不同的层次,大至系统层,下至程序源代码级,甚至到处理器指令级,进行不同粒度的交互式可视化,帮助查找可能的性能瓶颈,并提供可能的解决方案。VTune既可以在本地、也可以远程搜集性能数据,并在本地进行数据处理、分析以及显示。既支持图形化界面,又有灵活的命令行模式(支持脚本语言批处理)。Intel VTune至多可以支持到4096个处理器。Intel VTune的性能数据搜集及优化分析无需对程序进行重新编译,支持包括Microsoft Visual Studio.NET、Intel C/C++ 与Fortran 编译器、Compaq Visual Fortran、Java、Borland 编译器(Delphi、C++ Builder)以及IBM Visual Age。
2.2.1 性能分析器功能与使用方法
IntelVTune性能分析器的主要功能包括:
- 取样功能、调用图功能、计数器监视器以及经过改进的Intel调优助手;
- 在Windows下同时提供图形化与命令行界面;
- 允许选择是否与Visual Studio .NET 集成;
- 为基于IA-32与Intel安腾处理器的Linux应用程序提供远程支持;
- 可以对基于Intel PXA250、PXA255 与 PXA26x 处理器的应用程序进行取样。
(1)取样(Sampling)
VTune性能分析器中的取样功能可以帮助开发者分辨程序中最消耗时间的函数和模块,并给出操作系统和应用程序的详细视图。它能够寻找程序中的热点区域(Hot Spot)——最耗时间的模块、函数、代码行和汇编指令,并提供进程、线程、模块、函数以及代码等不同层次的各种视图,并在下方的表格内将具体参数列了出来。
取样能提供最精确的实际软件性能,且对程序执行影响最小,这是由于:
低功耗:取样产生的时间开销不到1%。
对指令无要求:开发者不必为取样而对程序代码做任何改动。
取样指的是周期性的中断处理器以获得程序执行的上下文(context)。取样的原理是通过在一定数量的事件发生后中断处理器,同时将运行信息记录到一个缓冲区。当缓冲区记录已满时,将信息复制到文件。保存好这些信息后,程序再重新开始运算。用这种方法,VTune可视化性能分析器可以在取样时维持极低的时间开销(大约1%)。取样主要有两种方式:
基于时间取样(Time-based Sampling -- TBS):基于时间取样的方式或者由操作系统的时钟服务触发,或者在每隔n个处理器时钟周期后自动触发。
基于事件取样(Event-based Sampling -- EBS):基于事件取样的方式主要由处理器的事件寄存器溢出(overflow)来触发。这样的时间通常是处理器相关的,主要包括如二级缓存缺失、分支转移预测失败、浮点数指令提交等事件。图chap:HowEBSworks显示了基于事件取样的工作原理。
一般来说,每秒取样1000次是在取样完整性和取样开销之间一个比较好的权衡。
可以使用“vtl”来使用Windows上的命令行界面。这有助于将Intel VTune搜集到的性能数据作为自动输入,提供给用户自定义的回归分析过程中去。
图2.2 基于事件取样的工作原理
(这里需要关注的焦点为如何选取取样频率(Sample After Number))
分析器收集的运行数据有:
在内存中的指令运行地址(CS:IP)
操作系统进程和线程ID
在此地址装入的可执行模块
程序运行结束后,相应样本的分析信息被存储到分析器程序的数据库。开发者可以通过分析器的模块视图查看结果,如图2.3。
图2.3 VTune模块分析视图
Intel VTune性能分析器的取样功能强大之处在于:
对于取样功能的支持,程序员无需修改他们的程序。而只需将他们的程序在编译、链接时加入对符号和行号的支持。
Intel VTune的取样是在整个系统范围内的。即,它不仅对应用程序本身进行取样,还对应用程序中调用的操作系统库函数,甚至对使用到的设备驱动程序进行取样。
取样对程序性能的影响极小。甚至,程序员还可以通过关闭取样进度条的办法进一步降低取样对程序运行性能的影响。
微调(Calibration)Intel VTune性能分析器还可以对如何取样进行微调。比如设置对每个逻辑CPU每秒取样1000次(通过在“Advanced Activity Configuration”对话框中改变“Calibrate Sample After Value”来实现)。对于取样频率的微调一般需要将程序运行两次:第一次使用缺省的取样频率取样,如果有需要的话第二次再用手工调整取样频率的方式进行取样。
可以通过直接调用Ring3 API的方式,使得程序员更精准的定位一些特定的代码模块(在所感兴趣的代码模块前后插入特定的VTune Ring3 API函数)。相应的头文件定义在VTuneAPI.h中,库函数引入为VTuneAPI.lib,运行时库函数为VTuneAPI.dll。
对于VTune™ 性能分析器的取样过程无法定位的载入模块,一般使用OtherXX的形式代替。其中XX表示寻址方式,比如Other32代表地址为32位字长。OtherXX的表示方式一般出现在对NT4、或者BIOS代码、或者运行时库动态产生的代码进行取样分析的时候。
(2)调用曲线图
调用曲线图通过分析程序运行时函数的入口点和出口点,生成一张调用曲线图并且确定调用顺序和显示关键路径。它显示线程创建,函数执行,以及它们之间的父子继承关系。它分析提供关于程序流程的示意图,帮助开发者快速识别主要功能和调用顺序。
调用曲线图展现了以下几个部分:
程序函数级的框架结构
某个函数被某特定区域调用的次数
每个函数消耗的时间
处于关键路径上的函数
如图2.4:
图2.4 VTune调用曲线图
注:图中的红线即关键路径——消耗了最多时间的调用路径,橙黄色的节点为消耗时间最多的函数。单击表中的项目可以突出显示图中的函数;反之,单击图中的函数也可找到表中相应的项目。
调用曲线图功能时间开销较大,而且不支持系统范围,关键路径的深度最长为3,这点和取样功能有所不同。
相对于其他分析类软件,VTune性能分析器不仅提供采样功能,还提供调用图分析功能。即使主要计划进行调用图分析,也可首先进行采样来确定需要分析的模块,这样就可以把调用图中时间开销的重点放在需要分析的模块上,这对于大型项目至关重要。采样功能非常适用于分析“多循环”的代码。调用表功能则更适用于分析“多分支”的代码,结合二者能帮助开发者最有效的完成工作。
(3)计数器监控器
计数器监控器在运行时跟踪系统活动,确定是否会因为可用内存减少或文件输入/输出性能问题而导致应用程序速度变慢。它允许开发者在运行时间期间轻松跟踪系统活动和资源消耗,以帮助检测和发现系统级性能问题。
计数器监控器通过选择性的轮询性能计数器(已按照性能对象分类)可以:
监控所选性能对象的计数器;
将性能计数器的数据和VTune性能分析器的其他特征(例如取样)结合起来;
根据事件触发计数器收集数据(不同于周期性定时器)。
计数器监控器能帮助开发者理清操作系统和应用程序之间的因果关系。如果开发者使用了动态链接库来开发特定应用程序的计数器,VTune性能分析器同样能收集并显示这些计数器,如图2.5。
图2.5 VTune计数器监控器
(4)调优助手
Intel调优助手根据丰富的知识库分辨性能问题,自动推荐代码改进办法,帮助提高开发者的工作效率。它提供了基于性能计数器的视图,以及关于Windows操作系统和Intel最新处理器的建议,以及源代码的改进建议,主要分为以下几方面:
算法改进:调优助手能识别算法中的改进机会,例如循环展开、低效率的缓存利用、低效率的类型转换以及重复计算。它还能检测出矩阵和指针这些会限制编译器优化代码的对象。
处理器瓶颈以及改进:通过对处理器瓶颈取样,例如64k反锯齿测试,调优助手能指出瓶颈并提供如何改进代码的建议。
取样向导增强:调优助手的选项增加到了取样向导,增加了取样的易用性。取样向导可以选择合适的时间来取样,并且能在取样后自动启动调优助手来生成调谐建议。
超线程:调优助手能迅速指出具体代码哪部分应该优化,如何利用Intel最新处理器的超线程和其他特性。
如图2.6:
图2.6 VTune调优助手视图
(5)Windows下的命令行功能
|
功能
|
命令
|
|
创建一个分析活动
|
vtl create [activity name] + options
|
|
运行一个分析活动
|
vtl run [activity name]
|
|
查看活动类型
|
vtl show
|
|
查看一个特定活动类型的结果
|
vtl view [activityname::result] [options]
|
|
删除整个项目
|
vtl delete –all
|
|
删除一个特定活动
|
vtl delete
|
|
查看帮助
|
vtl –help
|
表2.1 VTune命令列表
Vtune的兼容性特点主要有:
处理器:支持最新的Intel处理器,包括Intel酷睿双核处理器和Intel酷睿单核处理器。
通过远程数据收集支持Linux:用支持Linux的远程代理收集远程Linux系统的数据,然后通过Windows主机的图形界面分析和解释数据。
集成到Visual Studio*.NET 2.0:支持项目,编译,以及与微软编译器兼容代码。
Windows命令行支持:独立于VTune性能分析器图形界面,通过命令行收集数据能大大节约时间。
编程语言支持:支持最常用的编程语言,包括C/C++,C#,.NET 2.0,Fortran*和Java*。
2.2.2 性能分析器实验
本实验通过IntelVTune性能分析器的取样、调用曲线图等功能来分析程序中的热点区域。实验前请下载IntelVTune性能分析器最新试用版并安装,本书使用的是7.2版。
(1)寻找热点区域
这个活动的目的是基于时钟事件取样收集程序gzip.exe的数据,并识别程序中最耗时间的函数。请按照以下步骤执行:
关闭任何杀毒软件;
运行IntelVTune性能分析器;
点击New Project;
点击Sampling Wizard;
点击OK;
选择Window*/Windows* CE/Linux Profiling;
不选择Automatically generate tuning advice;
点击Next;
在Application To Launch对话框,选择gzip.exe存放路径(假定位于code\VTuneBasics\gzip\release\gzip.exe);
在Command Line Arguments对话框输入:-f testfile.dat;
如图2.7 所示,点击Finish,VTune性能分析器开始运行和分析gzip。
图2.7 取样配置向导
问题:
gzip.exe中哪个函数消耗了最多的时间?
gzip.exe中哪个函数CPI最高?
gzip.exe源代码中哪一行时钟周期最多?
gzip.exe是多线程程序吗?
(2)取样
运行IntelVTune性能分析器;
点击New Project;
点击Sampling Wizard;
点击OK;
选择Window*/Windows* CE/Linux Profiling;
不选择Automatically generate tuning advice;
点击Next;
在Application To Launch对话框,选择matrix.exe存放路径(位于code\VTuneBasics\matrix_mt\release\matrix.exe);
点击Finish,VTune性能分析器开始运行和分析gzip;
分析完毕后,点击Process按钮;
使用CTRL+A组合键选择所有进程;
点击Display Over Time View按钮;
观察每个不同进程运行状态,可点击Thread、Module等按钮;
选择某段时间区域,点击放大按钮,可放大观察这段时间区域;
要查看这段时间区域的常规取样视图,可点击按钮。
(3)调用曲线图
创建一个新的活动,点击Activity->New Activity;
双击Call Graph Wizard;
点击 Windows*/Linux* Profiling;
点击 Next;
在Application To Launch对话框,选择gzip.exe存放路径(位于code\VTuneBasics\gzip\release\gzip.exe);
在Command Line Arguments对话框输入:-f testfile.dat;
点击Finish。
问题:
哪个函数消耗的时间最多,它被哪些函数调用过?
(4)使用Windows命令行
用Windows命令行收集基于时钟周期时间的样本数据:
打开Windows命令行界面,点击开始->所有程序->附件->命令提示符;
跳转到目录code\VTuneBasics\gzip\release\;
创建一个新活动,装入gzip程序并收集样本数据,输入:vtl activity gzip –c sampling –app gzip.exe,”-f testfile.dat”;
运行此活动,输入:vtl run。
查看gzip的分析数据:
输入:vtl view –modules,查看每个系统范围模块的样本数量;
输入:vtl view –hf –mn gzip.exe,查看gzip.exe中函数级样本断点。
封装数据并在图形界面中查看:
输入:vtl pack gzip,创建一个名为gzip.vxp的文件,这个文件包含了分析数据,能在计算机之间传播并可用VTune性能分析器图形界面打开;
双击启动VTune性能分析器;
打开此gzip.vxp文件;
点击 OK;
点击 OK。
图形界面显示样本分析数据。

