【问题标题】:How do I prevent IIS from compiling website?如何防止 IIS 编译网站?
【发布时间】:2010-03-01 21:14:40
【问题描述】:

我有一个 ASP .NET Web 应用程序,它在后端与一个 ASMX Web 服务通信。我们统计了一下,初始请求的平均等待时间是 20s。我想知道是否有一种方法可以将 Web 服务发送到预编译的服务器,从而消除编译的需要。

我们还注意到 IIS 倾向于回收其工作线程,这也会导致编译。该过程本身并不经常被访问,但它需要更快。

有什么想法吗?

提前致谢

更新:感谢所有建议,我已经尝试了其中的一些,这就是我发现的。回收时间关闭/修补是危险的,因为我不希望线程只是无所事事。经过进一步检查,该网站正在预编译,所以我的问题是为什么 Web 服务有一个初始启动时间?

现在:倾向于下面的热身脚本建议

更新:正在从另一台机器上的 Web 服务器访问该服务。我们仅发现初始请求存在问题。

【问题讨论】:

  • 如果我们可以让它达到不需要编译的地步,除了在我将东西移动到虚拟目录之前,我认为那将是最佳的。这甚至可能吗?
  • 如果您预编译,那么您的问题不是 IIS 编译。 Web 应用的启动时间是一回事,编译是另一回事。

标签: asp.net performance web-services iis asmx


【解决方案1】:

另一种方法是编写一个“预热脚本”,它只是从您的应用程序中执行一个页面。这将使服务器为您启动,下一个人将获得快速打击。您还可以设置一个计划的进程来偶尔运行该脚本(例如,如果您将线程池安排在凌晨 4 点回收,则安排预热脚本在凌晨 4:01 运行)

【讨论】:

  • 我为我的几个网站配置了免费的tagBeep uptime monitoring。这具有自动生成预热的副作用,因为它每 5 分钟定期检查我的网站是否可用。
【解决方案2】:

您应该将预编译作为构建/部署脚本的一部分。

有一个部署后活动以编程方式请求每个 Web 资源并触发编译对我来说似乎很愚蠢。

Thomas 的回答给出了编译器,MSDN 上也有一个指南,How to: Precompile ASP.NET Web Sites

如果您使用的是 MSBuild,请选择 AspNetCompiler Task

(我可能会对此发表评论,但我还不允许...没有足够的果汁)

【讨论】:

  • 这似乎与我所寻找的一致。去试试,谢谢
  • 这也会影响 Web 服务吗?我已经在使用 Web 部署项目的部署中使用了它,但是无论它是否被预编译,第一个请求仍然有一个明确的初始加载时间,我仍然始终确保在部署后发出第一个请求,它只是比不做要短这个。
  • 很明显我的网站已经预编译了,然后呢?为什么这东西需要 35 秒才能恢复到最初的命中?
  • 从问题中我不确定延迟是由网站本身还是在辅助网络服务请求中引起的。如果您还没有这样做,那么下一步就是查明来源。
【解决方案3】:

您是否尝试过在框架文件夹中使用 aspnet_compiler(例如 %SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727)?

您可以通过应用程序池上的设置来控制 ASP.NET 回收。如果它比设置更频繁地回收,那么是其他原因导致的(例如更改 web.config 等)

【讨论】:

  • 我可以在 web.config 中查找哪些可能导致问题的内容?
  • 对 web.config 文件的任何更改都会导致 ASP.NET 回收应用程序池。所以,如果有代码正在改变 web.config 文件,那肯定会这样做。然而,首先要看的是应用程序池回收设置。如果这些都关闭并且应用程序正在回收,那么其他东西正在强制重置应用程序池(或 IIS 本身)。
  • 对,但我担心的是如果我将线程回收设置得太高,我可能会用完线程。关于这一点的想法?
  • ASP.NET 默认使用线程池。如果内存可用,该池每个处理器有 25 个。这意味着要耗尽池,您必须在单个处理器机器上同时生成超过 25 个线程。一旦线程被丢弃,它将返回池以供 .NET 重用,直到达到某个阈值,在这种情况下它将终止线程。回收池时,您会转储工作进程和所有正在运行的线程。如果工作进程达到线程池的最大值,则其他请求会等待直到有线程可用。
  • 你知道,我想到线程池耗尽可能是这里的问题。每个 Web 服务调用都将使用池中的一个线程。如果您对大量服务或服务很慢有大量请求,则可能会耗尽池。您是否尝试过将应用程序池中的工作线程数增加到 50 个左右,看看是否有帮助?这是一篇提供更多信息的 MS 文章:support.microsoft.com/?id=821268
【解决方案4】:

尝试在 IIS 中的页面或应用程序池的配置中禁用应用程序回收。

IIS 6(如果我没记错的话):右键单击 AppPool -> 选项卡“性能”-> 取消选中“空闲时关闭工作进程”

IIS 7.5 有一个属性(似乎也是一个 appPool 设置)在 X 分钟的空闲时间后关闭 AppPool。值0等于“永不关机”

希望对你有帮助

【讨论】:

  • 谢谢你,我在这个区域附近,但我只是让回收超时超长。这似乎不是一个好主意,因为我想我确实希望线程回收,所以 IIS 不会用完线程。试试这个,让我们看看它是否有效
  • 今天早上我们进行了测试,启动时间最长,35 秒响应。所以不好,谢谢你的建议
  • 部署后首次启动,还是一段时间不使用后首次启动?
  • 两者都有,但我们的想法是,在正常使用和延长回收期的情况下,我们应该能够覆盖 98% 的时间
【解决方案5】:

在之前的职位上,我们在最初进行假脱机时遇到了 WCF 服务的类似问题,我们通过创建一个简单的程序来绕过这个问题,该程序将在部署后调用我们的所有 Web 服务。

您也可以将这种相同类型的程序用作保持活动服务,并且只需每 5-10 分钟 ping 一次服务等。

【讨论】:

  • 这是有人建议的,但它是 IMO 的创可贴。这并不是说我最终不会使用它,我只是想先尝试其他的东西
猜你喜欢
  • 2016-06-29
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2010-12-11
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多