恩施网站建设模板,济南网站建设(力选聚搜网络),百色网站建设,济南设计公司招聘信息前言新建一个ASP.NET Core Web API项目#xff0c;使用命令行方式启动#xff0c;连续发送多次请求。从下图的时间线可以发现#xff0c;第一次执行#xff08;116ms#xff09;比后面的#xff08;2ms#xff09;慢了很多:在这100多ms中#xff0c;Web API到底做了些什… 前言新建一个ASP.NET Core Web API项目使用命令行方式启动连续发送多次请求。从下图的时间线可以发现第一次执行116ms比后面的2ms慢了很多:在这100多ms中Web API到底做了些什么示例代码为了更好定位Web API执行情况示例Controller代码如下[HttpGet]
public string Get()
{Thread.Sleep(10);var now DateTime.Now;while ((DateTime.Now - now).TotalMilliseconds 10){}var result HttpContext.TraceIdentifier;Thread.Sleep(10);return result;
}
Thread.Sleep用于将框架代码和业务执行代码执行时间分开while循环用于延长业务执行时间方便找到业务代码PerfViewPerfView是一款免费的性能分析工具可帮助排查CPU和内存相关的性能问题。从https://github.com/Microsoft/perfview/releases下载最新版本PerfView并启动。配置点击主界面上的“Collect data machine wide”链接打开收集数据窗口为了记录所有操作需要设置“CPU Sample Interval”为较小值0.125。收集使用命令行方式启动Web API点击收集数据窗口的“Start Collection”按钮执行Web API请求再点击“Stop Collection”按钮。收集完成后会生成.etl.zip文件双击“CPU Stacks”会打开“Select Process Window”选择进程窗口因为PerfView实际收集了所有进程的性能数据。选择Web API对应的进程点击“OK”按钮。火焰图在打开的窗口中选择“Flame Graph”(火焰图)选项卡,上方的“GroupPats”选择“[group class entries] {%!}.%(class $1;{%!}::class $1”可以看到如下效果火焰图是用来展示CPU的调用栈的图形y轴表示调用栈每一层都是一个函数。调用栈越深火焰就越高顶部就是正在执行的函数下方都是它的父函数。x轴表示每个函数相对执行的时间长短。speedscope由于调用的函数较多火焰图并不能很清晰地反映。这时我们可以使用speedscope一个交互式火焰图可视化工具帮助我们分析。选择菜单File-Save View As文件类型选择“speed scope”。打开网站https://www.speedscope.app/将刚才保存的文件导入效果如下图顶部是线程列表下面是所选线程对应的火焰图可以看到它的堆栈顺序与PerfView相反是从上到下的。很容易定位到Web API执行的线程因为可以看到Thread.Sleep留出的2段空白。分析图中相同的颜色块表示同一函数我们只需要找到和业务代码同一行颜色不同的位置就表示处于不同方法调用中。先看业务代码执行前从上往下看很快就定位到一个运行时间较长的位置执行的是Http1Connection.TryParseRequest方法耗时11.85ms可见重用连接是非常有必要的。下面是找到的部分耗时比较大的方法执行前Microsoft.AspNetCore.Routing.Matching.DfaMatcherFactory.CreateMatcher - 22.73msMicrosoft.AspNetCore.Mvc.Infrastructure.ActionInvokerFactory.CreateInvoker - 30.15ms执行后Microsoft.AspNetCore.Mvc.Formatters.TextOutputFormatter.WriteAsync - 5.79ms结论后面请求快的原因也可以解释了比如重用Http连接方法内部缓存了结果DfaMatcherFactory调用了DataSourceDependentCache这也为提高我们自己程序的性能指明了思路。PerfView speedscope确实能够帮助我们分析性能理解代码执行情况。你还不赶快安排上如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“记住我