Asp.net mvc 为什么不是';IIS清理池回收上的旧工作进程(w3wp.exe)是否导致网站内存不足异常?

Asp.net mvc 为什么不是';IIS清理池回收上的旧工作进程(w3wp.exe)是否导致网站内存不足异常?,asp.net-mvc,iis,out-of-memory,recycle,w3wp,Asp.net Mvc,Iis,Out Of Memory,Recycle,W3wp,我有一个asp.net-mvc网站,最近我的web服务器出现内存不足异常。我只有1个应用程序池,我们最近将IIS设置为在达到某个限制后进行回收。前几天我去了一趟,看到4个w3wp.exe进程正在运行(每个进程都使用了~1.8GB内存) 我假设在回收过程中,它不会杀死旧的工作进程,最终我会在我的网站上出现内存不足的异常,因为这个盒子只有8GB的内存。我可以给盒子添加内存,但我担心为什么这些旧进程没有被清理 是否有任何建议可以解释为什么这个回收过程没有杀死旧的w3wp.exe进程并让它们继续运行?有

我有一个asp.net-mvc网站,最近我的web服务器出现内存不足异常。我只有1个应用程序池,我们最近将IIS设置为在达到某个限制后进行回收。前几天我去了一趟,看到4个w3wp.exe进程正在运行(每个进程都使用了~1.8GB内存)

我假设在回收过程中,它不会杀死旧的工作进程,最终我会在我的网站上出现内存不足的异常,因为这个盒子只有8GB的内存。我可以给盒子添加内存,但我担心为什么这些旧进程没有被清理


是否有任何建议可以解释为什么这个回收过程没有杀死旧的w3wp.exe进程并让它们继续运行?有什么建议可以同时了解根本原因甚至解决方法来避免这种风险吗?

应用程序池回收通常会关闭旧的工作进程,因此我认为您不会遇到IIS的错误

请注意,如果进程成为孤立进程,它们的寿命可能会更长,并且根据配置,IIS必须将它们留在那里,以便您进行故障排除


如果您不太熟悉调试这些过程,我建议您通过打开一个支持案例,让Microsoft支持人员帮助您。

当我运行FFMpeg.exe或一些带有WPF图形的PDF转换时,我遇到了类似的问题,IIS过程不会关闭,并且会出现内存未找到错误。问题不在于IIS,而是进程中的一些死锁,即使在崩溃后也会阻塞

解决方法是,将您的网站分为两个独立的网站,其中一个应该只使用通常不会崩溃的数据库进行事务处理。应该将诸如视频/照片转换、PDF转换或任何其他可能导致崩溃的逻辑移到其他web服务。并从您的网站内部使用HTTP调用通过web服务处理它们

现在,在这种情况下,仍然无法避免web服务进程崩溃,因此我决定每100个请求循环一次应用程序池工作程序(我在查看了几个请求后选择了这个数字,平均来说,只有在达到200个请求后,它才会超过1GB)我把应用程序池变成了Web花园,每个池有4个进程


此设置的优点是,您可以在将来轻松地将web服务进程移动到其他计算机上,您可以增加/减少每个池的进程数。而您的主网站(它只是执行事务处理)将变得响应速度非常快,因为它不受web服务的流程回收的影响。

您应该关注的主要问题是实现
IDisposable
的类,以及任何不调用
Dispose()
的类的使用。我有一个类似的问题,我已经发布了回复

最可能的原因是您没有对数据库连接调用
.Dispose()
。人们往往会对此感到困惑,因为.NET内置的连接池让人觉得不应该丢弃连接。但是,在请求结束时(或使用完连接后)调用
.Dispose()
,正是防止资源泄漏的方法。连接池预期会发生这种情况


我不认为4
w3wp.exe
进程是一个很大的问题-IIS生成多个进程是正常的。但很明显,您的应用程序存在需要解决的资源泄漏问题。从我上面提到的
IDisposable
开始。如果仍然存在问题,请查看缓存中的项目,并尝试确定是否有更有效的缓存策略可供使用。如果所有其他操作都失败,请对应用程序进行概要分析,以查看是否可以找到资源泄漏的来源。最有可能的是,您的应用程序应该在某个地方实现了
IDisposable

正如您在文章中明确指出的那样,设置IIS在达到某个限制后循环使用是在创建新的应用程序池

老年人未被终止可能有多种原因

一个可能是内存泄漏,而不是处理未管理的资源,您可以查找这一点

要找出另一个原因,请在IIS中启用“进程孤立”
。 要找出罪魁祸首流程,可以使用“”

您还可以选择设置一个可执行文件,这将在孤立/放弃进程时执行

直接的解决方案也可能是在某个CPU限制后将操作设置为KillW3p

<applicationPools>
   <add name="DefaultAppPool">
     <cpu limit="80000" action="KillW3wp" resetInterval="00:02:00" />
   </add>
</applicationPools>


您是否有长时间运行的进程?--默认情况下,IIS将使用重叠回收方法,在新进程处理新请求时,旧进程将保持运行,直到当前请求完成处理(或经过设置的超时)。这确保了服务的连续性,因此您通常不会注意到回收我确实有一些很长的运行过程,但是工作进程在循环后大约一个小时就停止了。我的长进程少于1分钟您可以使用IIS管理UI(Worker processes实用程序)检查给定站点/应用程序池的当前(挂起)请求。下面是一个示例链接:您是如何管理资源的?例如,EF上下文,您如何访问它们?您是否在服务中实例化WEB API端点中的上下文?您使用依赖注入容器吗?如果是,它有什么样的生命周期?每个请求,每个实例CeperLifeTime?