簡體   English   中英

使用 NLog 或 Serilog 時 .NET Core 3.0 應用程序中的內存泄漏

[英]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 開發人員一起解決這個問題。

我還注意到高內存消耗。 有一些不同的事情可以嘗試,包括:

  • using .Destructure.ToMaximumCollectionCount(10) // 默認為 int.MaxValue
  • 刪除 .Enrich.WithExceptionDetails 以查看內存問題是否神奇地消失
  • 檢查 Linux 容器的 Swap 文件內存使用情況,從而設置 Swapiness 值(盡管要注意意外后果)

為了確定內存泄漏發生的位置,您需要分析內存堆以查看哪些對象正在占用內存。

使用 EF 的 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"

另見: https : //github.com/NLog/NLog/wiki/performance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM