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

标签 c# entity-framework iis azure memory

我有一个关于运行 MVC 应用程序的 Web 角色的高内存使用率的问题,使用简单注入(inject)器作为 DI, Entity Framework 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”的 Entity Framework 对象占用对象(“System.Data.Entity.Core.Metadata.Edm”命名空间)。

现在我的问题是:

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

最佳答案

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

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

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

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

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

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

关于c# - 运行 Web 角色(Web 应用程序)的 Azure 云服务内存问题(Gen2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28022553/

相关文章:

c# - 在 Aspose.Words LINQ 报告引擎中构建报告的动态对象

c# - 正则表达式没有从字符串中获取每个匹配项

c# - 使用 LINQ 联合两个嵌套 List<object>

azure - 如何在警报监视时间段之外的 Azure Log Analytics 中获取相应 IIS 停止日志的 IIS 启动日志

c# - 在 IIS 7 上的 ASP.NET MVC 4 应用程序中运行 PHP 文件?

c# - Web 服务版本控制 - 在 WCF 中向服务契约添加操作

c# - protobuf-net:序列化一个空列表

c# - 在 Azure Functions 中使用 Ninject 确定 Entity Framework 的范围

entity-framework - SQL Server 2008 R2 中的时间数据类型是否支持 MVC4 的 Entityframework

iis - 如何禁用 IIS 快速所有身份验证?