【发布时间】:2021-09-14 14:42:49
【问题描述】:
我有一个在 IIS 中运行的 .NET Framework ASP.NET 应用程序。应用程序启动了一个长期存在的子进程,但在其他方面不起眼(只有一个端点可以有效地将请求代理到子进程)。
当系统处理请求时,机器上 conhost.exe 的内存使用量稳步上升(~线性增长);大约一天后,它将消耗 0.5-1 GB。每隔 29 小时,IIS 应用程序池会自动回收一次;此时,conhost 使用量回落到零,但随后又开始稳定增长。
什么会导致 conhost 使用这么多内存?
更新:
我看到Console.BufferWidth 和Console.BufferHeight 的设置会导致conhost.exe 中更多的内存使用。因此,我为这些值添加了日志记录。但是,我的应用显示了一个恒定的小缓冲区宽度和高度。
更新:
根据@simon-mourier 的评论,我们提取了附加到 conhost 进程的 dll。都在 System32 中。列表是:conhost、ntdll、kernel32、kernelbase、msvcrt、Conhostv2、combase、ucrtbase、RPCRT4、bcryptPrimitives、GDI32、gdi32full、USER32、win32u、IMM32、OLEAUT32、msvcp_win、PROPSYS、sechost、shcore、SHELL32、cfgmgr32、windows。存储、powerprof、advapi32、shlwapi、kernel.appcore 和 profapi。
更新:
似乎与ASP.NET Core ILogger Memory Leak on Windows 10 (1607) / Windows Server 2016 相似(如果不相同)。不幸的是,这也缺乏答案。
【问题讨论】:
-
您的 ASP.NET 应用程序是否创建任何子进程(通常使用
Process.Start(),但还有其他方法)?它作为子进程生成的可执行文件是否恰好是控制台应用程序? -
@BenVoigt 是的,子进程产生的是一个控制台应用程序。
-
@BenVoigt 关于为什么会导致 conhost.exe 泄漏的任何理论?子进程本身似乎没有泄漏内存。
-
您可以检查附加到此 conhost.exe 进程的 dll(例如使用 sysinternals 的 Process Explorer 工具),看看是否有任何可疑之处(第 3 方 dll 等)
-
@ChaseMedallion 抱歉回复晚了,我发布了如何解决我遇到的问题的答案:stackoverflow.com/a/68577179/779506 操作系统版本确实相关,因此如果您的问题仅发生在 Server 2016 上,这可能是相关。
标签: .net windows memory-leaks console