2012-06-06 27 views
4

我试图确定一个很长的(imho)ASP.NET应用程序初始启动的原因。ASP.NET启动性能分析网络

该应用程序使用各种第三方库,并且我确信可以合并很多引用,但是,我试图找出(并归咎于)dll以及它们对扩展启动过程有多大贡献。

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

为了清楚我正在寻找的性能范围,这是从第一次请求到最初的Application_Start方法被击中的时间。

那么我从哪里开始获取关于哪些DLL被加载的信息,以及它们需要加载多长时间,以便我可以尝试将成本/收益放在一起,以便我们需要解决/合并。从能力的角度来看,我一直在使用JetBrains dotTrace一段时间,并且我清楚如何在应用程序中对应用程序进行基准测试,但看起来这是应用程序代码之外的,并且因此超出了我目前所知的范围。

我在找的是关于如何在我的代码中获得第一个入口点之前发生的情况的方法。

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

注2:硬件超过规模足够大,并在功能方面分开,所以我相当肯定,这不是问题。

+3

请与“这是项目*不可接受*”或“这是*我看来不可接受*”,因为答案将是显着不同的决定:一个是什么(如果有的话)做,以实现生产应用程序的目标,另一个 - 如何娱乐/教育你自己的负载性能。 –

+0

2-5分钟的启动时间可能会同时满足这两个标准。如果应用程序域回收并且服务停止2-5分钟,我无法想象任何可以接受的开发人员*或*项目。 –

+0

我会更新的问题,这是Application_Start方法中被击中前的时间。 – Martin

回答

2

独立答案/调试启动代码:

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

一个棘手的一点是,w3wp进程的第一个请求会自动启动一个应用程序,如果你的工具不支持连接时,它开始它使问题调查您的应用程序的启动代码来处理。

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

用2-5分钟耽误你可能甚至不需要探查 - 只需连接Visual Studio调试器上面的方式提出,并随机触发你的网站的加载过程中“打破了所有”数次。很可能代码的最慢部分将在多个线程之一的堆栈中。另外注意调试输出 - 可能会给你一些线索发生了什么。

您还可以使用WinDbg捕捉类似方式,所有线程的堆栈(可能比VS多光路)。

+0

我会尝试其中的一些,然后一旦我确定它捕获了正确的信息,我就会将其标记出来。 – Martin

+0

似乎是NH导致的问题...将第二个应用程序添加到相同的appPool允许我查看使用dotTrace的东西。 – Martin

0

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

在C#中静态变量在初次访问类型时被初始化。我建议使用sql分析器,并查看在应用程序启动时执行的查询是什么,并从那里看到什么是初始化昂贵的对象。

+0

这是我已经采取的路线,并且似乎没有成为可能很多,而其中没有任何攫取巨大的数据集。 – Martin

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中花费的时间方法。

+0

我用dotTrace来分析从的Application_Start开始的代码,但它需要2-5分钟,达到这一点。也许我没有设置正确的dll的初始化? – Martin

+0

你是否控制(主要)DLL的来源?如果是这样,你可以添加一些简单的日志语句......不幸的是,在年龄方面还没有使用dotTrace。 –

+0

我做控制网站的代码,不幸的是,这个问题似乎站点代码之前。否则,我会认为dotTrace会捕获它。 – Martin

1

娱乐选择检查以及分析:

  • 轮廓的一切,加上时间跟踪一切,日志信息
  • ,如果你有需要在启动时收集了很多ASPX的意见(我认为这是默认为发布配置)比需要一些时间
  • 引用Web服务或其他XML序列化相关的代码将需要编译序列化程序集,如果没有任何存在尚未
  • 访问远程服务(包括lo CAL SQL)可能需要的服务启动中的应用也
  • 积极的缓存/远程服务可能需要缓存
  • 的每个人口

生产:

  • 什么是启动时间的目标是什么?先找出它,否则你将无法达到它。
  • 什么是您愿意支付的价格以减少启动时间。增加1-10个服务器可能比花费数月的开发/测试时间和延迟产品便宜。
  • 考虑多台服务器,用温水电话滚动重新启动,Web园
  • 如果数据库对象的或一般的缓存问题考虑现有的分布式内存缓存......上分析
+0

+1,不错的列表... –

+0

我喜欢这个列表,第一个列表有一些我没有考虑过的东西(Serialization集合,编译ASPX页面)。然而,我正在寻找的是能够了解每个列表与整个启动过程相关的成本。 – Martin

+0

我已经发布了关于调试/配置文件ASP.Net启动的单独答案。 –