gpt4 book ai didi

asp.net mvc 内存泄漏

转载 作者:行者123 更新时间:2023-12-02 20:58:08 25 4
gpt4 key购买 nike

背景:
使用 Ninject 2.2.0.0 IoC、存储库模式和服务层的 Asp.net 项目 (VB.Net)

Ninject 绑定(bind)使用 InRequestScope()

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

尝试了以下解决方案:
尝试在 BaseController(由所有 Controller 继承)、基本存储库和主数据库上下文中实现 Using block 和 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 PM> Install-Package Ninject.MVC3 到 v3
经过一些改动后,让它工作了,但现在我坚持使用 2.2.0.0 版中的 ActionFilterAttribute,使用 NinjectFactoryController 获取其内核绑定(bind),如下所示:

Private _mailService As IEmailService

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

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

因此不得不将 ActionFilterAttribute 代码更改为:
<Inject()>
Private _mailService As IEmailService

(NinjectFactoryController 行已被注释掉)。

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

虽然,在使用这个新的 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 分钟内崩溃。

    任何想法将不胜感激。

    亲切的问候,
  • 阿布拉尔HF
  • 最佳答案

    您创建一个新的 StandardKernel 只是为了获取服务实例的事实使我相信您以错误的方式使用 Ninject。

    NinjectMVC3 类中应该只有一个 New StandardKernel

    关于asp.net mvc 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11797560/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com