【问题标题】:ASP.NET - Single large web request triggers System.OutOfMemoryException - Still have plenty of available memoryASP.NET - 单个大型 Web 请求触发 System.OutOfMemoryException - 仍有大量可用内存
【发布时间】:2010-09-27 10:47:10
【问题描述】:

环境: Windows 2003 服务器(32 位); IIS6、ASP.NET 2.0 (3.5); 4Gb 内存; 1个工作进程

我们有一个非常大的 System.XmlDocument 被加载到内存中的情况,然后它进入一个已编译的 XSL 转换。 发生的情况是,当 Web 请求进入服务器时,服务器处于空闲状态,可用系统内存为 2500Mb。

随着 XML DOM 的填充,可用内存减少了大约 500Mb,此时我们会收到 System.OutOfMemoryException 事件。此时系统理论上应该还有 2000Mb 的可用内存可用于服务请求(根据 Perfmon)。

我的相关问题是:

1) 在堆栈的哪个级别满足内存不足限制?操作系统? IIS? ASP.NET?工作进程?这是单个网络请求的限制吗?

2) 这个限制可以在某处配置吗?

3) 为什么这个 Web 请求不能访问全部可用的系统内存?

【问题讨论】:

  • 我也遇到过这个问题,我认为操作系统的工作进程有限制,或者 IIS 的工作进程有限制,或者应用程序池有限制。祝你好运:\
  • x86(32 位)是一个痛苦的世界。我知道这有点牵强,但是您可以在 64 位版本的 Windows Server 上运行此代码吗?服务器上的 64 位差不多,我的意思是字面意思,免费性能
  • 谢谢 Jeff,x64(和 32GB RAM)距离我们还有 2 个月的时间,所以我们可能只能坚持下去。我喜欢用硬件解决软件问题!

标签: asp.net iis memory-management iis-6


【解决方案1】:
  1. 您正在一个进程中运行。一个进程只能访问 2 gigs 的内存。这个任务与这个进程中运行的所有其他东西共享内存,所以这段代码没有得到完整的 2 gig——即使它是可用的。 操作系统上也有一个 3 gig 开关。我相信这是一个注册表设置。但您必须搜索 MSDN 才能找到该信息。

但实际上,您需要以另一种方式执行此操作。可能通过切换到 SAX 样式的 xml 解析器。

【讨论】:

  • 谢谢 Chris,SAX 是 .NET 框架上 XSLT 的一个选项吗?
【解决方案2】:

1) 我会猜测工作进程,但这应该可以在 IIS 中配置为工作进程可以使用的内存限制。另一个因素是您的软件使用的位级别,例如32 位的物理限制为 4 GB,因为这是总地址空间。

2) 可能但不要忘记,内存碎片可能比您想象的更快地耗尽内存,例如如果有一个连续 1000 Mb 内存的内存请求,那么这可能不一定在当前内存中找到。

3) 您是否检查过转储数据以查看抛出异常时内存中的内容?如果没有,有一些方法可以获取内存快照以查看它的外观,因为这可能会为您提供更多关于正在发生的事情的线索。

【讨论】:

  • 我们有一台 32 位机器。从我们的阅读和研究来看,记忆碎片很可能在谜题中发挥了重要作用。感谢您的信息。
【解决方案3】:

1) 不知道。检查您的日志。
2) IIS 限制分配给网站/应用程序池的内存。检查您的设置。
3)服务器都是关于正常运行时间的;如果一个应用程序占用了其他人遭受的所有资源。这就是为什么像 IIS 这样的企业应用程序会限制内存以防止失控者破坏整个服务器。

【讨论】:

  • 是在 ASP.NET 中运行的 CLR 引发了 System.OutOfMemoryException。我自己的知识和研究不一定能告诉我 IIS 下的堆栈在哪里,这样的限制正在受到打击?也许其他人知道?
【解决方案4】:

我相信这里有一些聪明的头脑可以回答您的具体问题,但是您是否问过自己是否有其他方法可以做您想做的事?我的具体意思是您可能不想处理非常大的 XML 文档,但您可能更具体地希望将某些内容返回给客户端。您是否可以重写代码来完全避免这个 XML 文档,或者可能不会同时将其全部加载到内存中,并且仍然产生相同的最终结果?

【讨论】:

  • 是的,我知道有许多更好的方法可以使用更高效的架构来实现相同的结果。然而,这是一种遗留转换,具有非常复杂的业务规则,需要花费 100 个人日来重新设计。配置我们的服务器来处理这个请求更有意义(如果可能的话)。
猜你喜欢
  • 2010-11-12
  • 2012-02-27
  • 2016-06-23
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多