ASP.NET 启动性能分析网站

本文关键字:网站 性能 NET 启动 ASP | 更新日期: 2023-09-27 18:36:22

我正在尝试确定 ASP.NET 应用程序初始启动时间很长(恕我直言)的原因。

该应用程序使用各种第三方库,以及许多我确信可以合并的引用,但是,我正在尝试识别(并分配责任)dll以及它们对扩展启动过程的贡献程度。

到目前为止,启动时间从 2-5 分钟不等,具体取决于包装盒上其他东西的使用情况。 根据网站的复杂性,我认为这是不可接受的,我需要将其减少到最多 30 秒左右。

为了明确我正在寻找的性能范围,这是从第一个请求到初始Application_Start方法被命中的时间。

因此,我将从哪里开始获取有关加载哪些DLL以及加载它们需要多长时间的信息,以便我可以尝试将我们需要解决/整合的成本/收益放在一起。

从能力的角度来看,我已经使用 JetBrains dotTrace 一段时间了,我很清楚一旦我们进入应用程序,如何对应用程序进行基准测试,但这似乎超出了应用程序代码,因此超出了我目前所知道的。

我正在寻找的是有关如何在代码的第一个入口点之前了解正在发生的事情的方法。

注意:我知道我可以调用回收/升级的默认页面来执行初始加载,但我宁愿解决实际问题而不是掩盖它。

注意2:硬件在功能方面具有足够的扩展和分离性,因此我相当确定这不是问题所在。

ASP.NET 启动性能分析网站

关于分析/调试启动代码的单独答案:

w3wp 只是一个运行 .Net 代码的进程。因此,您可以使用用于普通 .Net 应用程序的所有分析和调试工具。

一个棘手的点是,w3wp 进程在第一次请求应用程序时自动启动,如果您的工具不支持在启动时附加到进程,则调查应用程序的启动代码就会出现问题。

解决它的技巧是将另一个应用程序添加到同一应用程序池。这样,您可以通过导航到另一个应用程序来触发 w3wp 创建,而不是针对已运行的进程附加/配置工具。当您最终触发原始应用程序工具时,将看到现有 w3wp 进程中发生加载。

延迟 2-5 分钟,您甚至可能不需要分析器 - 只需按照上面建议的方式附加 Visual Studio 调试器,并在站点加载期间随机触发"全部中断"几次。代码中最慢的部分很有可能位于许多线程之一的堆栈上。还要注意调试输出 - 可能会给你一些线索,说明发生了什么。

您还可以使用 WinDbg 以类似的方式捕获所有线程的堆栈(可能比 VS 更轻)。

DLL 引用根据需要加载,而不是一次全部加载。

外部引用是否会减慢我的 ASP.NET 应用程序?(VS:添加引用对话框)

如果启动需要 2-5 分钟,我会查看Application_Start中发生的情况,以及 DLL 加载后的作用。 他们是否试图连接到非常慢的远程服务? 机器是否太小,无法执行其功能(例如,在 AWS 微型实例或类似实例上运行包含大量数据的数据库以及 Web 服务器)?

由于加载时间可能不是 IIS 工作进程解析引用,因此我会转向传统的应用程序探查器(例如 Jetbrains、Antz、dotTrace),以查看 DLL 初始化时的时间花费在哪里,以及您的Application_Start方法。

娱乐选项检查以及分析:

  • 分析所有内容,为所有内容添加时间跟踪并记录信息
  • 如果您有许多需要在启动时编译的ASPX视图(我认为这是发布配置的默认视图),则需要一些时间
  • 对 Web 服务或其他 XML 序列化相关代码的引用将需要编译序列化程序集(如果尚不存在
  • 访问远程服务(包括本地 SQL)可能也需要启动服务
  • 应用程序/远程服务中的主动缓存可能需要按填充缓存

生产:

  • 启动时间的目标是什么?先弄清楚它,否则您将无法到达它。
  • 您愿意为减少启动时间付出的代价是什么。再增加 1-10 台服务器可能比花费数月的开发/测试时间和延迟产品更便宜。
  • 考虑多个服务器、通过热身呼叫滚动重启、Web 花园
  • 如果数据库对象的缓存或一般情况下是一个问题,请考虑现有的分布式内存缓存...
尽管有大量

的dll,但我几乎可以肯定,对于合理的应用程序,它不会成为问题的原因。大多数情况下,静态对象初始化导致启动缓慢。

在 C# 中,静态变量在首次访问类型时初始化。我建议使用 sql 探查器,看看在应用程序启动期间执行的查询是什么,然后从那里看看初始化成本很高的对象是什么。