我们的ASP.Net应用程序存在问题。其中一些应用程序从开始时就会占用大量内存作为它们的工作集。
在我们的2个WebFarm服务器(每个服务器有4GB RAM)上运行多个应用程序。我们拥有一个稳定的环境,剩余约1.2GB的内存。
然后我们添加了一个MVC5 + WebApi v2 + Entity Framework应用程序,它立即要求1GB以上的工作集内存,而实际上只使用约300MB。这导致其他应用程序抱怨没有足够的内存剩余。
我们已经尝试设置虚拟内存和私有内存的限制,但都没有效果。如果我们将其设置为大约500MB,该应用程序仍然使用大约相同数量的内存(远远超过500MB),并且似乎不遵守所实施的限制。
作为参考,我使用空的MVC5项目(VS2013模板)进行测试,这已经占用了300MB的内存,而实际上只使用了约10MB。
将应用程序设置为32位应用程序似乎有助于减少工作集的大小。
是否有任何方法可以减小工作集的大小,或者强制对其大小进行硬限制?
编辑:在使用Web Api v2和Entity Framework的项目中出现巨大的内存使用情况时,我的API控制器如下:
在我找到的大多数教程中(包括微软的教程),它们看起来都是这样的。但在此处使用
编辑2: 如果我这样做,它就可以工作。
ToList()这个方法会影响api的性能吗?(我知道我不能像使用IQueryable一样廉价地继续查询)
编辑3: 我注意到应用程序的私有工作集非常高。有没有办法限制它?(不引起不断重启的情况下)
编辑4: 据我所知,每个APIController都有一个Dispose方法。我的前端只是一些简单的MVC控制器,但大部分是.cshtml和JavaScript文件(angular)。
我们还有另一个应用程序,只是常规的mvc,有两个模型和一些简单的视图(没有数据库或其他可能泄漏的外部资源),这也占用了4-500mb的内存。如果我进行剖析,我看不到任何指示内存泄漏的东西,我确实看到只有10或20 mb被实际使用,其余的是未分配的非托管内存(但是是私有内存工作集的一部分,因此由该应用程序声明并且无法被任何其他应用程序使用)。
在我们的2个WebFarm服务器(每个服务器有4GB RAM)上运行多个应用程序。我们拥有一个稳定的环境,剩余约1.2GB的内存。
然后我们添加了一个MVC5 + WebApi v2 + Entity Framework应用程序,它立即要求1GB以上的工作集内存,而实际上只使用约300MB。这导致其他应用程序抱怨没有足够的内存剩余。
我们已经尝试设置虚拟内存和私有内存的限制,但都没有效果。如果我们将其设置为大约500MB,该应用程序仍然使用大约相同数量的内存(远远超过500MB),并且似乎不遵守所实施的限制。
作为参考,我使用空的MVC5项目(VS2013模板)进行测试,这已经占用了300MB的内存,而实际上只使用了约10MB。
将应用程序设置为32位应用程序似乎有助于减少工作集的大小。
是否有任何方法可以减小工作集的大小,或者强制对其大小进行硬限制?
编辑:在使用Web Api v2和Entity Framework的项目中出现巨大的内存使用情况时,我的API控制器如下:
namespace Foo.Api
{
public class BarController : ApiController
{
private FooContext db = new FooContext();
public IQueryable<Bar> GetBar(string bla)
{
return db.Bar.Where(f => f.Category.Equals(bla)).OrderBy(f => f.Year);
}
}
在我找到的大多数教程中(包括微软的教程),它们看起来都是这样的。但在此处使用
using
并不起作用,因为LINQ会延迟加载。如果我到处添加ToList(未经测试),它可能会起作用,但这会有什么其他影响吗?编辑2: 如果我这样做,它就可以工作。
namespace Foo.Api
{
public class BarController : ApiController
{
public List<Bar> GetBar(string bla)
{
using(FooContext db = new FooContext){
return db.Bar.Where(f => f.Category.Equals(bla)).OrderBy(f => f.Year).ToList();
}
}
}
ToList()这个方法会影响api的性能吗?(我知道我不能像使用IQueryable一样廉价地继续查询)
编辑3: 我注意到应用程序的私有工作集非常高。有没有办法限制它?(不引起不断重启的情况下)
编辑4: 据我所知,每个APIController都有一个Dispose方法。我的前端只是一些简单的MVC控制器,但大部分是.cshtml和JavaScript文件(angular)。
我们还有另一个应用程序,只是常规的mvc,有两个模型和一些简单的视图(没有数据库或其他可能泄漏的外部资源),这也占用了4-500mb的内存。如果我进行剖析,我看不到任何指示内存泄漏的东西,我确实看到只有10或20 mb被实际使用,其余的是未分配的非托管内存(但是是私有内存工作集的一部分,因此由该应用程序声明并且无法被任何其他应用程序使用)。