使用 dotTrace 分析 .NET Core 代码问题

0.背景

在项目开发之中,前期可能主要以保证任务完成为主,对于性能优化主要在于开发完成之后再来进行。可能在测试的时候发现部分接口的代码执行时间过长,但是又毫无头绪,这个时候你就需要性能分析工具来协助你排查问题了。

常规性能分析借助于 Visual Studio 强大的性能测试工具就可以进行分析,但是这些功能只包含在企业版当中。这个时候我们就可以使用 JetBrains 的 .NET 分析全家桶来进行这个操作了,其包含内存分析(dotMemory)与性能分析(dotTrace),其实他的 dotCover(单元测试) 也是挺好用的。

1.安装与下载


1.1 下载

安装步骤较为简单,前往 Jetbrains 官网,找到 dotTrace ,点击下载即可。

其地址为 https://www.jetbrains.com/profiler/download/ ,选择自己需要的安装包形式,一般选择 WebInstaller 进行安装,当然这里推荐选择 Standalone (独立版),直接下载运行就 OK 。


1.2 安装

每个用户可以免费评估使用 10 天,当然你要使用某些补丁或者激活工具也是可以的,这里不再详述过程,只是注意一下(WebInstaller)在安装的时候选择自己需要的安装就可以了,不需要的直接选为 Skip 跳过。

640?wx_fmt=png

你也可以在安装的时候选择 "Visual Studio Integration",这样就会与 VS 集成,在分析代码的时候可以快速跳转到相应的代码行。

640?wx_fmt=jpeg

2.使用与分析

dotTrace 使用比较方便,本身支持 .NET Core 分析,分析时只是会有四种不同的分析模式,这里大概讲解一下各种分析模式的区别。

640?wx_fmt=png

Profiler Options作用与描述
Sampling通过获取 CLR 内部一个方法开始执行和结束执行的时间差来计算的分析时间。
这是最快的方法,它用于精确测量程序运行时间,但可能会丢失一些数据。
使用此配置类型可使你快速获取应用程序的的总体性能。
Tracing慢于 Sampling 的方法,但是可以准确地测量特定方法被调用的准确次数。
它是通过获取 CLR 内部一个方法开始执行和结束执行的时间差来计算的分
析时间。
Line-by-line通过收集代码执行的每条语句的时间来进行比较,它计算出的时间更加精确。
该方法适用于你已经知道性能问题大概在哪里出现,并要找到具体某一个出
现性能问题的时候。
Timeline采取抽样的方式,每隔一段时间 (10 ms),会暂停所有线程,并抓取堆栈里的
信息,然后才计算出代码执行时间差。使用这个方式可能会导致一些执行时间
少于 10 ms 的方法无法被抓取到。

一般来说我们使用的是 Tracing 来进行代码的性能分析,因为一般都是需要查看每个方法具体的调用时间。下面我就将以一个接口的实例来作为示范,看如何来排查调用缓慢的问题。


2.1 获取快照信息

首先运行 dotTrace 之后,选择 .NET Core Application,之后右侧的 Profiler Options 则选择 Tracing。最后一步则是选择需要进行检测的 dll 文件,这里我选择的是一个基于 Abp 框架开发的 ASP.NET Core 项目。

640?wx_fmt=png

当然,你也可以勾选上 Advanced ,配置诸如启动参数之类的东西,之后点击 Run 则开始进行分析了。

640?wx_fmt=png

这里右下角的 Get Snapshot and Wait 点击之后呢,就会获取到快照文件了,当然现在先不慌,我们先来测试一下我们要测试的接口。

比如说我这里有一个 TestMethod 方法,其代码如下:

640?wx_fmt=png

现在我们通过 SwaggerUI 调用这个接口,看需要多长时间。

640?wx_fmt=png

可以看到平均时常都需要 300ms ,现在我们点击 GetSnapshot and Wait 按钮,会弹出分析窗口,并且我们随时可以通过再次点击 Start 按钮,继续分析。

640?wx_fmt=png


2.2 分析代码

2.2.1 概览信息

Tracing 分析的界面比较简单,一个 All Calls 页签与 Overview (概览) 的页签,首先我们大致看一下概览窗口。

640?wx_fmt=png

可以看到他给我们标识了用户代码执行周期最长的一些地方,其次也用柱状图很直观地体现了耗时最长的代码分类。

右侧则提列了一些快照的信息与运行时的环境信息,以便用户作为参考。

2.2.2 Threads Tree (线程信息)

本窗口主要的作用是分析应用程序里面发生的所有的线程活动,主线程有一个 640?wx_fmt=png 图标,而终结器线程则是拥有一个 640?wx_fmt=png 图标,剩下的都是线程池内部的工作线程。

在这里我们以主线程为例,分析一下其具体内容所表达的意思。

