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



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

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

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

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

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

最新更新