C# 使用NLog或Serilog时.NET Core 3.0应用程序内存泄漏

C# 使用NLog或Serilog时.NET Core 3.0应用程序内存泄漏,c#,.net-core,.net-core-3.0,C#,.net Core,.net Core 3.0,我在使用Logger时遇到了一个关于.NETCore3.0的奇怪问题 该应用程序在Windows上运行正常,但当我在Linux(Debian 10)上作为守护进程启动它时,它只会占用越来越多的内存。 这个问题在我使用NLog时首先表现出来,然后我切换到Serilog,但问题仍然存在。当我删除NLog/Serilog时,问题并不存在 使用内存快照和Jetbrains dotMemory,我得到的只是一堆由NLog/Serilog(可能)创建的sbyte数组 当我禁用对文件的日志记录并只保留控制台日

我在使用Logger时遇到了一个关于.NETCore3.0的奇怪问题

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

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

当我禁用对文件的日志记录并只保留控制台日志记录时,问题就消失了

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

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


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

我也注意到内存消耗高。有几种不同的方法可以尝试,包括:

  • 使用.Destructure.ToMaximumCollectionCount(10)//默认值为int.MaxValue
  • 删除.Enrich.WithExceptionDetails以查看内存问题是否神奇地消失
  • 检查Linux容器的交换文件内存使用情况,从而设置交换值(尽管要注意意外后果)
为了确定内存泄漏发生在哪里,您需要分析内存堆,查看哪些对象正在使用内存


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

尝试如下配置NLog:

<nlog>
   <targets>
      <target type="file" name="logfile" fileName="log.txt" keepFileOpen="true" concurrentWrites="false" />
   </targets>
   <rules>
      <logger name="*" minLevel="Debug" writeTo="logfile" />
   </rules>
</nlog>

如果内存分配有问题,请不要使用

NLog版本。4.7修复了在非Windows平台上使用
concurrentWrites=“true”
和NLog归档选项时出现的性能问题。直到最后一刻。4.7发布后,如果可能的话,应该考虑配置<代码> CONTRONTENTRONS =“false”<代码>。
另请参见:

此“内存泄漏”的大小是在增加还是在某个点停止?您是否检查了登录提供商的设置-他们必须在某个地方分配一些缓冲区,您应该能够限制这一点。奇怪的是,在linux上运行时它会有所不同。当NLog或Serilog logger在linux上运行时,您会遇到问题。但你为什么认为问题特别严重?奇怪的是,两个不同的日志库显示了相同的问题。您是否尝试过其他工作正常的记录器?@sommen该服务从大约35MB开始,到周末它增长到700MB。所以我想只有当操作系统杀死它时,它才会停止。正如我所说的,如果我为守护进程添加MemoryMax参数,它会停止,或者说GC会清理。但这是一个正在“危险地带”穿行的解决办法。我将尝试查看日志记录提供程序是否有缓冲区限制-尽管我们尝试将其设置为更频繁地刷新缓冲区,但没有帮助。@oleksa这很奇怪!我没有试过其他伐木工人。而这些只有在登录到文件和Linux上时才会出现问题。我知道问题在于记录器,或者更确切地说是在使用它们时,因为如果我删除对文件的日志记录,问题就会消失。我的意思是(可能)你正在以某种不寻常的方式使用记录器。或者(只是猜测)Linux上的asp.net容器中存在错误。我将使用.Destructure尝试第一点。我没有使用Enrich.WithExceptionDetails,所以这不是原因。它不是在容器中运行的,而是在一个干净的Debian发行版中运行的。我会在尝试时发布结果。经过广泛的测试后,我很难过地报告说它不起作用。一切都指向垃圾收集器没有正常工作。但当我有了这些发现时,我会报告它们。谢谢你的帮助!听起来你的物品中有些东西没有被正确处理。用内存分析器将其打开。