[英]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.