asp.net mvc内存泄漏

时间:2012-08-03 14:19:41

标签: asp.net asp.net-mvc-3 memory ninject cpu-usage

背景 Asp.net项目(VB.Net)使用Ninject 2.2.0.0 IoC,Repository模式和服务层

Ninject绑定使用InRequestScope()

问题: 项目即将上线,但压力测试显示该网站正在高速使用内存,并且在使用后不会将其丢弃。 想一想这个: 在大约2分钟内,每个业务流程每个用户实例的内存使用量大约为70-100 MB,因此16个模拟用户在10分钟内成功导致内存(& CPU)过载和站点崩溃。 (服务器有8GB RAM,没有其他重要进程在运行)。

尝试了以下解决方案: 尝试在BaseController中使用带有Dispose的块(由所有控制器继承),在基本存储库和主数据库上下文中。

由于dbcontext被立即处理掉,因此无法加载网站,因此必须将其从处置中删除。

使用ANTS内存分析器并不是真的,但ANTS性能分析器显示Ninject无法进入Dispose功能。它试图在C:\ Projects \ Ninject \ Maintenance2.2 \ ninject \ src \ Ninject \ Infrastructure \ Disposal文件夹中查找DisposableObject.cs。 无法在那里找到它如此坠毁。 ANTS Reflector确实从Ninject.dll反编译了相同的DisposableObject代码,所以不知道为什么它在它不存在的默认目录中寻找它。

所以尝试从2.2.0.0升级Ninject。使用Nuget PM> Install-Package Ninject.MVC3到v3 经过一些改动后,让它工作但我现在停留在版本2.2.0.0中的ActionFilterAttribute,使用NinjectFactoryController获取内核绑定,如下所示:

Private _mailService As IEmailService

_mailService = New StandardKernel(New NinjectControllerFactory.QuickQuoteServices()).Get(Of IEmailService)()

现在对于Ninject.MVC3,NinjectFactoryController已被注释掉,所有绑定现在都在App_Start文件夹中的NinjectWebCommon.vb的注册服务部分(从第https://gist.github.com/923618页的第二个代码块获得的VB代码)。 / p>

因此必须将ActionFilterAttribute代码更改为:

<Inject()>
Private _mailService As IEmailService

(NinjectFactoryController行已被注释掉)。

这将_mailService作为Nothing返回,因此实际上绑定不起作用。

尽管在使用这个新的Ninject.MVC3版本的ANTS内存分析器中没有观察到内存改进。

ANTS性能分析器正在运行而不会崩溃,但似乎仍然在寻找错误位置的其他文件(如KernelBase.cs,ExtensionsForIEnumerableOfT.cs,Binding.cs等所有错误,指出未找到源代码在c:\ Projects \ Ninject \ ninject \ src \ Ninject ...文件夹中查找文件。

我们仍然无法进入内存泄漏/过载的原点,但很明显,应用程序池每次运行部分业务逻辑时累积70到100 MB的数据,然后这个内存是直到20分钟的站点不活动(ISS 7 Idle-Timeout为基础)才会被释放,因为该站点在达到该阶段之前崩溃,所以没有任何帮助。

任何建议都将受到赞赏。

亲切的问候,

  • 阿布拉

编辑:

管理最终让Ninject 3.0得到一些指导。

此外,ActionFilterAttribute中关于Ninject 3用法的问题是使用类似的属性声明解决的:

<Inject()>
    Public Property _mailService() As IEmailService
        Private Get
            Return m_mailService
        End Get
        Set(value As IEmailService)
            m_mailService = value
        End Set
    End Property
    Private m_mailService As IEmailService

现在Ninject 3正在做其中的事情,内存问题略有改善(即内存比之前释放的更多),但现在,出现了一个新问题。 CPU使用率非常高。甚至在Ninject从2.2升级到3.0之前就存在这个问题,但升级似乎没有对它产生任何影响。 CPU仍然只有2-3个用户,这使得网站无响应,最终在大约10分钟内崩溃。

任何想法都会受到赞赏。

亲切的问候,

  • AbrarHF

1 个答案:

答案 0 :(得分:2)

您正在创建一个新的StandardKernel只是为了获得一个服务的实例,这让我相信你正在以错误的方式使用Ninject。

NinjectMVC3类中应该只有一个新的StandardKernel