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

2024-03-29

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

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

监视内存堆后,我注意到 Gen2 堆不断增长并保持很大,并且在使用 ANTS Memory Profiler 进行本地调试后,我发现最大数量的 Gen2 被类名为“TypeUsage”和“MetadataProperty”对象的实体框架对象占用(“ System.Data.Entity.Core.Metadata.Edm”命名空间)。

现在我的问题是:

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

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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