Kev*_*vin 5 c# asp.net iis asp.net-mvc asp.net-web-api
我们的一些ASP.Net应用程序存在问题.我们的一些应用程序从一开始就声称拥有大量内存作为其工作集.
在我们的2个webfarm服务器(每个4GB的RAM)上运行多个应用程序.我们有一个稳定的环境,大约1.2GB的内存空闲.
然后我们添加一个MVC5 + WebApi v2 +实体框架应用程序,立即声称1 + gb作为工作集内存,而实际上只使用大约300mb.这导致其他应用程序抱怨没有足够的内存.
我们已经尝试设置虚拟内存限制和私有内存限制,但没有任何效果.如果我们将其设置为大约500mb,则应用程序仍然使用或多或少相同数量的内存(超过500)并且似乎不尊重所设置的限制.
作为参考,我用一个空的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);
}
}
Run Code Online (Sandbox Code Playgroud)
因为他们看了我能找到的大多数教程(包括来自微软的教程).using
由于LINQ延迟加载,在此使用不起作用.如果我在任何地方添加了ToList(未经测试),它可以工作,但这有什么其他影响吗?
edit2:如果我这样做的话
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
ToList()是否对api的性能有任何影响?(我知道我不能像IQueryable一样便宜地继续查询)
Edit3:我注意到它的应用程序的私有工作集非常高.有没有办法限制这个?(不会导致不断循环)
编辑4:据我所知,我在每个APIController上都有一个Dispose.我的前端只是一些简单的MVC控制器,但对于大部分.cshtml和javascript(角度)文件.
我们有另一个应用程序,只是常规的mvc,有两个模型和一些简单的视图(没有数据库,或其他可能被泄露的外部资源),这也消耗了多达4-500mb的内存.如果我对它进行分析,我看不到任何指示内存泄漏的内容,我确实看到实际上只使用了10或20 mb,其余的是未分配的非托管内存(但是私有内存工作集的一部分,因此声称这个应用程序,任何其他人无法使用).
删除所有 Telerik Kendo MVC 引用(dll 等)解决了我们的问题。如果我们在没有此功能的情况下运行应用程序,所有内存问题都会消失,并且我们会看到正常的内存使用情况。
基本上:它是一个导致高内存使用的外部库。
归档时间: |
|
查看次数: |
8035 次 |
最近记录: |