2016-12-14 172 views
26

我有一个asp.net-mvc网站,最近我在Web服务器上发现内存不足异常。我只有1个应用程序池,我们最近设置IIS在达到一定限制后进行回收。我去了一天,看到4 w3wp.exe进程运行(每个使用〜1.8GB内存)为什么IIS不清理池回收导致网站内存异常的旧工作进程(w3wp.exe)?

我假设在回收过程中,它不杀死老工人进程,最终我出去我的网站上的内存异常,因为该盒只有8GB的内存。我可以增加内存,但我担心为什么这些旧的进程没有被清理。

是否有任何建议,找出为什么这个回收过程不杀死旧的w3wp.exe进程并让它们运行?任何有关解决根本原因或解决方法的建议都可以避免这种风险。

+0

您是否有长时间运行的进程在运行? - “默认情况下,IIS将使用重叠回收方法,该方法会在新进程处理新请求时保持旧进程,直到当前请求完成处理(或超时设置)为止,从而确保服务的连续性,以便通常不会注意回收。“ –

+0

我确实有一些长期运行的流程,但工作流程在回收后一个小时左右就会停滞不前。 。我的长进程<1分钟 – leora

+0

您可以使用IIS管理UI(工作进程实用程序)检查给定站点/应用程序池的当前(未决)请求。这里是一个示例链接:http://stackoverflow.com/questions/15621509/how-do-i-see-currently-executing-web-request-on-iis-8 –

回答

3

我有类似的问题,当我运行像FFMpeg.exe或一些PDF转换与WPF图形的东西,IIS进程将不会关闭,并会发出内存找不到错误。问题不在于IIS,而是在进程中发生一些死锁,即使在崩溃之后也会阻塞。

解决方法是,将您的网站分为两个单独的网站,一个应该只对通常没有崩溃的数据库执行事务处理。视频/照片转换,PDF转换或任何其他可能导致崩溃的逻辑的逻辑都应该移至其他Web服务。并在内部使用来自您的网站的HTTP调用来通过Web服务处理它们。

现在,在这种情况下,仍然没有办法避开Web服务进程崩溃,所以我决定每100个请求就回收一次应用程序池worker(我在看了几个请求之后选择了这个数字,只有在达到200个请求后才超过1GB),并通过每个池创建4个进程将应用程序池转换为Web Garden。

此设置的优点是,您可以将Web服务进程轻松移动到其他计算机上,您可以增加/减少每个池的进程数。而您的主要网站只是在处理事务处理过程中变得高度响应,因为它不受Web服务的流程回收的影响。

2

您应该追究的主要嫌疑人是实施IDisposable的职业,以及任何不使用Dispose()的职位。我有一个类似的问题,我已发布回复this question

最可能的原因是您没有在数据库连接上调用.Dispose()。人们往往会对此感到困惑,因为.NET的内置连接池使其听起来像,您不应该处理连接。但是,在请求结束时(或者完成使用连接时)调用.Dispose()正是您应该采取的措施来防止资源泄漏。连接池期望发生这种情况。

我不认为4 w3wp.exe进程是一个值得关注的问题 - IIS产生多个进程是正常的。但很明显,您的应用程序有资源泄漏需要解决。正如我上面提到的,从IDisposable开始。如果仍然存在问题,请查看缓存中的项目,并尝试确定是否存在可以使用的更有效的缓存策略。如果一切都失败,请对应用程序进行配置以查看是否可以找到资源泄漏的来源。很可能你的应用程序应该在某处执行IDisposable

2

由于从您的帖子可以明显看出,在IIS达到一定限制后回收IIS以回收利用正在创建新的应用程序池。

可能有多种原因导致较旧的未终止。

一个可能是内存泄漏,不处置未管理的资源,你可以找这个。

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

您还可以选择设置可执行文件,这将在Process处于孤立/放弃状态时执行。

即时解决方案也可能是在某个CPU限制之后将操作设置为KillW3p。

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