gpt4 book ai didi

c# - Windows 10 (1607)/Windows Server 2016 上的 ASP.NET Core ILogger 内存泄漏

转载 作者:行者123 更新时间:2023-12-04 13:34:26 27 4
gpt4 key购买 nike

TL; 博士
我现在很确定在 Windows 10(版本 1607)和 Windows Server 2016 中的 conhost 进程中存在内存泄漏,这在 Windows Server 2012 R2 中没有,并且在 Windows 10(版本 1809+)中得到修复,并且视窗服务器 2019。
我找不到对该错误的任何官方引用,如果有人可以为我指出这一点,我将不胜感激。
很长的故事
我目前正在调查我们(自托管)ASP.NET Core 应用程序中的内存泄漏,这导致内存使用率过高,而不是 .exe 本身,而是相应的“conhost”进程。这只会发生在所有生产服务器/虚拟机上,运行与我的笔记本电脑(或任何开发笔记本电脑)相同的应用程序 不是 产生内存泄漏。
开发机器(现在运行 > 2 小时):
enter image description here
生产服务器(运行约 10 分钟):
enter image description here
该内存将无限堆积,直到服务器内存耗尽。
这就是我用来复制它的代码(再次:在我们的生产系统上,而不是在开发机器上)。在我们的实际应用程序中,实际上是 EFCore 日志记录导致了问题(EFCore 也使用 ASP.NET Core 日志记录器):

public class LoggingBackgroundService : BackgroundService
{
private readonly ILogger<LoggingBackgroundService> logger;

public LoggingBackgroundService(ILogger<LoggingBackgroundService> logger)
{
this.logger = logger;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
for (var i = 0; i < 10; i++)
{
Task.Run(() => RunBackgroundThread(stoppingToken));
}

await Task.Delay(Timeout.Infinite, stoppingToken);
}

private async Task RunBackgroundThread(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
for (var i = 0; i < 1000; i++)
{
logger.LogInformation(GetLogMessage());
//Console.WriteLine(GetLogMessage());
}

await Task.Delay(1000);
}
}

private string GetLogMessage()
{
return DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.ffff");
}
}
使用 Console.WriteLine()而不是记录器工作并且不会产生内存泄漏。再一次,该代码在开发机器上运行良好。
我们正在使用 .NET Core 3.1。谁能解释一下这里发生了什么?
编辑:
我的测试系统目前位于 ~9 GB RAM,所以可能有一个限制,但无论如何在“conhost”进程上花费了太多的 RAM。
enter image description here
我还尝试使用 DebugDiag 来分析内存转储,但这显示的堆栈跟踪并没有真正帮助我(还有什么期望?):
LeakTrack+13277       
ConhostV2!MergeAttrStrings+b8
ConhostV2!WriteCharsLegacy+a9c
ConhostV2!DoSrvWriteConsole+4ea
ConhostV2!ConsoleIoThread+36b
kernel32!BaseThreadInitThunk+14
ntdll!RtlUserThreadStart+21
我对虚拟机只有基本的了解,但目前看起来它只发生在 VMWare ESX (?) 系统中?我不再认为 VMWare 是导致问题的原因,而是被不同的 Windows 10 版本/内部版本误导了。
  • [泄漏] Windows Server 2016(在 VMWare ESX 上)
  • [泄漏] Windows 10、1607(在 VMWare ESX 上)
  • [泄漏] Windows 10、1607(在 Azure 上)
  • [泄漏] Windows Server 2016(在 Azure 上)
  • [泄漏] Windows Server 2016(在 AWS 上)
  • [泄漏] Windows 10、1607(在 Hyper-V 上)
  • [泄漏] Windows Server 2016(在 Hyper-V 上)
  • [无泄漏] Windows 10, 1909(在 VMWare 工作站上)
  • [无泄漏] Windows Server 2019(在 Azure 上)
  • [无泄漏] Windows 10, 1909(在 Hyper-V 上)
  • [无泄漏] Windows Server 2019(在 Hyper-V 上)
  • [无泄漏] Windows 10、1809(在硬件上)
  • 最佳答案

    我向 Microsoft 报告了此错误,此后已修复。
    ... 2021 年 5 月 Windows Server 2016 更新 :
    2021 年 5 月的 Windows Server 2016 更新 (KB5003197) 中包含一个修复程序,但隐藏在功能标志后面。激活它

  • 安装 KB5003197
  • 添加此注册表项:reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Policies\Microsoft\FeatureManagement\Overrides /v 1402424459 /t REG_DWORD /d 1 /f
  • 重启系统

  • ... 2021 年 6 月 Windows Server 更新:
    此修复程序应该在六月更新中处于事件状态,而无需使用注册表项,但我尚未对此进行测试。

    关于c# - Windows 10 (1607)/Windows Server 2016 上的 ASP.NET Core ILogger 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63063591/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com