dotTrace快速帮助你定位C#代码的性能瓶颈
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
dotTrace快速帮助你定位C#代码的性能瓶颈的更多相关文章
- js分析 快速定位 js 代码, 还原被混淆压缩的 js 代码
-1.目录 0.参考 1.页面表现 2. 慢镜头观察:低速网络请求 3. 从头到尾调试:Fiddler 拦截 index.html 并添加 debugger; 4. 快速定位 js 代码 5. 还原被 ...
- mooc-IDEA 快速通过mapper定位到XML
intellij 快速通过mapper定位到XML 方法一:在线安装Mybatis插件 安装完毕,重启IDEA生效! =>Mapper文件效果 点击向下键头即可定位到XML文件中的具体SQL = ...
- 瞧一瞧,看一看呐,用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!!
瞧一瞧,看一看呐用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!! 现在要写的呢就是,用MVC和EF弄出一个CRUD四个页面和一个列表页面的一个快速DEMO,当然是在不 ...
- 通过浏览器F12开发工具快速获取别的网站前端代码的方法
通过浏览器F12开发工具快速获取别的网站前端代码的方法 说明:直接另存为网页是比较老的做法,会有很多没用的东西下载下来.通过F12开发工具,sources获取到的是比较好的,有目录结构的源文件.
- 快速书写常见的 Kotlin 代码 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- unity, 对于Debug.Log输出的log,可以双击定位到代码
unity, 对于Debug.Log输出的log,可以双击定位到代码
- [易学易懂系列|rustlang语言|零基础|快速入门|(16)|代码组织与模块化]
[易学易懂系列|rustlang语言|零基础|快速入门|(16)|代码组织与模块化] 实用知识 代码组织与模块化 我们知道,在现代软件开发的过程中,代码组织和模块化是应对复杂性的一种方式. 今天我们来 ...
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现地图定位时的地点微调功能
Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 二.地点微调代码 VB: Dim ...
- dSYM atos crash log 定位到代码行的方法(转)
做iOS开发的时候,常常会遇到crash,需要分析call stack的时候.有时候App在别人的设备崩溃,把crash report在自己的机器上打开,Xcode没有自动的进行符号化.这时候就需要自 ...
随机推荐
- PostgreSQL的xlog实验一
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 一,从initdb开始,initdb执行结束 ...
- [NOI2016]区间 线段树
[NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...
- Flutter - Error: 'xxx' is imported from both package...
Compiler message: lib/main.dart:77:32: Error: 'Toast' is imported from both 'package:easy_alert/src/ ...
- kali 2018.1安装教程
00x01 摘要 Kali-linux系统,渗透测试人员的利器,其官网自称 OurMost Advanced Penetration Testing Distribution, Ever. 永远是最 ...
- 从零搭建HBase集群
本文从零开始搭建大数据集群,涉及Linux集群安装搭建,Hadoop集群搭建,HBase集群搭建,Java接口封装,对接Java的C#类库封装 Linux集群搭建与配置 Hadoop集群搭建与配置 H ...
- (2017)你最不建议使用的Python Web框架?
https://www.sohu.com/a/164042813_737973 挺有意思的 经过一周的Django学习,以及对比,最终选定了以Flask入手来学习Python web开发.
- python OptionParser模块使用
OptionParser是python中用来处理命令行的模块,在我们使用python进行流程化开发中必要的工具 Optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posi ...
- 013-- mysql常用的查询优化方法
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句 ...
- CF100015C
主要找到环上任意一条边,有比较dis(u,v),dis(u,a)+w+dis(b,v),dis(u,b)+w+dis(a,u) 然后,然后没了 lca求dis(u,v):dis(u,v)=dis[u] ...
- 【坚持】Selenium+Python学习记录 DAY11
2018/06/1-2018/06/4 参考资料: [菜鸟教程](http://www.runoob.com/python3/python3-examples.html) [Python解惑:True ...