VSTS性能分析工具Profiler的介绍

MSDN文档中,对于VSTS中的Development Edition的介绍主要分两大块,第一是“编写高质量的代码”,第二就是“使用分析工具对应用程序性能进行分析”。在VSTS里面有一个工具,叫Profiler,这个工具可以帮助研发人员在程序运行的过程中收集相关的数据,并且对之进行分析,从而达到帮助实现性能调优的目的。本文讲述如何在使用命令行工具来对ASP.NET程序进行性能测试相关数据的收集。

在VSTS的Profiler中,有两种(VSTS2010好像有5种了)Profiling的方法,第一种是采样(Sampling),第二种是检测(Instrumentation)。对于采样模式,它的工作原理是Profiler定期中断CPU并且收集函数的调用堆栈信息。在网上找到一个图,对于采样工作方式的描述非常清晰:

how-sampling-works

对于检测模式,他的工作原理是用VSInstr程序在原始的代码中插入一些用于计算时间的代码,例如A函数调用B函数,那么在调用B函数的前后都会被插入用于计算时间的代码,具体可以看下图:

how-instr-works

下面我自己写了一个小的Sample类,然后把编译好的代码用Reflector来查看,很容易地就能看出区别。第一个图是没有经过VSInstr处理的原始代码:

before-instr

下图就是经过VSInstr处理后,反编译后的代码:

after-instr

可以看到VSInstr程序修改了原来的DLL。在检测模式下,只有经过修改后的DLL才能收集到数据。

在VSTS中,一般可以通过Analyze菜单下的Launch Performance Wizard来新建一个性能会话,然后进行性能数据的采集。

对于ASP.NET程序,可以通过以下步骤来进行“采样”

iisreset /stop
VSPerfClrEnv /globalsampleon
VSPerfCmd /start:sample /user:”NETWORK SERVICE” /output:”d:\somewhere\xxxx.vsp”
VSPerfCmd /globaloff
iisreset /start
VSPerfCmd /attach:xxxx
VSPerfCmd /globalon

–run the test scenario–

VSPerfCmd /globaloff
VSPerfCmd /detach
iisreset /stop
VSPerfCmd /shutdown

  1. 第一步是停掉IIS
  2. 然后通过VSPerfClrEnv对环境变量进行设置,具体可以查文档,做完这一步以后通常需要重启一下电脑
  3. 第三步就是通过VSPerfCmd启动性能数据收集
  4. 接下来的VSPerfCmd /globaloff就是暂停性能数据的收集
  5. 然后重启IIS,并且访问一下这个服务器上的页面,使得W3WP进程启动
  6. 查看W3WP.EXE的进程ID,然后通过VSPerfCmd /attach:xxxx把Profiler attach到IIS中
  7. 通过VSPerfCmd /globalon重新让Profiler进行性能数据的采集
  8. 然后就可以运行性能测试的场景
  9. 运行测试完毕以后就用VSPerfCmd /globaloff停止性能数据的采集
  10. 接着用VSPerfCmd /detach让Profiler不要附着在IIS上
  11. 停掉IIS — iisreset /stop
  12. 执行VSPerfCmd /shutdown,这一步执行完毕以后,在d:\somewhere\下就有一个xxxx.vsp的性能报告。

对于ASP.NET程序,可以通过以下步骤来进行“检测”

检测和采样其实是大同小异的,但是有一个关键的步骤就是在进行检测之前,一定要记得用VSInstr命令对需要进行检测的DLL或者EXE文件进行处理,建议一次不要检测太多文件,检测时间不要太长,因为检测所产生的数量是非常大的,产生的文件大小都是按G级别计算了。

iisreset /stop
VSPerfClrEnv /globaltraceon
VSPerfCmd /start:trace /user:”NETWORK SERVICE” /CS /output:”d:\xxx\0422.vsp”
VSPerfCmd /globaloff
iisreset /start
— 预热 —
VSPerfCmd /globalon

–run code–

VSPerfCmd /globaloff
iisreset /stop
VSPerfCmd /shutdown

重复一次,在做以上的步骤之前必须要用VSInstr对目标二进制文件进行处理。这里详细步骤就不做解释了,命令的主要区别就是在做检测的时候,就免去了Attach到IIS这个步骤了。

采样和检测,前者是宏观的性能数据采集,后者是微观的性能数据采集。对于CPU负载较高的程序,用采样会得到比较好的效果;但是如果程序运行过程中并没有消耗很多的CPU资源,那么用采样可能就不能收集到太多有用的信息。所以在不同的场景下需要应用不同的性能数据收集方法。

2 thoughts on “VSTS性能分析工具Profiler的介绍”

Leave a Reply

Your email address will not be published. Required fields are marked *