IIS7.5+:这是描述应用程序初始化功能的正确方法吗?

IIS7.5+ : Is it the correct way to describe Application Initialization feature?

最近想解决IIS第一次请求加载慢的问题,经过一番研究,发现IIS7.5+有一个功能叫"Application Initialization",可能是我需要的。

但是在尝试应用它之前我必须了解该机制,这是我的理解:

使用默认 IIS 设置:

  1. 应用程序池在 20 分钟后空闲
  2. 对应的worker进程被kill掉
  3. 第一个请求进来
  4. IIS 开始创建新的工作进程
  5. IIS 开始加载应用程序
  6. 应用加载后客户端可以看到

第 4 步、第 5 步使第一个请求响应速度不那么快。

设置了应用程序初始化:

  1. 应用程序池在 20 分钟后空闲
  2. 对应的worker进程被kill掉
  3. IIS 开始创建新的工作进程
  4. IIS 开始通过 "fake" 请求加载应用程序
  5. 第一个请求进来
  6. 应用加载后客户端可以看到

现在第一个请求是有响应的,因为它确实不是对服务器的第一个请求,有时在 "fake" 请求启动应用程序加载之前。


我想知道的是:

我的理解对吗?

设置应用程序初始化时,worker进程还在被杀死,但紧接着又创建了一个新的,是这样吗?

根据我的经验,你的理解是正确的。早在 2014 年,我就在性能测试场景中首次 运行 使用此功能。我将其 ping 部分自定义编码到监控作业中:O

"The Application Initialization Module basically allows you to turn on Preloading on the Application Pool and the Site/IIS App, which essentially fires a request through the IIS pipeline as soon as the Application Pool has been launched. This means that effectively your ASP.NET app becomes active immediately, Application_Start is fired making sure your app stays up and running at all times." - Rick Strahl

Official detailed docs 在 MSDN 站点上,据我所知,IIS 7.5 和 8.0 在配置方面没有太大变化。

大致就是这样。如您所述,如果没有应用程序初始化,一旦工作进程被终止,它不会重新启动,直到向其发送请求。根据第一个请求,启动一个新的工作进程 (W3WP.exe) 并开始加载应用程序。应用程序的这种冷启动通常会降低第一个请求的响应速度。例如。如果它是 ASP.NET 应用程序,第一个请求会触发临时 ASP.NET 文件的重新编译,这在中等规模的企业应用程序中可能需要几秒钟。

如果您查看应用程序初始化的设置,您会发现它有两个主要部分:

  1. 您需要将网站关联的应用程序池的startMode设置为AlwaysRunning
  2. 您需要在 ApplicationPool
  3. 的某些路径(网站路径)上将 preloadEnabled 设置为 true

第 1 步告诉 IIS 在重新启动或 IISReset 时自动重新启动 IIS 工作进程。 (您可以很容易地在 TaskManager 中看到这一点 - 只执行第 1 步并执行 IISReset,您应该会看到现有的 W3WP.exe 进程被删除并创建了一个新进程)

第 2 步告诉 IIS 发出初始 fake/dummy 请求,该请求将对您的 Web 应用程序进行所有必需的初始化。例如。对于 ASP.NET 应用程序,这基本上会触发所有 ASP.NET 文件的编译,以便下一个请求 - 对页面的实际第一个请求不会经历与应用程序初始化相关的长时间延迟。

虽然继续使用脚本轮询应用程序以防止其空闲的传统方法确实可以完成这项工作,但 ApplicationInitalization 模块使这项工作变得更加容易。您甚至可以让 IIS 向自定义预热脚本发出虚拟请求,该脚本不仅仅是简单的页面加载 - 提前预加载多个网页的缓存 generate/do 任何可能需要更长时间的任务等。

官方文档在这里:

IIS 7.5

IIS 8.0