c# - 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
解决方案
如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
代表问题作者添加。
推荐阅读
- gmail-api - Gmail API (Python) - 无法向线程添加回复
- laravel - laravel 使用带有关系的闭包
- opencv - 当我尝试在 openCV 中反转 UIImage 时,为什么我的应用程序会崩溃?
- sql - 用于在一条记录中检索多封电子邮件的 SQL 查询
- algorithm - “假 3D”棱镜墙的渲染顺序
- arrays - Swift 解析 JSON 数组给出零
- powershell - Powershell 使用 ConvertFrom-Csv 使用换行符解析管道 CSV 数据
- javascript - 在 Neo4j 中创建节点时如何跳过重复节点
- r - 在 R 中,是否可以使用 `function` 定义函数?
- docker - 高山码头集装箱内的dlv seg故障