首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NLog或Serilog时.NET Core3.0应用程序中的内存泄漏

问使用NLog或Serilog时.NET Core3.0应用程序中的内存泄漏
EN

Stack Overflow用户
提问于 2020-01-09 16:29:46
回答 2查看 3K关注 0票数 7

在使用记录器时,我遇到了一个奇怪的问题:.NET Core3.0。

这个应用程序在Windows上运行正常,但当我在Linux (Debian 10)上作为守护程序启动它时,它只会占用越来越多的内存。这个问题第一次出现是在我使用NLog的时候,然后我切换到了Serilog,但是这个问题仍然存在。当我删除NLog/Serilog时,问题不在那里。

使用内存快照和Jetbrains dotMemory,我得到的只是一堆sbyte数组,它们可能是由NLog/Serilog创建的。

当我禁用到文件的日志记录而只留下控制台日志记录时,问题就消失了!

我尝试向垃圾收集器添加手动调用,但没有帮助。

通过在.service文件中添加MemoryMax参数,我们设法创建了一个变通方法。垃圾收集器似乎在接近最大限制时开始清理。(例如,限制是150MB,现在应用程序保持在145MB)。

有没有人知道可能出了什么问题?或者我应该只与NLog和Serilog开发人员一起解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2020-01-09 16:59:56

我还注意到内存消耗很高。有一些不同的东西可以尝试,包括:

  • using Linux (10) //默认设置为disappears
  • Checking .Enrich.WithExceptionDetails,以查看内存问题是否会神奇地影响Linux容器的交换文件内存使用率,从而设置Swapsiity值(尽管要注意意外后果)

但是,为了确定内存泄漏发生在哪里,您需要分析内存堆,以查看哪些对象正在耗尽内存。

SeriLog Memory Leak using EF

票数 5
EN

Stack Overflow用户

发布于 2020-01-10 03:04:29

默认情况下,NLog为每个文件写入操作打开/关闭文件。这确保了最高级别的兼容性,但这是有代价的。

尝试这样配置NLog:

代码语言:javascript
复制
<nlog>
   <targets>
      <target type="file" name="logfile" fileName="log.txt" keepFileOpen="true" concurrentWrites="false" />
   </targets>
   <rules>
      <logger name="*" minLevel="Debug" writeTo="logfile" />
   </rules>
</nlog>

如果内存分配有问题,请不要使用<targets async="true">。

NLog版本4.7修复了在非NLog平台上将concurrentWrites="true"与NLog存档选项一起使用时的性能问题。直到NLog版本4.7发布后,如果可能的话,应该考虑配置concurrentWrites="false"。

另请参阅:https://github.com/NLog/NLog/wiki/performance

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59659856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档