【问题标题】:ASP.NET warmup/initializeASP.NET 预热/初始化
【发布时间】:2013-09-11 02:14:55
【问题描述】:

我正在尝试消除(或至少最小化)我的 .NET 应用程序的启动/预热时间。尽管这是一个普遍的问题,但我不确定如何执行此操作。

有很多关于 .NET 应用程序启动缓慢的问题。这些很容易通过池回收、工作进程启动、.aspx 文件的动态编译、JIT 等来解释。此外,在应用程序中可能需要初始化更多的东西,例如 EntityFramework 和应用程序缓存。

我找到了很多不同的解决方案,例如:

但是,我对上述任何解决方案都不完全满意。此外,我正在将我的应用程序部署到 Azure 网站(在大多数情况下),因此我对 IIS 的访问权限有限。

我知道有一些自定义的“预热脚本”使用各种方法向应用程序发送请求(例如 wget/curl)。我的想法是在我的每个 ASP.NET 应用程序中创建一个“Warmup.aspx”页面。然后我有一个预热服务,它每 5 分钟向每个站点的 Warmup.aspx 发送一个 HTTP GET。此服务可以是 Azure 中的 WorkerRole 或本地安装中的 Windows 服务。然后,Warmup.aspx 将执行以下操作:

  • 向应用程序中的每个 .aspx 文件发送一个 HTTP GET(到 动态编译页面)
    • 这可以通过使用 aspnet_compiler.exe 预编译 .aspx 页面来避免
  • 向数据库发送查询到 初始化 EntityFramework
  • 初始化应用缓存等

那么,我的最后一个问题是是否有比我的“Warmup.aspx”脚本更好的替代方案?这是一个好方法还是您推荐其他方法?我真的很想要一些可以处理上述标准的官方方法。

欢迎提出任何建议,谢谢!

【问题讨论】:

  • 您是否进行了一些测量以了解您真正想要优化的领域?应用您的更改后,您可以看到效果。这对您要避免的最终用户有什么影响?
  • 我没有准确测量,但影响取决于应用程序中有多少“预热”工作。我看到两个主要的“案例” 1)流量很小的小型空闲网站,这些网站会受到自动池回收的影响,并且在第一次请求时总是很慢(~10 秒)。 2) 有许多页面没有预编译的大型网站,在进行升级/维护或强制池回收时 - 然后所有页面都有些慢(即额外 1-3 秒),这给人一种应用程序“缓慢”的印象.我不会回避这两个问题。
  • 预编译听起来肯定会在这两种情况下都有最大的好处。除了启动时间之外,还有很多性能调整选项需要考虑; technet.microsoft.com/en-us/library/bb727104.aspx

标签: asp.net entity-framework precompiled warm-up


【解决方案1】:

【讨论】:

【解决方案2】:

您可以拥有该网站的两个实例。当您需要部署新版本并因此遇到启动周期时,请从负载均衡器轮换中删除一个实例,部署并启动它,然后将其设置为实例 2。滚动部署。

【讨论】:

  • 是的,这是一个很好的策略。然而,我的问题是如何“启动它”,正如您上面描述的那样。当我切换到升级后的实例时,它会很慢,即使我不会有任何停机时间。此外,我想避免空闲池回收(默认 20 分钟)和强制池回收(默认每 29 小时 IIRC)后启动缓慢。对于手动升级/维护,我可以通过浏览网站自行预热/启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2016-05-31
相关资源
最近更新 更多