【问题标题】:Web site takes unusually long time to start the first time it is accessed, (Up to 68 seconds in total)网站第一次访问时启动时间异常长,(总共最多 68 秒)
【发布时间】:2011-06-03 14:47:29
【问题描述】:

我有一个 ASP.Net 应用程序,它在第一次被访问时需要很长时间才能启动。我做了一些跟踪,发现这个函数花费了 57 秒:

Boolean System.Web.Compilation.WebDirectoryBatchCompiler.CompileNonDependentBuildProviders(ICollection)

该函数依次调用以下函数 6 次:

Void System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder(AssemblyBuilder)

我的问题是System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder 做什么?我的 Web 应用程序已经编译,我不知道它为什么在启动时进行任何类型的编译工作。这是正常的吗?有什么我不知道的事情吗?

【问题讨论】:

  • 您在部署之前是否预编译了您的 Web 应用程序?见链接msdn.microsoft.com/en-us/library/bb398860.aspx
  • @1stein 我正在使用web application 项目,而不是web site 项目,所以它应该已经将所有内容编译到BIN 子目录中。

标签: asp.net iis


【解决方案1】:

在启动 ASP.NET 应用程序时会发生很多引导。这包括启动工作进程、加载到AppDomain 的程序集以及编译当前目录中的文件。这个批量编译过程是按文件夹进行的,这意味着如果我第一次请求/,批量编译器将扫描文件夹以查找支持的类型,编译它们并缓存结果。这仅在根 / 文件夹内完成。我对另一个 /OffRoot 文件夹的第一次请求将导致另一个批处理编译。

如果您有一个预编译的站点,运行时仍会执行这种类型的扫描,但会确定它不需要编译任何内容。

预编译的网站和编译的 Web 应用程序之间有一个重要的区别。预编译的网站会提前完成第一个实例的编译,因此它只需将程序集加载到它需要的AppDomain 中。使用已编译的 Web 应用程序,您已经编译了基础源代码,但未编译视图 (.aspx) 文件,因此它仍会进行首次编译(动态编译)。

【讨论】:

【解决方案2】:

AFAIK,ASP.NET 是基于 .NET 的服务世界。当然,这意味着编译实际上有两个部分。一种是将源代码编译为 .NET 字节码格式。其次是实际转换为适合在您的系统上实际运行的格式,通常以即时方式进行。这与 Java 类似,但在底层有很多不同。

问题在于它目前正在预先进行 JITting,这是设计使然。让 ASP.NET 应用程序启动并正常工作可能需要一段时间,这就是您所看到的那一刻。我确实相信有一种方法可以在有人实际访问该站点之前启用预 JITting,但我不确定具体的方式。希望有人会发布/链接到执行此操作的实际方法。

【讨论】:

    【解决方案3】:

    检查 index.aspx 或 default.aspx 以查看是否有任何 Web 应用程序。有时查找文件需要时间,而编译只是第一次需要一些时间。

    【讨论】:

    • 这没有任何意义。那么为什么框架会在函数CompileNonDependentBuildProviders 上花费57 秒呢?另请注意web site 项目和web app 项目之间存在差异。我认为 Matthew Abbott 解释了为什么会发生这种情况。尽管 Web 应用程序背后的代码已编译,但 .aspx 部分并未编译,这就是服务器第一次启动时受到影响的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2010-09-06
    • 2010-12-25
    相关资源
    最近更新 更多