如何在 IIS 上的 dotnet 核心应用程序 运行 中获得可见性/调试高内存使用率

How do I get visibility / debug high memory usage in a dotnet Core application running on IIS

我们最近移植了一个应用程序来使用 Aspnet boilerplate 框架,但在内存使用方面存在一些问题。我们最初的症状是大量使用内存,在高使用率时没有缓解。夜间和周末的内存使用量有所增加,但没有达到高峰时段的速度。当我键入此内容时,我正在监视并看到应用程序在系统上使用了超过 5Gb 的内存,而正常使用量最多为 500 - 550mb。我们使用几个内存分析工具对应用程序进行了分析,并在框架库和我们引用的 Kestrel 版本中发现了几个潜在的泄漏,但即使在修复问题之后,占用空间仍然很大。我们现在看到的行为是应用程序的内存使用量将无限增长,但强制内存分析工具中的垃圾回收将恢复大部分内存。周末监控该应用程序显示该应用程序在轻度使用下运行正常,但今天(星期一)在高峰时段该应用程序再次耗尽内存。我不确定该朝哪个方向前进,或者如何了解实际问题是什么。内存分析工具在这方面没有显示任何明显的泄漏或问题,而且可以通过强制垃圾收集回收内存这一事实对我来说似乎很可疑。

Kestrel 处理垃圾回收 (GC) 的方式与 IIS 上的 ASPNET 略有不同。 Kestrel 有能力比 ASPNET 快得多,它实现这一壮举的方法之一是降低 GC 压力。这是一篇提供更多详细信息的文章:

https://www.poppastring.com/blog/ASPNETCoreKestrelTheNeedForSpeed.aspx

考虑到 Kestrel GC 认为长寿命对象的内容,您可能需要重写代码。没有任何细节我帮不上什么忙,但听起来你的对象确实被你的代码释放了,而没有被正常的 GC 进程及时收集。

不幸的是,实际问题似乎隐藏在我们使用的框架中,特别是依赖注入库无法正确处理瞬态依赖项的问题。我们与图书馆的第三方提供商合作,他们在更新的版本中包含了一个修复程序,100% 解决了我们的问题。