为啥还要回收应用程序池?

Posted

技术标签:

【中文标题】为啥还要回收应用程序池?【英文标题】:Why Even Recycle an Application Pool?为什么还要回收应用程序池? 【发布时间】:2010-10-02 15:33:12 【问题描述】:

也许有人可以对这个简单的问题有所了解:

我有一个经过彻底审查的 .NET Web 应用程序。每当一个应用程序域(进程)启动时,它都会为每个应用程序域(进程)加载一个缓存,并且在完成此缓存加载之前无法完全回复请求。

我一直在检查我的应用程序池的设置,并开始想知道为什么我什至如此频繁地回收(每 1,000,000 次调用或 2 小时一次)。

什么会阻止我将自动回收设置为每 24 小时甚至更长时间一次?如果内存对 appdomain 失控,为什么不完全删除该选项并仅回收?

【问题讨论】:

【参考方案1】:

如果您的应用程序可靠运行的时间超过了为应用程序池回收设置的阈值,那么一定要提高阈值。如果您的应用程序稳定,则没有缺点。

对我们来说,我们完全关闭了回收,取而代之的是每分钟加载一个测试页面并在连续五次加载失败时运行 iisreset 的任务。

【讨论】:

【参考方案2】:

您可能应该从可靠性的角度来看待回收。根据历史数据,您应该了解您的应用程序使用了多少内存、CPU 等,以及历史模式以及何时开始出现问题。知道了这一点,您可以配置回收来解决这些问题。例如,如果您知道您的应用的内存使用模式*不断增加,这会导致应用在几天后耗尽内存,您可以将其配置为在这种情况发生之前回收。

* 显然,如果可能,您还希望解决此错误,但可以使用回收来提高客户的可靠性

【讨论】:

【参考方案3】:

他们这样做的原因是应用程序可能“不工作”,即使它的 CPU 和内存都很好(想想死锁)。应用程序回收是最终的故障保护措施,可以保护有缺陷的代码免于死亡。

此外,任何未能实现 IDisposable 的代码都会在回收时运行终结器,这可能会释放持有的资源。

【讨论】:

以上是关于为啥还要回收应用程序池?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用线程池而不使用new Thread(runnable).start();

IIS 应用程序池 - 停止/启动与回收

如何检查上次回收的应用程序池

应用程序池回收后,Hangfire 重复作业停止

尽管配置,IIS 应用程序池每 20 分钟回收一次

WIN10 应用程序修改IIS程序池配置及Azure云服务修改程序池配置避免自动回收