运行Web角色(Web应用程序)内存问题的Azure云服务(Gen2)

mig*_*ech 5 c# memory iis entity-framework azure

我有一个关于运行MVC应用程序的Web角色的高内存使用率的问题,使用Simple Injector作为DI,实体框架6用于DAL.应用程序在Azure云服务上作为Web角色运行,具有2个标准A2实例(2个内核,3.5 GB RAM),并且还运行CachingService(共存角色),配置了20%的内存使用量.

问题是,当实例启动或重新启动时,w3wp.exe服务的内存使用量仅为500-600 MB(所有其他应用程序的内存使用率约为50%),但即使没有请求进入,它也会启动并继续增长到1.7GB左右并停止(所有其他应用程序的内存使用率约为90%).但我注意到的是,内存有时会随机丢失,当然也会在重新启动或重新发布后丢失.

在监视内存堆之后,我注意到Gen2堆增长并且保持很大,并且在使用ANTS Memory Profiler进行本地调试之后,我看到最大数量的Gen2被具有类名"TypeUsage"和"MetadataProperty"对象的Entity Framework对象占用(" System.Data.Entity.Core.Metadata.Edm"namespace".

现在我的问题是:

  • 这是我们的代码中的内存泄漏,如果是这种情况我怎么能解决它(我检查并已经尝试处理每个请求创建的DbContext)?
  • 这是EF中的内存泄漏,如果是这样我可以做些什么,也许是另一个DAL框架?
  • 这是一种正常的行为,我应该保持原样吗?

Alo*_*atz 1

这是 EF 中内存泄漏的可能性非常低,这是不好的,您不应该这样保留它。您的代码泄漏了内存。

查找泄漏的最佳方法是使用内存分析器(ANTS 是一个不错的选择,我使用 dotMemory)。探查器将向您显示泄漏的对象,它还应该向您显示其他两件重要的事情:

  • 创建对象的代码位置的堆栈跟踪
  • 对象树保留对泄漏对象的引用,并且不允许收集它。

这些应该可以帮助您了解对象是如何创建的以及为什么它们没有被 GC 处理。

您提到大部分内存都在 Gen2 中。这意味着您泄漏的对象被“长寿”的东西引用。这可以是静态变量、ASP.Net 应用程序或类似的变量。

当 IIS 回收您的应用程序时,可能会发生内存随机丢失的情况。默认情况下,每 29 小时发生一次,但 IIS 可能配置不同,或者可能决定出于其他目的回收您的应用程序。