应用程序池回收后,如何预热asp.net mvc webapp?


23

我正在IIS 8.0中运行ASP.NET MVC Web应用程序。我的应用程序需要在接受请求之前进行预热。我们已经有了一个在部署新代码时自动预热应用程序的过程。但是,我们看到周期性的“应用程序池回收”事件导致未对应用程序进行预热。

是否存在检测应用程序池回收事件并执行脚本或某些代码的最佳实践?

Answers:


55

您可以执行以下几项操作:

1.应用程序初始化

您可以使用IIS 8.0随附的应用程序初始化模块

你可以在你里面有这样的东西 web.config

<applicationInitialization
     doAppInitAfterRestart="true" >
   <add initializationPage="/" />
</applicationInitialization>

initializationPage="/"每当您的应用自动启动时,这会将请求发送到您的应用的根目录()。

您还可以为应用程序池配置启动模式,Always Running这意味着每次IIS重新启动时,它都将确保立即启动您的应用程序池(如果右键单击应用程序池,则Advanced Settings

在此处输入图片说明

以及Preload您自己的网站(右键单击该网站,Manage Site然后Advanced Settings

在此处输入图片说明

2.禁用空闲超时

另外,您可以通过将Idle Time-out应用程序池的in更改为0(无限)来禁用idleTimeout(默认情况下,IIS在活动20分钟后IIS将关闭该应用程序)

在此处输入图片说明

3.禁用定期回收

Regular Time Interval (minutes)默认关闭IIS会每29小时回收您的应用程序一次。

在此处输入图片说明

对于


3
这些设置的缺点的评论将不胜感激。当然,有一个原因是它们不是默认值。
user42134 2015年

2
当然,如果您在同一IIS框中运行多个站点,则会消耗大量内存,因为所有站点始终都处于活动状态,这导致站点密度非常低。同样,也无法防止应用程序中的内存泄漏。请记住,IIS是在托管语言开始流行于Web之前出现的,并且许多应用程序正在运行本机处理程序,如果长时间运行,它们会陷入内存泄漏和怪异状态。这样做是为了帮助由于应用程序问题而不得不在半夜醒来以重置服务器的系统管理员。它们仍然是默认值,主要是出于向后可比性的原因
ahmelsayed,2015年

1
IIS 7.5中的替代方法-Windows Server 2008 R2
Kiquenet

2
您可以获取IIS 7.5 的应用程序初始化模块,以使#1正常工作。#2和#3按原样适用于IIS 7.5
ahmelsayed,2015年

1
仅供参考,以供使用此方法的人们使用:applicationInitialization进入<configuration><system.webServer>
Paul

1

从我的经验来看,启用AlwaysRunning和Preload并不会很快。等待时间最多的是动态编译(可以使用aspx precompile修复),并将程序集加载到内存和缓存中。

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.