在使用记录器时,我遇到了一个奇怪的问题:.NET Core3.0。
这个应用程序在Windows上运行正常,但当我在Linux (Debian 10)上作为守护程序启动它时,它只会占用越来越多的内存。这个问题第一次出现是在我使用NLog的时候,然后我切换到了Serilog,但是这个问题仍然存在。当我删除NLog/Serilog时,问题不在那里。
使用内存快照和Jetbrains dotMemory,我得到的只是一堆sbyte数组,它们可能是由NLog/Serilog创建的。
当我禁用到文件的日志记录而只留下控制台日志记录时,问题就消失了!
我尝试向垃圾收集器添加手动调用,但没有帮助。
通过在.service文件中添加MemoryMax参数,我们设法创建了一个变通方法。垃圾收集器似乎在接近最大限制时开始清理。(例如,限制是150MB,现在应用程序保持在145MB)。
有没有人知道可能出了什么问题?或者我应该只与NLog和Serilog开发人员一起解决这个问题。
发布于 2020-01-09 16:59:56
我还注意到内存消耗很高。有一些不同的东西可以尝试,包括:
但是,为了确定内存泄漏发生在哪里,您需要分析内存堆,以查看哪些对象正在耗尽内存。
发布于 2020-01-10 03:04:29
默认情况下,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修复了在非NLog平台上将concurrentWrites="true"与NLog存档选项一起使用时的性能问题。直到NLog版本4.7发布后,如果可能的话,应该考虑配置concurrentWrites="false"。
https://stackoverflow.com/questions/59659856
复制相似问题