我刚刚在MSDN读到一篇博客,介绍了.NET 4.5.1引入的新应用程序池设置“App Suspend”。在什么情况下您想将应用程序池设置为“挂起”,而不是“终止”,反之亦然?如果“挂起”空闲模式比“终止”更好,那么为什么不默认使用“挂起”并摆脱“终止”空闲模式呢?
IIS 6及以上版本使用应用程序池来提供网站服务。每个应用程序池基本上都是一个单独的工作进程,可响应于该应用程序池中的所有网站的请求。它有助于将不同的网站隔离开来(资源使用、错误、安全漏洞等)。
应用程序池的结构方式之一,是默认情况下会定期“回收”或重新启动,以避免应用程序崩溃或重置内存泄漏。
导致应用程序池回收的三种主要方式如下:
回收并不是什么大问题,因为IIS将在终止旧进程之前创建新进程并传输请求,因此在处理请求时没有间隙。然而,应用程序池有一项设置,如果没有请求达到一定时间(默认为20分钟),则会完全终止该进程。
当应用程序池关闭并有新请求进来时,那么工作进程需要几秒钟的 noticeable lag (明显延迟),才能启动、加载.NET框架、编译应用程序中的任何页面并最终服务于请求。这被称为“冷启动”,可能给您的用户带来不良体验。
如果您愿意,可以禁用回收设置和基于超时时间的终止选项(我会为几个大型应用程序这样做)。但是,如果您在单台服务器上运行许多网站,并且这些网站没有连续的流量,那么您可以通过使用新的“挂起”选项来节省资源。
IIS不再完全终止该进程,而是将其移动到非常低的内存状态。这样,如果有新请求进来,则您的应用程序会即时启动,没有延迟。但是在没有流量时,它只使用极小的内存分数和CPU,因此不会对您的服务器产生任何开销。
它真正适用于运行多个站点的服务器的共享环境。如果您有持续的流量,您不会注意到差异,因为应用程序池永远不会停止,但如果您坚持使用默认设置,则强烈建议将应用程序池设置为挂起模式。请注意,这需要同时具备Windows Server 2012 R2 和 .NET 4.5.1才能工作。
以下是Visual Studio团队的Youtube视频,进一步解释此问题: https://www.youtube.com/watch?v=hXw5gyqTxoo