为什么IIS应用程序池需要循环回收?

43

IIS中的应用程序池经常被回收,我不知道原因。我记得在IIS6中有可能会强制回收的问题,但现在快速搜索没有结果。在IIS6或7上,您可以关闭闲置时间、持续时间和特定时间回收选项,所以没有问题。

那么为什么每个.NET网站都要回收应用程序池呢?如果一个网站没有任何内存泄漏,能否设置一个永远不需要回收的网站?

如果无法实现上述需求,如何确保后台任务被调用?是否有自动重启模块可用于IIS,或者应该使用外部服务来进行这些调用?

如果真的想/需要做到这一点,似乎是可能的?


2
即使您没有内存泄漏,如果在 LOH 中有任何分配,您可能会遇到碎片化问题。 - Damien_The_Unbeliever
1
那仍然是你可以修复的事情,我想知道的是你是否能做到,而不仅仅是可能出现了什么问题。此外,LOH 的末尾会变为空吗? - Daniel Little
2
我认为你严重低估了确保没有资源泄漏所需的工作量。 - Damien_The_Unbeliever
2
在大多数情况下,是否在放弃之前尝试修复资源泄漏会更好呢? - Daniel Little
1
您现在可以在 .net 4.5 中压缩 LOH。 - Daniel Little
2个回答

38

网站旨在保持运行状态(尽管是无状态的)。应用程序池回收有许多原因可以使托管平台受益,以确保网站和服务器都以最佳状态运行。其中包括(但不限于)动态编译的程序集仍留在应用程序域中,使用会话缓存(没有清除的保证),其他网站乱跑并随着时间消耗资源等。应用程序池通常可以为多个网站提供服务,因此应用程序池回收可以确保一切正常运行。

除了应用程序重新启动时的初始启动后,效果应该是最小的。 Http.sys 在新的工作进程启动时保持请求,因此不应丢失请求。


17
我希望你的意思是“虽然方式不好”,但我怀疑你想说的是“没有状态”? - Damien_The_Unbeliever
1
效果应该是最小的,但您的进程内会话状态已经丢失。 - Csaba Toth

10

来自https://weblogs.asp.net/owscott/why-is-the-iis-default-app-pool-recycle-set-to-1740-minutes

你可能会问,是否需要固定的回收。每日回收只是为了在出现轻微的内存泄漏或其他慢慢渗入工作进程的情况下,刷新IIS的临时措施。理论上,除非已知问题,否则不需要每日回收。我曾建议如果不需要它,完全关闭它。然而,今天我更倾向于在非高峰时间将其设置为每天回收一次,作为一种主动措施。
我的理由是,首先,您的站点应该能够在不受太大影响的情况下进行回收,因此每天回收不应成为问题。其次,我发现即使表现良好的应用程序池最终也可能会有一些隐蔽的问题影响应用程序池。我见过由于流量模式导致过度缓存或应用程序中的奇怪问题而引起的问题,以及非常罕见的IIS错误(确实很少!)如果每天回收不会成为问题。这是一个临时措施吗?可能是,但如果每日回收可以防止非关键问题浮出水面,那么我认为这是一个很好的主动措施,可以节省大量疑难解答工作,而这可能并不重要。但是,如果您认为有一个真正的问题被回收抑制了,那么请关闭自动回收,以便您可以跟踪并解决您的问题。没有黑白之分,只有您可以为您的环境做出最佳决策。

如果你对IIS不是很了解,我推荐你阅读更多有用和有趣的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接