640?wx_fmt=png

  • Main:代表不带命名空间的方法简称。

  • 99 . 99 %:代表该方法针对于整个线程运行时间所占的百分比,这里的意思就是 Main 方法占用了整个主线程运行时间的 99.99 %。

  • 523,732 ms:代表该方法与子方法执行的总时间。

  • 1 call:方法在堆栈上所被调用的次数。

  • XXX.Web.Host.Startup.Program.Main(string[] ):被调用方法的全称,

2.2.3 Call Tree (调用树)

一般我们使用本页面的时候会多一点,这个页面会显示在所有线程中的所有被调用的方法。其每一个根节点代表的是每一个线程所执行的一个根函数,而下面每一个节点则代表其根函数内部调用的子函数的相关性能分析信息。

640?wx_fmt=png

那么我们如何快速定位我们刚才测试的接口呢?

按下 Ctrl+F ,会弹出搜索框,在里面输入我们所编写的接口方法名字,按下回车就会快速定位了。

640?wx_fmt=png

之后我们会看到如下内容:

640?wx_fmt=png

通过展开节点我们可以知道最耗费时间的方法,即为 GetAll 方法,当点击节点的时候,右侧也会定位到相应的代码位置。

这里可以看到整个 GetAll 方法使用了 1015ms 的时间,这是为什么呢?你可以看到在其右侧有一个 8 calls ,这个时间是 8 次调用总共所花费的时间。

右键节点,你可以通过 Properties 可以看到该方法的平均执行时间:

640?wx_fmt=png

可以看到其自身只花费了 8.3 μs,说明真正执行缓慢的还在其更深层,这里就不再往里面跟了,如果需要更加详细的性能报告,可以不使用 Tracing 模式,而使用 Line-by-line 模式来进行分析。

2.2.4 Plain List (简单列表)

以平铺的方式展示所有被调用过的方法列表,让你分析具体代码。

640?wx_fmt=png

2.2.5 Hot Spots (热点跟踪)

该视图会列举出所有耗时最长的方法。


3.参考资料

CSDN:https://blog.csdn.net/weixin_38208401/article/details/75645021

相关文章:

  •  dump解析入门-用VS解析dump文件进行排障

  • dump文件解析之探索.Net的内存

  • centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)

原文地址: https://www.cnblogs.com/myzony/p/9718776.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AC自动机】前缀匹配(ybtoj AC自动机-3)

正题 ybtoj AC自动机-3 题目大意 给你一个字符串和若干匹配串,问你匹配串的前缀和字符串的最大匹配 解题思路 先把所有匹配串丢进AC自动机,然后拿字符串去跑 每次只在当前位置存下贡献,然后按bfs的倒叙传递贡献,最后再倒着跑每…

Codeforces Global Round 10

这种大场全是神仙打架,向我这种菜菜就是掉分www太难了 神仙打架,百姓遭殃。 A - Omkar and Password 分析可以知道,只要数组元素不是全部相等答案就是1,如何数组元素全部相等答案就是n。 #define IO ios::sync_with_stdio(fals…

【每日一题】7月17日题目精讲—BOWL 碗的叠放

【每日一题】7月17日题目精讲—BOWL 碗的叠放 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld题目描述 小H有n个碗需要放进橱柜,她希望将他们叠起来放置。你知道每个碗都…

基于Ocelot的gRpcHttp网关

什么是gRpcHttp网关通俗的讲就是将gRpc提供的服务以rest api的形式提供出去,不需要再单独的写一个webapi去做这件事。gRpcHttp网关好处减少不必要代码,减少中间层提高通讯效率。以前可能是这样用了gRpc网关后是这样gRpcHttp网关提供哪些功能可以直接加载…

CF917D-Stranger Trees【矩阵树定理,高斯消元】

正题 题目链接:https://www.luogu.com.cn/problem/CF917D 题目大意 给出nnn个点的一棵树,对于每个kkk求有多少个nnn个点的树满足与给出的树恰好有kkk条边重合。 解题思路 矩阵树有一个统计所有树边权和的和用法,就是把变量变成一个形如wx1wx1wx1的多项…

【AC自动机】屏蔽词删除(ybtoj AC自动机-4)

正题 ybtoj AC自动机-4 题目大意 有一个字符串和若干要删除的串(不存在包含关系),每次从前往后搜,搜到第一个要删除的串然后删掉,再从0开始搜 问你最后得到的字符串 解题思路 先把所有删除串丢进AC自动机中&#x…

Codeforces Round #665 (Div. 2)

