如何避免达到应用程序池内存限制?

时间:2015-11-10 17:48:34

标签: .net asp.net-mvc web-applications garbage-collection

我的客户端有一个桌面应用程序,用于运行他的业务。它针对本地数据库运行。他想要一个网站来显示一些这样的数据。

我写了一个ASP.NET MVC5网站,其中包含一个包含一些XML的HTTP POST的动作,并根据XML的内容更新网站的数据库。他的应用程序在网站上发布了多个帖子来上传数据。这些帖子是在另一个之后发布的,而不是同时发布的。

然而,我们发现当他有大量数据要上传时,它会正常工作一段时间,然后他会收到“服务不可用”错误。我检查了托管公司,他们说池日志文件中有这样的条目......

11/10/2015 4:15:03 AM ---为应用程序池提供服务的工作进程已请求回收,因为它已达到其专用字节内存限制。

任何人都有任何想法我能做些什么呢?该网站使用实体框架,我意识到这不是最友好的内存方式,但重新编码以直接访问数据库将是一项巨大的工作。我希望可能会有一些更简单的方法。

如果他放慢请求的速度会有帮助吗?它发生在我身上(可能不正确,因为我不是这些问题的专家)可能是垃圾收集器在请求更多内容之前没有机会释放内存。如果是这样,会减慢帖子的帮助率吗?

正如我所说,我不是这方面的专家,所以请放轻松我!

1 个答案:

答案 0 :(得分:2)

两个原因可能会导致Web应用程序出现速度问题:线程饥饿和事务中的大量数据。

在Web服务器上,.NET Framework维护一个用于为ASP.NET请求提供服务的线程池。当请求到达时,将调度池中的线程来处理该请求。如果同步处理请求,则在处理请求时阻止处理请求的线程,并且该线程无法为另一个请求提供服务。

这可能不是问题,因为线程池可以做得足够大以容纳许多被阻塞的线程。但是,线程池中的线程数是有限的。在处理多个同时长时间运行请求的大型应用程序中,可能会阻止所有可用线程。这种情况称为线程饥饿。达到此条件时,Web服务器将请求排队。如果请求队列已满,Web服务器将拒绝HTTP 503状态(服务器太忙)的请求。

for"线程饥饿"最好的方法是使用"异步方法"。有关详细信息,请参阅here

关于"交易中的大量数据",您应该检查您的代码。可能是您使用了太多数据而无需全部数据。例如,您传输所有可能只需要一个对象属性的对象。在这种情况下,使用"投影"(以here为例)。

你也可以使用"延迟加载"或者"渴望加载"基于你的场景。但请注意,这些都不是每个场景的神奇工具。在某些情况下"延迟加载"提高性能和其他人的预期加载"使事情变得更快。这取决于您对这两个术语的深刻理解,以及您的问题,代码和设计。