首页 > 解决方案 > EF Core 日志记录的内存泄漏

问题描述

我有一个运行最新的 Ubuntu LTS 的小型 Digital Ocean 液滴(1GB 的 RAM)。我创建了一个小型 DotNet core 3.1 MVC Web 应用程序(+ DotNet Core 身份),最终达到任务限制,然后引发(错误的)OOM 异常。

来自 journalctl 的代表性错误消息:

 Microsoft.AspNetCore.Server.Kestrel[13] Connection id "0HM1CRI33JJJE", Request id "0HM1CRI33JJJE:0000043E": An unhandled exception was thrown by the application. System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
 at System.Threading.Thread.StartInternal()
 at Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider..ctor(IOptionsMonitor`1 options)
 at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
 at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
 at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
 at ... (etc)

全新启动服务状态:

Site.service - Description here
     Loaded: loaded (/etc/systemd/system/Site.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-07-22 17:08:51 UTC; 48s ago
   Main PID: 656469 (Site)
      Tasks: 21 (limit: 1075)
     Memory: 103.4M
     CGroup: /system.slice/Site.service

存在问题的状态输出:

 Site.service - Description here
     Loaded: loaded (/etc/systemd/system/Site.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-07-22 17:08:51 UTC; 11min ago
   Main PID: 656469 (Site)
      Tasks: 1075 (limit: 1075)
     Memory: 176.1M
     CGroup: /system.slice/Site.service

标签: c#linux.net-coreout-of-memory

解决方案


EF Core 日志记录文档中所述,如果为每个上下文创建新的日志记录工厂,则可能会引入内存泄漏。

错误代码:

options.UseSqlite(SqliteDbContext.DataSource)
    .UseLoggerFactory(LoggerFactory.Create(x => x.AddConsole())); // log SQL to console

正确代码:

options.UseSqlite(SqliteDbContext.DataSource)
    .UseLoggerFactory(_loggerFactory) // _loggerFactory is now a static property

代表问题作者添加。


推荐阅读