2011-07-20 28 views
2

我有一个奇怪的场景,其中的网站似乎随机耗尽内存:它工作了几个星期,然后突然一切都抛出内存异常,并且它保持不变所以直到服务器重新启动。它可能在几周后或几天后发生。我们无法确定一个常规模式。Asp.net Mvc网站内存不足

这里使用本网站高科技的东西的清单:

  • .Net框架3.5
  • 的mvc 2.0与C#
  • 在专用服务器上IIS 6.0(无政策限制等)
  • 3层架构(ui-bll-dal)
  • Automapper 1.1.0.118
  • Elmah 1.1
  • FluentValidation 2.0
  • MvcContrib 2.0.95.0
  • MvcSiteMapProvider 3.0.0.1
  • 城堡2.5.2
  • NHibernate的3.0.0.4
  • FluentNHibernate 1.1.0.0
  • PdfSharp 1.31.1789.0
  • MarkdownSharp

除此之外,该网站还包括(通过iframe)一些ol d传统的asp窗体。这些形式与网站旧版本(完全在asp中)相同,但它们存在一些问题,但旧网站从未耗尽内存。

我已经检查常见的东西,比如实现类是内部using语句,没有无限循环等

该网站没有做什么奇怪的所有IDisposable,它拉从DB如新闻的一些数据,在某些表格提交之后即时生成一些pdf,允许用户订阅通讯。通常的东西。

我真的无能为力,我开发了很多网站,几乎在任何地方都使用上述库,但这是我第一次遇到这种问题。

我知道这个信息是不够的,“发现”的问题,但如果有人能想到的东西,我可能会被忽视,或任何东西,这将是非常欢迎的。

编辑:一个细节,那可能很重要。我们有另一个网站运行在同一台服务器上(使用旧的asp制作),它运行得很好,而另一个则停滞不前。所以看起来整个服务器内存没有被耗尽,否则它不会工作。

+0

如果你在现场看的内存消耗它是否会随着时间推移而增加,或者除了形成这些奇怪的尖峰之外,还会保持稳定? –

+0

这很正常。现在,应用程序池的容量为1GB,重新启动池之后,我可以访问elmah,并发现了很多outofmemory错误。仍然无能为力。 –

+0

您的网站是否有能力上传文件?我可能是服务器是完全超载与太多的用户同时上传文件? –

回答

3

安装DebugDiag。触发它进程转储,因为它违反了内存阈值(例如300Mb,然后在每100Mb之后)。

比较转储文件应该给你一个线索是什么突然占据全部存储

+0

这将是一个不错的选择,但我不能在服务器上安装任何东西,它是一个专用主​​机,而不是住房。 –

+0

有没有什么办法可以在家里运行网站,并可以用负载测试工具重现行为? –

+0

DebugDiag现在在这里:http://www.microsoft.com/en-us/download/details.aspx?id=26798 – Timbo

0

我会看看城堡是如何配置和使用,你使用的城堡解决您的控制器的依赖,使用ControllerBuilder.Current.SetControllerFactory方法?如果你这样做,你还必须记住释放控制器实例。

+0

我没有使用Castle来设置控制器工厂。事实上,现在我正在寻找,现在还没有使用它。它曾经用于温莎 - IoC,但现在它不再使用了。死亡依赖。 –

+0

好的,那么你应该看看Richard所描述的转储文件。同时寻找你声明静态的地方(例如集合),这是一个很好的候选人泄漏 – Thomas

+0

我会检查代码中的任何静态内容,这是一个很好的建议。我不记得使用静态变量等,但最好是安全而不是抱歉。 –

0

如果您在IIS7/7.5和高负载上托管多应用程序池,请尝试更改gc模式。

aspnet.config

[元](http://msdn.microsoft.com/en-us/library/ms229357.aspx元)

+0

这是我的功能列表中明确指出的IIS6。 –

+0

对不起!但我认为这是IIS6上内存使用情况的可用参数。 – takepara

+0

无论如何,我不认为这是一个GC问题,原因如下:托管语言的优势在于,如果您以不良的方式处理内存,当资源用完时GC就会出现问题。我尝试了有缺陷的代码,生成无限循环,这将导致OOM异常。但接下来的呼叫,GC会通过并清除事情。在这种情况下,应用程序池将保持该状态,直到重新启动。所以我认为这是一些导致泄漏的非托管代码,因为GC无法处理非托管代码。它听起来是对的还是我过分简化了事情? –