背景: 使用 Ninject 2.2.0.0 IoC、存储库模式和服务层的 Asp.net 项目 (VB.Net)
Ninject 绑定使用 InRequestScope()
问题: 项目即将上线,但压力测试显示该站点正在以高速率使用内存,并且在使用后没有将其丢弃。给出一个想法:每个业务流程在大约 2 分钟内每个用户实例的内存使用量约为 70 - 100 MB,因此 16 个模拟用户设法在 10 分钟内导致内存(和 CPU)过载和站点崩溃。(服务器有 8GB RAM,没有其他重要的进程在上面运行)。
尝试了以下解决方案:尝试在 BaseController(由所有 Controller 继承)、基本存储库和主数据库上下文中实现使用带有 Dispose 的块。
由于 dbcontext 立即被释放,因此无法加载站点,因此必须将其从 dispose 中删除。
使用 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 到 v3PM> Install-Package Ninject.MVC3
经过一些更改后,它可以工作,但现在我坚持使用 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 代码)。
因此不得不将 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 分钟内崩溃。
任何想法将不胜感激。
亲切的问候,
- 阿布拉高频