我设置了一个 AsyncController
来执行长轮询操作。这一切都很好,但是一位同事注意到服务器上的内存泄漏似乎随着每个新连接而增加。
我已经创建了一个小应用程序来从该页面请求数千次,并且我正在监视 IIS 进程的内存使用情况。每个连接都会增加内存使用量,但不会在客户端断开连接时一路下降。
经过进一步调查,我发现即使我将我的 AsyncController
替换为标准的 Controller
时,这种情况仍然会发生:
public class WaitController : Controller
{
public JsonResult Member(string oauth_token, int service_id, bool busy = false)
{
return Json(new
{
ready = false,
}, JsonRequestBehavior.AllowGet);
}
}
尽管在此过程中,没有那么多内存使用,但行为似乎完全相同。
我运行了一个内存分析器来显示 10,000 个连接之间的差异,但几乎没有任何连接。大多数内存被 System.Web.Caching
或 System.Runtime.Caching
中的 ExpiresEntry[]
实例占用,但是这些总计与我在 IIS 工作进程上获得的内存增加相比,没有什么。
我的问题是,IIS 是故意这样做的吗?也许这是为连接线程分配的,这些连接线程只是为了以防万一以后需要它们?这是 IIS、ASP.NET 或 MVC 4 的错误吗?
我决定为此使用 MVC 4 的 WebAPI 功能,因为我们希望它灵活、可维护、面向 future 并通过 AJAX 访问。从开发的角度来看,这似乎也很有意义,因为我们也在 MVC 4 中构建了网站。
但是,一位同事现在将此作为系统架构的一个关键问题提出,因为我们(将来)将需要连接数千个客户端。他建议我们改为使用 WCF。那么,额外的问题 - 使用 WCF 会解决这些问题吗?
最佳答案
有一个很棒的article来自 MS 现场工程师关于此主题的信息。可能会有帮助。
关于c# - 每个连接的 MVC 4 IIS 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114676/