C# 每个连接的MVC 4 IIS内存泄漏

C# 每个连接的MVC 4 IIS内存泄漏,c#,asp.net,iis-7,asp.net-mvc-4,C#,Asp.net,Iis 7,Asp.net Mvc 4,我设置了一个AsyncController来执行长轮询操作。这一切都很好,但是一位同事注意到服务器上的内存泄漏似乎会随着每次新连接而增加 我已经创建了一个小应用程序,从这个页面请求了数千次,我正在监视IIS进程的内存使用情况。每个连接都会增加内存使用,但当客户端断开连接时,不会一直下降 经过进一步调查,我发现即使我用标准的控制器替换我的AsyncController,这种情况仍然会发生,该控制器除了以下功能外什么都不做: public class WaitController : Control

我设置了一个
AsyncController
来执行长轮询操作。这一切都很好,但是一位同事注意到服务器上的内存泄漏似乎会随着每次新连接而增加

我已经创建了一个小应用程序,从这个页面请求了数千次,我正在监视IIS进程的内存使用情况。每个连接都会增加内存使用,但当客户端断开连接时,不会一直下降

经过进一步调查,我发现即使我用标准的
控制器替换我的
AsyncController
,这种情况仍然会发生,该控制器除了以下功能外什么都不做:

public class WaitController : Controller
{
    public JsonResult Member(string oauth_token, int service_id, bool busy = false)
    {
        return Json(new
        {
            ready = false,
        }, JsonRequestBehavior.AllowGet);
    }
}
尽管在这种情况下,内存使用量没有那么多,但行为似乎完全相同

我已经运行了一个内存分析器来显示10000个连接之间的差异,并且几乎没有任何差异。大部分内存被
System.Web.Caching
System.Runtime.Caching
中的
expireentry[]
实例占用,但是与我在IIS工作进程中获得的内存增加相比,这些内存总量几乎为零

我的问题是,IIS是故意这么做的吗?也许这是为连接线程分配的,这些线程只是在以后需要时挂起的?这是IIS、ASP.NET还是MVC4的错误

我决定为此使用MVC4的WebAPI特性,因为我们希望它灵活、可维护、经得起未来考验,并且可以通过AJAX访问。从开发的角度来看,这似乎也是有意义的,因为我们也用MVC4构建了网站


然而,一位同事现在提出这是系统架构的一个关键问题,因为我们(将来)需要连接数千个客户端。他建议我们改用WCF。所以,有一个额外的问题-使用WCF能解决这些问题吗?

微软现场工程师对这个问题有一个很好的解释。可能会有帮助。

经过更多的实验和测试,我发现这是无法避免的。这似乎要么是出于设计,要么是IIS的一个真正根深蒂固的问题

我改变了方法,使用了一个较低级别的选项:实现一个
IHttpAsyncHandler
来做同样的事情。我使用了一个允许我使用完全相同的URL作为我以前使用。问题仍然存在,但规模略小

然后我尝试了一个完全空白的
IHttpHandler
,它只返回
{ready:false}
(就像我的代码在超时时所做的那样)。HttpHandler中没有包含其他代码,但同样的问题仍然存在

接下来,我尝试了一个完全空白的WCF服务,它也返回了
{ready:false}
。同样的问题,但这次规模更小

链接的答案表明:

内存碎片和其他自然退化是无法避免的,而循环使用可以确保定期清理应用程序


这可能是问题的原因。我可以想象,因为使用MVC控制器时会有更多的开销,所以碎片化的速度会更快。使用较低级别的方法(如HttpHandler或WCF服务)会减少每个连接使用的内存,从而减少碎片。

您确定内存正在泄漏吗?有没有可能是因为没有足够的压力让它放弃而一直坚持下去?您是否已验证,如果继续运行连接测试,服务器最终将耗尽内存?@Pete它确实开始减速。我从来没有看到它实际上耗尽了内存,但整个应用程序池逐渐变慢到无法使用的程度。这可以通过重新启动应用程序池来解决。IIS是否需要“压力”来放弃分配的内存?我认为,糟糕的性能可能只是每个连接都在队列中等待处理。这是否意味着这是预期的行为<代码>“无法避免内存碎片和其他自然退化,循环使用可确保定期清理应用程序”
。微软是否鼓励我们通过自动回收应用程序池来解决这个问题?我通常就是这么做的。:)