【问题标题】:Minimize startup time for asp.net最小化 asp.net 的启动时间
【发布时间】:2011-04-05 16:40:11
【问题描述】:

我在 IIS 中运行了多个 Web 服务 (WCF)。当服务是热的(加载)时,典型的请求大约需要 0.5 秒才能完成。但是,当应用程序不是热启动(冷启动)时,第一次命中需要大约 20 秒才能启动并运行服务。发生应用程序池回收时也会发生同样的情况。

我希望减少此 Web 服务的冷启动时间。我已经执行的一些操作是:

  • 已配置应用程序池,使其在 20 分钟空闲时间后不回收(以使应用程序保持温暖)。 这可以最大限度地减少冷启动的发生,但不会使冷启动更快。应用程序池回收现在受到限制,但仍会发生。

  • 修改了machine.config,

像这样:

<runtime>
    <!-- see http://msdn.microsoft.com/en-us/library/bb629393(v=vs.90).aspx -->
    <generatePublisherEvidence enabled="false"/>
</runtime>

这将启动时间从 20 秒减少到大约 10 秒。

  • 我尝试使用NGEN 预编译程序集,

喜欢这个

for %d in (*.dll) do ngen install %d

这不会减少启动时间(只会增加部署的复杂性)。

我真的很想进一步减少冷启动时间。我有什么办法可以做到这一点?

(附带说明:找出启动期间时间花在哪里的最佳方法是什么?我如何监控正在发生的事情?)

【问题讨论】:

标签: .net asp.net performance iis startup


【解决方案1】:

更新

我用procmon 做了一些进一步的测试。启动时间似乎不是一个单一的原因,它是一大堆小时间片(进程启动、加载、网络运行时、读取配置、加载程序集等)加起来总时间。

【讨论】:

  • 我知道接受自己的答案不好,但在这种情况下,我认为这是最正确的方法。
  • 我想你不记得将程序集复制到 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 文件夹中占了多大比例?只是出于好奇-
  • 不,抱歉。顺便说一句,我使用了 .net 3.5。而且我认为无论如何都不会复制(很多)程序集,因为我们使用预编译的程序集。
  • @oɔɯǝɹ 任何机会你能指出我正确的方向,如何使用 procmon 来检测滞后的来源?
  • @manishKungwani 看看你可以在@987654321 找到的 SysInternals 套件@procmon 是一个进程监视器,它可以跟踪所有类型的 Windows 事件以运行进程。您可以确定事件之间的时间,以查明发生延迟的位置。
【解决方案2】:

我在this article 中找到的策略很幸运。它使应用程序保持活动状态,因此一旦它运行,您就不会有任何冷启动(除非 IIS 或机器实际上是故意重新启动或由于重大错误而重新启动)。无论有任何活动,该应用都会保持活动状态。

这篇文章是关于安排每隔一段时间发生的事情,但如果您的唯一目标是保持应用程序的运行,您可以跳过该部分。

【讨论】:

  • 问题不在于回收次数(参见我的第一个项目符号),而是冷启动所需的持续时间。
  • 是的,它不会回答您的问题,但如果您的应用程序从未真正冷启动(除非在真正的中断之后),那么冷启动时间不会成为真正的问题,因为它永远不会发生。
猜你喜欢
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2023-03-14
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多