如何解决ASP.NET Core 2.0应用程序EF Core使用中的大量内存分配问题?

问题描述 投票:4回答:1

我偶然发现了一个非常奇怪的问题。每当Web应用程序启动时,dotnet.exe都具有相当不错的内存使用率(大约300M)。但是,当它触及某些部分时(我感觉它与EF Core的使用有关),它在很短的时间内分配了大量的内存(在2-3秒内大约8GB)。

此内存使用大约需要10-15秒,之后内存将稳定在600M左右,并且运行正常。

我尝试了dottrace和内置诊断工具,以了解分配如此多内存的内容,但找不到任何有意义的内容:

Dottrace是最耗费内存的线程,但是当我非常高时我无法捕捉到内存的快照(它只显示我约1GB的内存和大约800M的托管内存)。

dottrace memory usage

VS诊断工具在基线之间和内存加标后立即增量

Visual Studio delta

Details for the most allocated type

我怎样才能找到这种内存分配的根本原因?奇怪的是它似乎不是泄漏,因为内存最终被释放。

问题:如何解决ASP.NET Core 2.0应用程序EF Core使用中的大量内存分配问题?


我认为问题确实与注入服务的数量有关,但首先我将提供有关应用程序架构的更多信息。我依赖于一系列通用存储库,这些存储库注入了作用域数据访问,它在数据上下文中创建了一个包装器,并在需要时帮助在单个事务中保存多个信息(用于各种存储库):

Repository<T> : IRepository<T>
    <- DbContext

ScopedDataAccess : IScopedDataAccess
    <- DbContext
    <- logging service
    <- dozens of IRepository<T>

一切都是“范围”:

services.AddScoped<IScopedDataAccess, ScopedDataAccess>();
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));

我在ScopedDataAccess中删除了大约一半注入的存储库,并且所需的内存减少到大约一半。

更奇怪的是,诊断工具显示内存减少而没有直接绑定到GC(参见下图,GC是上面的黄色标记):

Diagnostic tools graph

另外,我仔细检查了我已停止所有异步作业(例如Quartz)。

asp.net-core asp.net-core-2.0 dynamic-memory-allocation memory-profiling
1个回答
0
投票

不是一个完整的答案,但我已经完成了以下操作并大大减少了内存(和CPU使用率):

  • 通过拆分需要大量注入服务的大型服务来简化依赖图
  • 升级到ASP.NET Core 2.1

最后一步具有最明显的效果,我的诊断工具现在显示了一个更友好的图表:

VS 2017 Diagnostic Tools snapshot

© www.soinside.com 2019 - 2024. All rights reserved.