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

时间:2017-03-01 07:44:42

标签: iis iis-7.5 iis-8

最近我们想要满足第一次请求的IIS缓慢加载问题,在我做了一些研究之后,我发现IIS7.5 +有一个名为" Application Initialization"这可能是我需要的。

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

使用默认的IIS设置

  1. 20分钟后应用程序池空闲
  2. 相应的工作进程被终止
  3. 第一个请求来自
  4. IIS开始创建新的工作进程
  5. IIS开始加载应用程序
  6. 客户端可以在加载应用程序后看到
  7. 第4步,第5步提出第一个请求不那么敏感。

    设置应用初始化

    1. 20分钟后应用程序池空闲
    2. 相应的工作进程被终止
    3. IIS开始创建新的工作进程
    4. IIS开始通过"假冒"加载应用程序请求
    5. 第一个请求来自
    6. 客户端可以在加载应用程序后看到
    7. 现在第一个请求是响应式的,因为它确实不是对服务器的第一个请求,有时候会出现"假的"请求启动应用程序的加载。

      我想知道的是:

      我的理解是否正确?

      当设置应用程序初始化时,工作进程仍然被终止,但是在它之后立即创建一个新进程,是不是这样?

2 个答案:

答案 0 :(得分:2)

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

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

  1. 您需要将与网站关联的应用程序池的 startMode 设置为 AlwaysRunning
  2. 您需要在ApplicationPool上的某个路径(网站路径)上将 preloadEnabled 设置为true
  3. 步骤1告诉IIS在重新启动或IISReset时自动重新启动IIS工作进程。 (您可以在TaskManager中轻松查看此操作 - 仅执行步骤1并执行IISReset,您应该看到现有的W3WP.exe进程被删除并且正在创建一个新进程)

    步骤2告诉IIS制作初始假/伪请求,该请求将执行Web应用程序的所有必需初始化。例如。对于ASP.NET应用程序,这实际上将触发所有ASP.NET文件的编译,以便下一个请求 - 对页面的实际第一个请求不会遇到与应用程序初始化相关的长时间延迟。

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

    此处的官方文件:

    IIS 7.5

    IIS 8.0

答案 1 :(得分:1)

根据我的经验,您的理解是正确的。我在2014年的性能测试场景中首次遇到此功能。我将自定义编码的ping部分编入监视作业:O

  

“应用程序初始化模块基本上允许您打开   在应用程序池和站点/ IIS应用程序上预加载   实际上,一旦通过IIS管道发出请求   应用程序池已启动。这意味着有效的你   ASP.NET应用程序立即生效,Application_Start被触发   确保您的应用始终保持正常运行。“ - Rick Strahl

Official detailed docs位于MSDN网站上,我认为在配置方式上IIS 7.5和8.0之间没有太大的变化。