我们的一些 ASP.Net 应用程序存在问题。我们的一些应用程序从一开始就占用大量内存作为其工作集。
在我们的 2 个 webfarm 服务器(每个 4GB RAM)上运行多个应用程序。我们有一个稳定的环境,大约有 1.2GB 的可用内存。
然后我们添加一个 MVC5 + WebApi v2 + Entity Framework 应用程序,它立即声明 1+gb 作为工作集内存,而实际上只使用了大约 300mb。这会导致其他应用程序抱怨没有足够的内存。
我们已经尝试设置虚拟内存限制和私有内存限制,但没有任何效果。如果我们将其设置为大约 500mb,应用程序仍然使用或多或少相同的内存量(远超过 500),并且似乎不遵守所设置的限制。
作为参考,我使用一个空的 MVC5 项目(VS2013 模板)对此进行了测试,它已经占用了 300mb 的内存,而仅使用了大约 10mb。
将应用程序设置为 32 位应用程序似乎对减少工作集的大小有一些影响。
有什么方法可以减少工作集的大小,或者对其大小实施硬限制?
编辑:
在使用 Web Api v2 和实体框架的项目使用大量内存的情况下,我的 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(角度)文件。
我们有另一个应用程序,只是常规的 mvc,有两个模型和一些简单的视图(没有数据库或其他可能泄漏的外部资源),这也消耗了高达 4-500mb 的内存。如果我对其进行分析,我看不到任何表明内存泄漏的信息,我确实看到实际仅使用了 10 或 20 mb,其余的是未分配的非托管内存(但属于私有内存工作集的一部分,因此由此应用程序无法被任何其他应用程序使用)。