dotTrace
1. 问题描述
IIS发布的接口运行一段时间后变的很慢,重启IIS连接池后问题得到解决,但是运行一段时间后再次出现变慢的问题
2. 问题原因
程序中有读取xml文件的逻辑,现网请求多的时候 ,读取xml消耗时间很多,造成连接超时,IIS的连接得不到及时释放
3. 定位方法
优化内部逻辑解决该问题。在测试环境下进行压力测试,并使用dotTrace进行跟踪,具体步骤。
第一步。接口进行压力测试,运行dotTrace,选择profile---IIS Application(因为是IIS应用)
第二步。选择需要的profiler options(此处选择的是Tracing),点击Run
第三步。先在命令行中通过iisapp查看需要定位的IIS应用的PID,再选择对应的PID参数,点击Get Snapshot获取快照就可以了。
第四步。对快照进行分析。
4. dotTrace
Dottrace是由JetBrainshttp://www.jetbrains.com/ 公司开发的一款产品,它分dottrace Performance和dottrace Memory 两个工具,dottrace Performance用来分析代码性能,比如函数执行时间,调用次数,消耗时间比率等,dottrace Memory一般用来分析内存占用情况。dottrace可以跟踪.net编写的:应用程序,IIS挂接的程序,windows服务,silverlight,WCF服务程序等。还可以把跟踪的文件,以快照的方式保存下来,保存为dtp后缀的文件。跟踪后的结果,如果能找到对应用户的代码信息,还可以直接查看对应的源代码,并选择在VS里直接编辑该方法对应的文件。
profiling type 有三种类型:
- Tracing:它是通过获取CLR内部一个方法开始执行和结束执行的时间差来计算的分析时间。
- Line-by-line:它是通过收集代码执行的每条语句的时间来,它计算出的时间更精确。
- Sampling:它是抽样的方式,每隔一段时间(windows下大概是10ms),会暂停所有线程,并抓取堆栈里的信息,然后计算出代码执行时间差,这个选项可能会导致一些执行很短的方法抓取不到的问题。
- Wall time(performance counter): 它是通过Performance Counter API来收集的信息,一般操作系统和各个硬件设备都提供性能计数的API供程序调用。
- Thread time:它只支持Sampling的分析方式,它通过一个固定的线程来抓取堆栈信息计算时间,并且它只计算自己内部程序执行的时间,不管等待其他IO的时间。
- Wall time(CPU instruction):它是通过读取TSC processor register里记录的方法进入和退出时间差的方式来计算的。
Measure的三种类型:
根据上面的选项方式,一般我们要想完整分析自己程序的执行时间,建议可以采用Line-byline(或Tracing)和Wall time(CPU instruction)或Wall time(performance counter)的方式,因为如果用抽样和Thread time的搭配方式,会只计算自己内部时间,不能计算自己程序和外部程序交互的时间,会让自己分析性能时产生误导。
View介绍:
- Overview:这个可以看到该性能分析文件的抓取方式,比如上面例子为Tracing,Wall Time(CPU instruction)的方式,抓取的URL地址等,还会有该视图下的系统配置情况以及当前的模块以及方法个数等信息。
- Threads Tree:记录当前每个线程执行的方法,以及方法的性能情况。
- Call Tree:不管线程,按所有请求的入口为一条数据展现,但里面展现的排序是按照执行时间高低排序的,不是按照代码顺序展现的。
- Plain List:展现所有非内核代码的方法列表,并展现每个方法执行时间和被调用次数。
- Hot Spots:它会把所有代码包括内核代码的方法,按照执行时间排序顺序展现到列表,并记录每个方法的执行时间比率和时间等信息。
通过监控的图我们可以较为快速的定位代码中的性能瓶颈
5. 参考资料
http://www.cnblogs.com/xienb/p/3313153.html