【问题标题】:Is IIS Web-Garden Forced Process Initialization possible?IIS Web-Garden 强制进程初始化是否可行?
【发布时间】:2009-06-15 22:08:57
【问题描述】:

我们有一个在 IIS Web-Garden 中运行的 ASP.Net Web 应用程序——它被配置为最多分配四个进程。在我们的 Web 应用程序中,第一个访问该站点的用户会导致所有缓存项目的加载。由于我们在 IIS Web-Garden 中运行,因此最终最多需要四个初次使用的用户来为四个 Web-Garden 进程中的每一个建立缓存。此缓存构建需要 30-40 秒,我们已尝试使其更快,但不太可能再改进。

这是不可接受的,我们的任务是始终让每个人都能快速浏览网站(无需等待缓存初始化)。我想采用一种抓取网站来预热缓存的解决方案。问题是 Web-Garden 功能似乎是一个黑匣子——您无法控制 IIS 是否/何时决定在下一个 HTTP 请求命中时加载该第二、第三或第四进程。

在我看来,这似乎是一个常见问题,但寻找解决方案却收效甚微。我的问题是,有没有办法通过 HTTP 标头或其他一些构造来给 IIS 一个提示,您希望它加载或至少路由到进程 2、3、4 等?

【问题讨论】:

  • 为什么需要使用网络花园?
  • 我需要使用它们,因为工作进程没有足够的内存来承载在 32 位环境中运行的负载,而且他们不会支付升级到 64 位环境的费用。

标签: asp.net iis caching web-garden


【解决方案1】:

根据 Microsoft 工程师的说法,这在 IIS 6 中是不可能的。但是,他们在 IIS 7.5 和 ASP.Net 4.0 中添加了一个新功能,为我在这里寻找的内容提供了很好的功能。它被称为“preloadProvider”。下面是一个示例 sn-p(非常酷!)。

http://forums.iis.net/p/1158476/1907392.aspx

由于单个应用程序池可以包含多个应用程序,因此您可以通过在 applicationHost.config 文件中使用以下配置来指定要自动启动的各个应用程序:

<sites>

  <site name="MySite" id="1">

    <application path="/"

         preloadEnabled="true"

         preloadProvider="PrewarmMyCache" >

        <!--  Additional content -->

    </application>

  </site>

</sites>



<!-- Additional content -->



<preloadProviders>

     <add name="PrewarmMyCache"

         type="MyNamespace.CustomInitialization, MyLibrary" />

</preloadProviders>

在冷启动 IIS 7.5 服务器或回收单个应用程序池时,IIS 7.5 使用 applicationHost.config 文件中的信息来确定哪些 Web 应用程序需要自动启动。对于标记为自动启动的每个应用程序,IIS7.5 都会向 ASP.NET 4.0 发送一个请求,以在应用程序暂时不接受 HTTP 请求的状态下启动应用程序。当它处于这种状态时,ASP.NET 实例化由 preloadProvider 属性定义的类型(如前面的示例所示)并调用其公共入口点。 您可以通过实现 IProcessHostPreloadClient 接口来创建具有必要入口点的托管自动启动类型,如下例所示:

public class CustomInitialization :  System.Web.Hosting.IProcessHostPreloadClient

{

    public void Preload(string[]  parameters)

    {

        // Perform initialization.

    }

}

在您的初始化代码在 Preload 方法中运行并且该方法返回之后,ASP.NET 应用程序就可以处理请求了。 通过在 IIS 7.5 和 ASP.NET 4.0 中添加自动启动功能,您现在有了一种定义明确的方法,可以在处理第一个 HTTP 请求之前执行昂贵的应用程序初始化。例如,您可以使用新的自动启动功能来初始化应用程序,然后向负载均衡器发出信号,表明应用程序已初始化并准备好接受 HTTP 流量。

【讨论】:

【解决方案2】:

也许使用网络监控工具定期访问您的网络应用程序。除了能够在您的网站出现故障或未按预期运行时向您发送电子邮件/页面之外,此类工具还可以产生有益的副作用,即根据哪些页面和在哪些页面上保持您的网络应用程序“热”该工具将被配置为访问该站点的频率。

理论上,一旦所有请求都被初始化,IIS 将以循环方式跨花园分配传入请求。最好的办法是在您的应用程序中使用各种 URL 配置监控工具,这些 URL 不等于您花园中进程数量的直接倍数 - 否则相同的花园总是会受到相同子集的影响URLs,假设没有其他站点活动。无论如何,如果配置正确,经过几轮之后,您的花园应该都会变热。

【讨论】:

  • +1 好建议。我们已经有一个谷歌设备整天访问该站点,但显然 IIS 有一些关联掩码,它总是将同一源的用户引导到同一进程。我需要一种方法来保证所有 4 个过程都被加热。
【解决方案3】:

Microsoft 已经发布了一个完全符合您要求的模块。 Application Initialization Module for IIS 7.5 将通过确保您花园中的每台服务器都具有热缓存并在收到真实用户的第一页点击时做出响应来解决您的问题。

我认为最引人注目的功能是该模块还支持重叠进程回收。这意味着您可以回收、部署应用程序的新版本并重新启动单个服务器,而不会让任何用户卡在带有冷缓存的慢速服务器上。 following tutorial from IIS 8.0 包含有关如何启用重叠进程回收的分步方法。

更多详情,您可以在How to warm up an ASP.NET MVC application on IIS 7.5?阅读我对类似问题的回答

【讨论】:

  • 在发布多个问题的复制和粘贴样板/逐字答案时要小心,这些往往会被社区标记为“垃圾邮件”。如果您这样做,则通常意味着问题是重复的,因此请将它们标记为这样。
  • 我认为推荐的做法是对类似问题提供相同的答案,而不是将它们标记为重复。但我想你是对的。这两个问题不是重复的,因此它们应该得到准确的答案。我将编辑我的答案。谢谢你用这么好的方式告诉我。我还在学习 StackOverflow 方式。
  • 更新了 asnwer,严格关注 webgarden 问题,并提供相关问答的链接。
猜你喜欢
  • 2017-05-16
  • 2017-12-09
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2019-03-16
  • 2011-02-15
相关资源
最近更新 更多