【问题标题】:Out of Memory Exception - ASP.NET - IIS 7内存不足异常 - ASP.NET - IIS 7
【发布时间】:2011-11-15 08:41:58
【问题描述】:

问题在于内存管理,因为我不断收到“内存不足异常”。 以下是我们面临问题的场景:

请注意: 1. 站点/应用程序是在 ASP.Net 中开发并上传到具有以下规格的服务器上: - Windows Server 2008 (R2) 标准版 - 英特尔至强 L5520@2.27GHz 2.27GHz - 内存 = 8GB - 系统类型 = 64 位

  1. 该应用程序是基于事件管理的 Web 应用程序,其中要求包括在 Sessions 等中保存大量数据(如果相关,请提及)

  2. 应用程序/网站运行良好,直到我们:

    • 直接在服务器上编辑文件
    • 从存储库更新文件
    • 复制/粘贴文件(我们通常不使用这种技术编辑代码)
    • 请注意,只有当网站的流量很高时,上述所有条件才成立,即,
    • 流量/访问量低时不会产生“内存不足”的问题/错误
  3. 详情:

    • 系统属性 > 高级 > 性能设置 > 高级选项卡
    • 所有驱动器的总页面文件大小:16362 MB
  4. 在 web.config 中 有什么方法可以让我们从核心调试这个问题并找到解决方案。您能否提供我们可以进一步调查此问题的链接/帮助?

最好的问候, 法鲁克

【问题讨论】:

    标签: asp.net exception memory iis-7


    【解决方案1】:

    内存不足异常在应用程序中很常见,这些应用程序看到周期性事务激增,同时将大量数据保留在内存中。但是,此问题确实取决于您的应用程序和体系结构。以下是几点建议:

    1. 硬件 - 您拥有 Xeon 5500(Intel Nehalem 芯片)。这些非常擅长处理内存。你应该在这里很好。
    2. 操作系统 - Windows Server 2008 R2 - 作为一个操作系统,该系统将为您处理足够多的内存(您很好,请参阅功能链接:Memory Limits for Windows
    3. 物理内存 - 您是说服务器上有 8 GB 吗?请注意,您的应用程序允许 16 GB。有一个问题。如果您的应用程序请求的内存比物理可用的更多,您将看到您的错误。但这不是您唯一关心的问题...
    4. CLR / GC 限制 - 您的应用程序具有 16+ GB 的“分页文件大小”。这可能是您的问题。

    GC 是您问题的核心。就原因而言,这与每当应用程序超过 2-4 GB 时 Java 和 JVM 就会出现问题的原因相同。这就需要看一下GC的实际过程了。

    您有“老一代”和“年轻一代”垃圾收集进程。当您的应用程序运行时,CLR 会尝试保持您的内存空间井井有条。当 GC 标记和交换进程发生时,这些进程会强制所有线程暂停(阶段变化)。这里的问题是,根据您的代码的编写方式以及您长时间保留的内存量,您可能会遇到内存问题。

    每当您将运行时环境设置为超过 4 GB 阈值时,您都会看到收集时间呈指数级增长。当你点击“stop the world”暂停(所有东西都被清理的旧 gen GC)时,CLR 必须遍历整个堆并取消分配内存。根据您的应用,16 GB 可能会给您带来更多物理内存的问题(Windows Server 2008 R2 - Enterprise 或 DataCenter 可以支持 2 TB)。即使你给它提供更多的物理内存,当你的完整 GC 命中时,你也可能会看到很长的收集时间。

    理想情况下,我会做以下事情:

    1. 获取更多物理内存(您永远不会希望将 600MB 的总物理内存分配给您的应用程序以避免内存不足错误,但您的缓冲区确实取决于您的负载和应用程序处理它的能力。 .. 您可能需要更大的安全网来保证安全)。

    2. 一旦拥有了所需的物理内存,您就可以在对应用程序施加压力的同时运行 GC 日志。这将使您了解在哪里看到性能呈指数级下降,以及在考虑堆大小(内存)时您的应用程序可以支持的级别。您可能想找到一种方法将 16GB 页面缩小到更小的尺寸。我知道 .Net 4.0 微软已经对 GC 过程进行了一些可靠的改进,包括允许后台线程维护 GC。这应该使您能够支持更大的堆(理论上)......但没有什么比应用程序上的真实测试更好的了。查看此链接了解更多信息:

    Garbage Collection Performance (Asp.net 4.0) - 另外,因为我的链接有限。导航到 Fundamentals 页面以获取有关 ASP.Net 4.0 的新 GC 功能的一些很好的解释 (http://msdn.microsoft.com/en-us/library/ee787088.aspx#concurrent_garbage_collection)

    希望这会有所帮助!

    PS - 任何使用较少硬件的人都需要了解 ASP.NET 对 GC 线程的使用。如果你正在运行像 Core Duo 这样的开发项目,你必须考虑到 50% 的计算能力将用于 GC 优化。这意味着硬件(核心数量)是需要考虑的重要因素。如果你有更多的东西,这个过程理论上应该有助于提高性能。如果您在内核上受到限制,要么获得更好的硬件,要么使用旧版本的 ASP.Net,或者考虑关闭该功能(如果可能)。其次,如果延迟是一个问题,那么使用“超线程”也会对性能产生影响。您总是可以在“物理”内核上获得更好的性能......但这对于 99.9% 的应用程序来说不是问题。

    【讨论】:

      【解决方案2】:

      默认为 2 GB。如果应用程序支持大地址空间(与 /LARGEADDRESSAWARE 链接),它会获得 4 GB(请参阅http://msdn.microsoft.com/en-us/library/aa366778.aspx

      它们仍然被限制为 2 GB,因为许多应用程序依赖于指针的最高位为零。

      【讨论】:

      • 亲爱的,感谢您的回复。正如我已经提到的,操作系统是 Windows 2008,64 位,因此它最多可以使用 32GB 内存。
      猜你喜欢
      • 2011-07-05
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多