背景 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分钟内崩溃。
任何想法都会受到赞赏。
亲切的问候,
答案 0 :(得分:2)
您正在创建一个新的StandardKernel只是为了获得一个服务的实例,这让我相信你正在以错误的方式使用Ninject。
NinjectMVC3类中应该只有一个新的StandardKernel