【问题标题】:ASP.NET startup Performance profiling webASP.NET 启动性能分析网络
【发布时间】:2012-06-07 04:20:21
【问题描述】:

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

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

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

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

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

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

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

注意:我知道我可以在回收/升级时调用默认页面来进行初始加载,但我宁愿解决实际问题,而不是纸上谈兵。

注意 2:硬件在功能方面已经足够扩展和分离,因此我很确定这不是问题。

【问题讨论】:

  • 请在“这是不可接受的项目”或“这是不可接受的我的意见”之间做出选择,因为答案会截然不同:一个是(如果有的话)为实现生产应用程序的目标而做的事情,另一个 - 如何自娱自乐/教育自己关于负载性能。
  • 2-5 分钟的启动时间可能会满足这两个标准。如果应用程序域回收并且服务关闭了 2-5 分钟,我很难想象任何开发人员项目会认为这是可以接受的。
  • 我会更新问题,这是 Application_Start 方法被命中之前的时间。
  • 您是否有机会使用实体框架? EF 的视图创建可能需要几分钟时间。
  • NHibernate...但我想这是同一个问题...我相信这会提出以下流程。

标签: c# asp.net performance iis


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我会尝试其中的几个,然后我会在确定它捕获正确的信息后立即对其进行标记。
  • 似乎是 NH 导致了问题...将第二个应用程序添加到同一个 appPool 允许我使用 dotTrace 查看内容。
【解决方案2】:

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

Do external references slow down my ASP.NET application? (VS: Add Reference dialog)

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

由于加载时间可能不是 IIS 工作进程解析引用,所以我会求助于传统的应用程序分析器(例如 Jetbrains、Antz、dotTrace)来查看 DLL 初始化以及 Application_Start 方法中花费的时间.

【讨论】:

  • 我使用 dotTrace 从 Application_Start 开始分析代码,但需要 2-5 分钟才能到达该点。也许我没有正确设置来查看 dll 的初始化?
  • 您控制(主要)DLL 的来源吗?如果是这样,您可以添加一些简单的日志记录语句......不幸的是,已经很久没有使用 dotTrace 了。
  • 我确实控制了站点代码,不幸的是,问题出现在站点代码之前。否则我会认为 dotTrace 会捕获它。
  • ANTS Performance Profiler 可以对 FileI/O 进行分析,因此它会显示访问 .dll 等文件所花费的时间,演练是 here
【解决方案3】:

娱乐选项检查与分析:

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

生产:

  • 启动时间的目标是什么?先搞清楚,不然就达不到了。
  • 您愿意为减少启动时间付出多少代价。添加 1-10 台服务器可能比花费数月的开发/测试时间和延迟产品更便宜。
  • 考虑多台服务器、通过热身呼叫滚动重启、网络花园
  • 如果缓存 DB 对象或一般情况下存在问题,请考虑现有的分布式内存缓存...

【讨论】:

  • 我喜欢这个列表,第一个有一些我没有考虑或研究过的东西(序列化程序集,编译 ASPX 页面)。但是,我正在寻找的是能够了解每个列表相对于整个启动过程的成本。
  • 我已经发布了关于调试/分析 ASP.Net 启动提示的单独答案。
【解决方案4】:

尽管有大量的 dll,但我几乎可以肯定,对于一个合理的应用程序,它不会成为问题的原因。大多数时候是静态对象初始化导致启动缓慢。

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

【讨论】:

  • 这是我已经采取的路线,似乎没有那么多,也没有一个可以抓取大量数据集。
猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多