为什么每次重新启动后,我的本地.NET站点都需要一些时间才能首次加载?[关闭]


27

我正在开发基于.NET平台的网站。我通常将这些站点部署在本地IIS上,以便在上线之前对其进行测试并查看其功能。但是,每次我重新启动Windows时,站点似乎都需要很长时间才能首次运行。

我了解JIT,也知道这个问题,但是它不能回答我的问题。

每次重新启动Windows都会发生JIT吗?它与w3wp.exe进程的创建有关吗?为什么站点在每次重新启动后对第一个请求的响应如此缓慢?


3
这就是所谓的“冷启动”之类的东西。系统必须将w3wp加载到内存中,这也需要所有相关的dll,可能是JIT东西,处理导入表,从磁盘读取数据,因为它不在RAM缓存中,等等
。–编码器

@Coder,为您的评论+1。但是,请您在回答中解释更多,以便我和其他开发人员可以从中受益。:)
Saeed Neamati 2011年

IIS不是我的专长,所以我希望有人能给出更好的答案。这是我不久前开始的类似主题stackoverflow.com/questions/3807791/cold-startup-optimization也许会有所帮助。
编码器

4
这个问题似乎离题,因为它与实现问题有关,而与概念性编程问题无关。

Answers:


32

这个问题是JIT编译的。应用程序池需要一些时间来构建库,然后才能开始处理它们。可以通过使用预热脚本来加快速度,但这是需要发生的事情。它还取决于您使用的是网站还是Web应用程序项目。每个页面的网站都是JIT网站,因此第一命中速度很慢,每个新页面命中都需要额外的编译时间。Web应用程序项目是经过预编译的,因此不会遭受严重的打击,但是仍然需要加载库。您拥有的库/工具越多,受到的打击就越严重。以下是一些讨论热身的链接:

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://blogs.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx https://stackoverflow.com/questions/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -向上脚本/


6
这在大多数情况下是正确的,但是在编译和拼版之间有一个区别,在这个答案中并不清楚。Jitting正在将.NET字节码编译为机器代码。实际上,ASP.NET 甚至在Web应用程序项目中都在编译这些网页(除非您使用aspnet_compiler)。所有这么多的编译/构建时间,再加上jitting和库加载时间,就是为什么它这么慢。
2011年

JIT仅代表即时。除了正在编译的代码的时间和数量之外,“ jitting”和“ compiling”之间没有区别。另外,JIT编译仅针对每个未访问的代码进行,而不必针对每个页面进行。如果他们使用相同的模板,例如,则不需要编译。当然,更多的库导致更多的编译时间的说法是完全正确的。
Cornelius

9

对第一个请求的反应较慢是因为IIS仅在其第一个传入请求上启动/加载站点或应用程序池。在固定的时间后,没有新的传入请求到达服务器IIS再次停止该站点(应用程序池回收)。

ASP.NET 4.0具有一项称为自动启动的新功能。使用此功能,您可以将应用程序池或单个站点设置为在任何请求之前启动自己。这是在启动时间(IIS启动时)或更新ASP.NET站点(停止站点)时触发的。

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

您需要IIS 7.5才能使用它。

例如,当自动启动启动时,还有一个选项可以执行某些额外的任务。将数据预加载到缓存中。


通常,您在将完整站点放到Web服务器上之前先对其进行编译,因此无需在第一次请求时就对代码进行任何编译。JIT仅用于使用App_code文件夹的网站,在该网站上您与网站一起发布源代码。
Stief 2011年

2

问题的一部分还在于GAC。图书馆每次加载时都需要进行安全检查-这意味着要执行整个加密类型的工作,这会使事情变得很慢。早在MS之前,就有关于WPF性能的讨论描述了此问题-他们的回答是“如果不能帮忙,不要在GAC中放东西”。


1
这应该是“能帮助它”避免双重否定
理查德·绍洛伊

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.