我们的一些网络服务器托管着不少网站。在日常活动中,这不会产生太大影响,因为所有页面的传输速度都相当快,而且服务器的资源也分配得当。
但是,当主机需要重新启动(例如进行系统更新)时,预热所有网站可能需要花费相当长的时间——有时需要超过一个小时才能完成所有预热。大概是因为十多个网站试图抢占 CPU 时间进行编译和加载。
在网上搜索,关于更快预热的建议都围绕着一个只托管少量网站的服务器,但是对于托管许多网站的服务器来说,有什么好的方法吗?
我们考虑尝试分阶段预热,这样在给定时间内处理的站点数量不会超过 CPU 所能容纳的数量——这意味着最后一个站点可能不会很快准备好,但第一个站点将很快准备好。这比全有或全无的免费模式要好得多。
IIS 启动时提供分阶段预热吗?
答案1
预编译您的网站将显著减少预热延迟,还可以避免编译期间偶尔发生的许多间歇性竞争条件。您还可以将 IIS 8 配置为在更新时立即预加载每个网站,但如果您的 CPU 超载,这可能不是一个好选择。听起来你可能只是需要更多的 CPU。根据经验,我可以告诉你,如果你的 CPU 在 10 分钟分辨率图表上超过 75%,你的用户将体验到令人不快的延迟。
看IIS 8.0 应用程序初始化有关如何配置应用程序预加载。
编辑:热身后系统重新启动时,仍然强烈建议进行预编译,但有一个不同的配置选项可以在第一个请求之前启动所有站点(请参阅下面的参考)。在 IIS 8 上,您可能仍希望执行应用程序级启动(它将命中特定页面,这允许您预热缓存并加载动态依赖项,而无需在您的 中手动执行此操作Application_Start
。这种类型的重新启动应在非峰值负载期间进行,并且使用负载平衡器的多台服务器通常是避免用户受到预热延迟影响的方法。您不必使用昂贵的硬件负载平衡器,Windows 内置的负载平衡器对于小商店来说没问题。当您即将开始维护时,您需要排空要重新启动的服务器,等待请求完成(任意长的时间),进行维护,然后在负载平衡器中重新启动服务器,然后对另一台服务器重复此操作。如果您的流量如此之大,以至于通过网络广播它是一个问题,您可能需要为 Web 服务器设置一个单独的专用子网或一个处理 ICMP 的路由器。
看为应用程序池配置自动启动 (IIS 7)如何配置系统重启后应用程序自动启动。
答案2
另一件需要考虑的事情是检查每个站点的 web.config 文件中编译元素的属性“batch”是否设置为 true。MSDN 文档
这会指示 asp.net 一次性(批量)编译您网站上的所有页面,这可能会非常慢。如果您将其设置为 false,则只有收到请求的页面才会被编译,但只会编译一次。(除了预先编译 /app_code 中的所有内容)。因此,您需要将大量网站上的大量页面的大型前期编译过程转换为偶尔一次性编译全天请求的页面。这大大缩短了启动时间。
再次,如果有可用资源,预编译、多台服务器/负载平衡将会很棒。