用VSTS Profiler发现性能问题并且进行优化实例

上一篇文章介绍了如何使用VSTS的Profiler,今天想分享一下对于一个ASP.NET应用程序,用Profiler找到性能问题并且对之进行优化。

由于ASP.NET程序运行在一个硕大的框架上,所以一般用Sample模式收集到的数据,对发现性能问题帮助不大,以下是一个用Sample模式收集的结果:

iis-sample

从这个报告中我们可以看到,前5个工作量最大的函数和执行单独工作最多的函数都是系统函数。

下面看一下有针对性地用检测模式收集的数据:

instr-function-with-indi-work1

本文就采用“检测”模式收集性能数据来进行分析和处理。

首先,把本次测试的目标DLL用VSInstr工具进行处理,使得Profiler能够收集相关的性能数据,这一个步骤非常关键,通常来说不需要设置额外的参数,就是默认的方式就可以了,例如:VSInstr “D:\Websites\xxxx\bin\xxxx.dll”,在处理的过程中可能会提示一些错误,具体错误的信息可以在这里查找。把相应的DLL处理完毕以后,就在命令行输入以下指令(命令行的指令用斜体加下划线表示;说明文字加黑)

停止IIS

iisreset /stop

设置分析.NET应用程序所需要的环境变量,在运行完这个命令以后需要重启。由于使用检测方式进行数据采集,所以这里我用globaltraceon参数。

VSPerfClrEnv /globaltraceon

启动性能数据收集。/start:trace,告诉收集器要收集检测数据;/user:”NETWORK SERVICE” ,由于是要对IIS进行的数据进行采集,所以需要制定用户NETWORK SERVICE;/CS,启用跨进程分析,看了一些文章说是分析ASP.NET程序一般都把这个选项打开,原因不详;/output:”d:\magus\0422.vsp”,指定输出文件的路径和名称;/wincounter:”\Processor(_Total)\% Processor Time”,收集处理器的参数,这里需要注意的是,wincouter后面的性能计数器名字一定要是全名,有一个方法可以查询系统的性能计数器的全称,就是用VSTS的Server Explorer,然后找到相应的服务器(一般是本机),下面有一个“Performance Counters”;如果要收集多个性能计数器的数据,只需要多加几个 /wincounter 参数即可,例如我在收集处理器时间的同时,还想知道Context Switcher每秒的数据。

VSPerfCmd /start:trace /user:”NETWORK SERVICE” /CS /output:”d:\magus\0422.vsp” /wincounter:”\Processor(_Total)\% Processor Time” /wincounter:”\System\Context Switches/sec”

在IIS起来之前先停止性能数据的收集

VSPerfCmd /globaloff

启动IIS

iisreset /start

对程序进行预热,这一步也是很关键,因为IIS启动以后,程序需要预热才能达到稳定的状态,因为程序首次被访问的时候有些代码会被编译,所以为了降低对性能测试的影响,应该现对被测的程序进行预热。在预热完毕以后重新启动性能数据的收集。

VSPerfCmd /globalon

— 运行性能测试场景 —

测试运行完毕以后,停止性能数据的收集

VSPerfCmd /globaloff

停掉IIS

iisreset /stop

关闭性能数据收集器,这一步完成以后就能生成包含数据的文件了

VSPerfCmd /shutdown

首先来看看收集到的报告

time-before-opt1

在这个方法里面有一段不知名方法(其实是因为没有相应的Symbol,⊙﹏⊙b汗)占用了大量的计算时间,然后就找到相应的代码,原来该不知名方法是一个动态生成的代码,该段代码大概就是会创建一个新的Client对象,然后向另外一台服务器发起一个请求。其实不用每次调用该方法都创建一个新的Client对象。然后我尝试着把这个Client改为静态变量,经过优化以后的报告对比如下:

time-after-opt

效果还是挺明显的,但是当我重新测试一下性能的时候,被打击了一下,改动前后的性能对比相差很小,小的都可以认为是误差:P,因为在一个颇为庞大的项目中,这点小小的改动的确不可能影响大局。不过这次试验让我学会了用Profiler来找到ASP.NET运行中执行较慢的语句,并且看看这些语句有什么问题(可能是一个调用存储过程的方法很慢,而真正的原因是数据库有问题),定位问题所在,然后解决问题,最后回测一下对比改动前后的结果。看是否达到预期的优化效果。

Leave a Reply

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