[英]Memory leak in .NET Core 3.0 app when using NLog or Serilog
我在使用记录器时遇到了 .NET Core 3.0 的奇怪问题。
该应用程序在 Windows 上运行正常,但是当我在 Linux (Debian 10) 上将它作为守护程序启动时,它只会占用越来越多的内存。 这个问题第一次是我用NLog的时候出现的,后来我换了Serilog,问题依旧。 当我删除 NLog/Serilog 时,问题不存在。
使用内存快照和 Jetbrains dotMemory,我得到的只是一堆由 NLog/Serilog 创建(可能)的 sbyte 数组。
当我禁用记录到文件并只保留控制台记录时 - 问题消失了!
我尝试向垃圾收集器添加手动调用,但这没有帮助。
我们设法通过在 .service 文件中添加 MemoryMax 参数来创建解决方法。 似乎垃圾收集器在接近最大限制时开始清理。 (即限制为 150 MB,现在应用程序保持在 145 MB)。
有谁知道可能有什么问题? 或者我应该与 NLog 和 Serilog 开发人员一起解决这个问题。
我还注意到高内存消耗。 有一些不同的事情可以尝试,包括:
为了确定内存泄漏发生的位置,您需要分析内存堆以查看哪些对象正在占用内存。
默认情况下,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>
如果内存分配有问题,请不要使用<targets async="true">
。
NLog 版本 4.7 修复了在非 Windows 平台上使用concurrentWrites="true"
和 NLog 归档选项时的性能问题。 直到 NLog 版本。 4.7 发布后,如果可能,应该考虑配置concurrentWrites="false"
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.