使用 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 跳过。
你也可以在安装的时候选择 "Visual Studio Integration",这样就会与 VS 集成,在分析代码的时候可以快速跳转到相应的代码行。
2.使用与分析
dotTrace 使用比较方便,本身支持 .NET Core 分析,分析时只是会有四种不同的分析模式,这里大概讲解一下各种分析模式的区别。
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 项目。
当然,你也可以勾选上 Advanced ,配置诸如启动参数之类的东西,之后点击 Run 则开始进行分析了。
这里右下角的 Get Snapshot and Wait
点击之后呢,就会获取到快照文件了,当然现在先不慌,我们先来测试一下我们要测试的接口。
比如说我这里有一个 TestMethod 方法,其代码如下:
public class TestApplicationService : ApplicationService
{
private readonly IRepository<SysSystem> _tempRep;
public TestApplicationService(IRepository<SysSystem> tempRep)
{
_tempRep = tempRep;
}
public async Task<string> TestMethod()
{
var systems = _tempRep.GetAll().ToList();
foreach (var system in systems)
{
system.Status = 10;
await _tempRep.UpdateAsync(system);
}
int i = 0;
for (int j = 0; j < 10000; j++)
{
i += j;
}
return systems[0].SystemCode;
}
}
现在我们通过 SwaggerUI 调用这个接口,看需要多长时间。
可以看到平均时常都需要 300ms ,现在我们点击 GetSnapshot and Wait 按钮,会弹出分析窗口,并且我们随时可以通过再次点击 Start 按钮,继续分析。
2.2 分析代码
2.2.1 概览信息
Tracing 分析的界面比较简单,一个 All Calls 页签与 Overview (概览) 的页签,首先我们大致看一下概览窗口。
可以看到他给我们标识了用户代码执行周期最长的一些地方,其次也用柱状图很直观地体现了耗时最长的代码分类。
右侧则提列了一些快照的信息与运行时的环境信息,以便用户作为参考。
2.2.2 Threads Tree (线程信息)
本窗口主要的作用是分析应用程序里面发生的所有的线程活动,主线程有一个 图标,而终结器线程则是拥有一个 图标,剩下的都是线程池内部的工作线程。
在这里我们以主线程为例,分析一下其具体内容所表达的意思。
- Main:代表不带命名空间的方法简称。
- 99 . 99 %:代表该方法针对于整个线程运行时间所占的百分比,这里的意思就是 Main 方法占用了整个主线程运行时间的 99.99 %。
- 523,732 ms:代表该方法与子方法执行的总时间。
- 1 call:方法在堆栈上所被调用的次数。
- XXX.Web.Host.Startup.Program.Main(string[] ):被调用方法的全称,
2.2.3 Call Tree (调用树)
一般我们使用本页面的时候会多一点,这个页面会显示在所有线程中的所有被调用的方法。其每一个根节点代表的是每一个线程所执行的一个根函数,而下面每一个节点则代表其根函数内部调用的子函数的相关性能分析信息。
那么我们如何快速定位我们刚才测试的接口呢?
按下 Ctrl+F ,会弹出搜索框,在里面输入我们所编写的接口方法名字,按下回车就会快速定位了。
之后我们会看到如下内容:
通过展开节点我们可以知道最耗费时间的方法,即为 GetAll 方法,当点击节点的时候,右侧也会定位到相应的代码位置。
这里可以看到整个 GetAll 方法使用了 1015ms 的时间,这是为什么呢?你可以看到在其右侧有一个 8 calls ,这个时间是 8 次调用总共所花费的时间。
右键节点,你可以通过 Properties 可以看到该方法的平均执行时间:
可以看到其自身只花费了 8.3 μs,说明真正执行缓慢的还在其更深层,这里就不再往里面跟了,如果需要更加详细的性能报告,可以不使用 Tracing 模式,而使用 Line-by-line 模式来进行分析。
2.2.4 Plain List (简单列表)
以平铺的方式展示所有被调用过的方法列表,让你分析具体代码。
2.2.5 Hot Spots (热点跟踪)
该视图会列举出所有耗时最长的方法。
3.参考资料
CSDN:https://blog.csdn.net/weixin_38208401/article/details/75645021
使用 dotTrace 分析 .NET Core 代码问题的更多相关文章
- 使用 SonarQube 来分析 .NET Core 项目代码问题
0.介绍 Sonar 是一款开源的代码分析工具,可能有很多人已经用过,本篇文章主要是讲解如何在 Docker 里面安装 Sonar 并且用其来分析 .Net Core 项目. Sonar 是一个用于代 ...
- SonarQube系列二、分析dotnet core/C#代码
[前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...
- .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量
随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...
- Windows下使用doxygen阅读和分析C/C++代码
Windows下使用doxygen阅读和分析C/C++代码 转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Sou ...
- 在Mac上使用Visual Studio Code开发/调试.NET Core代码
.Net Core 1.0终于发布了,Core的一大卖点就是跨平台.这个跨平台不只是跨平台运行,而且可以跨平台开发.今天抽空研究了下在Mac下如何使用VS Code来开发.NET Core程序,并且调 ...
- 仅个人兴趣,自己通过搜索他人的成果,结合自己的理解,来分析discuz的代码。
仅个人兴趣,自己通过搜索他人的成果,结合自己的理解,来分析discuz的代码. discuz 版本: 3.2
- Mac上使用Visual Studio Code开发/调试.NET Core代码
Mac上使用Visual Studio Code开发/调试.NET Core代码 .Net Core 1.0终于发布了,Core的一大卖点就是跨平台.这个跨平台不只是跨平台运行,而且可以跨平台开发.今 ...
- 手机自动化测试:Appium源码分析之跟踪代码分析九
手机自动化测试:Appium源码分析之跟踪代码分析九 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...
- 手机自动化测试:Appium源码分析之跟踪代码分析八
手机自动化测试:Appium源码分析之跟踪代码分析八 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...
随机推荐
- Java中子类对象初始化的过程
Java中的继承机制看似简单,实际上包含了很多细节.最近在刷题过程中屡屡跳坑,于是自己仔细再学习了一下Java中子类初始化的细节,与大家分享. class Father { Father(){}; } ...
- js电子表
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- # 2019-2020-4 《Java 程序设计》结对项目总结
2019-2020-4 <Java 程序设计>结对项目阶段总结---<四则运算--整数> 一.需求分析 实现一个命令行程序 要求: 自动生成小学四则运算题目(加,减,乘,除): ...
- JQuery跳出each循环的方法
一.jquery each循环,要实现break和continue的功能: break----用return false; continue --用return ture; 二.jquery怎么跳出当 ...
- springboot整合redis-sentinel支持Cache注解
一.前提 已经存在一个redis-sentinel集群,两个哨兵分别如下: /home/redis-sentinel-cluster/sentinel-1.conf port 26379 dir &q ...
- s6-9 TCP 定时器
TCP 定时器管理 重传定时器(retransmission timer,Positive ackn. with retransmit) 最重要的定时器 TCP 定时器管理 持续定时器(per ...
- android判断密码首字母大写正则表达式
判断首字母大写"[A-Z]\\w+" \\w所有字符 \\d所有数字
- HTML和CSS初级前端面试题汇总(持续补充)
1.浏览器内核 IE:trident Firefox:gecko Safari:webkit Opera:以前是presto,现在是Blink Chrome:Blink 2.HTML文件开头的DOCT ...
- 内存栅栏(memory barrier):解救peterson算法的应用陷阱
最近一个项目中用到了peterson算法来做临界区的保护,简简单单的十几行代码,就能实现两个线程对临界区的无锁访问,确实很精炼.但是在这不是来分析peterson算法的,在实际应用中发现peterso ...
- 转 多租户SaaS架构
当使用Techcello框架开发云端多租户SaaS应用程序时,它继承了经过验证和测试的架构蓝图和工程结构.但开发人员仍然会保留灵活性,自由和控制权,以修改和扩展能力以适应其应用要求.此外,SaaS平台 ...