2020/8/21 晚上打完球就22:10了,愣是没报上名(cf打不开,然后就做了一下赛后交的过了3个题 A - Distance and Axis 数学题分类讨论一下即可 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #inclu…

【每日一题】7月20日题目精讲—着色方案

来源:牛客网: 文章目录题目描述题解:代码:时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld题目描述 有n个木块排成一行,从左…

COSCon'18 面向全宇宙招募志愿者啦!

2018 中国开源年会(COSCon18-China Open Source Conference 2018) 志愿者招募工作今日正式启动!我们诚挚地欢迎开源社区的朋友们及高校的同学们加入志愿工作者团队,与国内外众多开源项目基金会、公司、大神等齐聚一堂,共襄盛举。招…

CF346E-Doodle Jump【类欧】

正题 题目链接:https://www.luogu.com.cn/problem/CF346E 题目大意 给出a,n,p,ha,n,p,ha,n,p,h,在每个ax%p(x∈[0,n])ax\%p(x\in[0,n])ax%p(x∈[0,n])的位置有一个关键点,询问是否所有相邻关键点之间的距离都不超过hhh。 解题思路 没怎么写过类欧&…

【AC自动机】病毒代码(ybtoj AC自动机-5)

正题 ybtoj AC自动机-5 题目大意 给出若干段01串,问你是否存在一个无限的01串,使得串中不存在给出的01串 解题思路 可以把给出01串用AC自动机处理,然后对每个01串的最后一位打上标记 根据AC自动机的连边性质(即若无该边&#…

AtCoder Beginner Contest 176总结

由于打球又鸽了一场&#xff0c;快开学了好好打球&#xff01;&#xff01;&#xff01;&#xff08;狗头 还是补一补 A - Takoyaki 签到题 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<a…

讲重点,看趋势——Microsoft Ignite 2018的回顾和展望

一年一度的微软技术大会——Microsoft Ignite 2018上周在奥兰多召开&#xff0c;目前已经落下帷幕。我没有去现场&#xff0c;但据说这次的盛况空前&#xff0c;创下微软之最。确实&#xff0c;这些年来&#xff0c;微软内部非常重视 Iginte&#xff0c;上至最高管理层&#xf…

P4590-[TJOI2018]游园会【dp套dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为mmm的字符串sss。 对于每个k∈[0,m]k\in[0,m]k∈[0,m]求有多少个长度为nnn的字符串满足与sss的最长公共子序列长度为kkk且不包含NOINOINOI这一个子串。 可用字符集是{N,O,I}\{N,O,I\}{N,O,I} 解…

【DP】【线段树】基站选址(luogu 2605/金牌导航 数据结构优化DP-2)

正题 luogu 2605 金牌导航 数据结构优化DP-2 题目大意 有若干个村庄在一条直线上&#xff0c;距离第一个村庄did_idi​&#xff0c;在该村庄建立基站要花费cic_ici​&#xff0c;如果在离该村不大于sis_isi​的范围内有一个基站&#xff0c;那么该村会被信号覆盖&#xff0c;…

Fake Maxpooling(2020多校第二场F)

Fake Maxpooling&#xff08;2020多校第二场F&#xff09; 文章目录题意&#xff1a;题解&#xff1a;代码&#xff1a;题意&#xff1a; 一个n * m的矩阵&#xff0c;第i行第j列的值是lcm&#xff08;i&#xff0c;j&#xff09;&#xff0c;然后给定一个 k * k的子矩阵&…

Educational Codeforces Round 94 (Rated for Div. 2)

这次做了ABCD&#xff0c;今天下午就要上学去了溜了溜了&#xff0c;早上起来补的题解。 A - String Similarity 分析可知可构造w[i]s[2*i]即可满足题意 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<string> #in…

算法工程师的危机

本文为沙漠之鹰第68篇原创文章9月20号讯飞AI同传语音造假的新闻刷爆科技圈&#xff0c;科大讯飞股价应声下跌3.89%&#xff08;不是65.3%&#xff0c;标题党文章害死人&#xff09;。 吃瓜群众纷纷感慨&#xff0c;有多少人工&#xff0c;就有多少智能。小编偷换概念玩的溜AI概…

Cover the Tree(2020多校第二场C)

Cover the Tree 文章目录题意&#xff1a;题解&#xff1a;代码题意&#xff1a; 一个无向树&#xff0c;选择最少数量的链子&#xff0c;能将树上所有边覆盖&#xff0c;答案不唯一 (1≤n≤2105&#xff09; 链子就是两点之间的边 看看样例 输入 5 1 2 1 3 2 4 2 5输出 2 2…

【DP】【树状数组】折线统计(金牌导航 数据结构优化DP-1)

正题 金牌导航 数据结构优化DP-1 题目大意 平面上有n个点&#xff0c;让你选择若干点&#xff0c;连接x坐标相邻的点&#xff0c;其中连续上升或下降的为一段&#xff0c;问你有多少中选择方案&#xff0c;使得段数为k 解题思路 设fi,j,0/1f_{i,j,0/1}fi,j,0/1​为到第i个点…