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

时间:2017-03-20 15:07:01

标签: c# iis asp.net-core kestrel-http-server aspnetboilerplate

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

2 个答案:

答案 0 :(得分:2)

Kestrel处理垃圾收集(GC)与IIS上的ASPNET略有不同。 Kestrel能够比ASPNET快得多,其实现这一壮举的方法之一就是降低GC压力。这篇文章提供了更多细节:

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

考虑到Kestrel GC认为是长期存在的对象,您可能需要重写代码。没有任何细节,我无法提供更多帮助,但听起来您的代码正在释放您的代码,而不是通过正常的GC流程及时收集。

答案 1 :(得分:2)

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