IIS6 网站/应用程序池可以使用的最大内存是多少?

IIS6 网站/应用程序池可以使用的最大内存是多少?

我有一台在 Windows 2003 SP2 x86 上运行的 IIS 6 服务器。该服务器有 4GB 的 RAM,并且始终以分配的 2GB 运行。

我意识到使用 x86 时,服务器不会利用所有 4GB RAM,并且应用程序空间也受到限制,但 IIS 进程似乎在其他地方受到限制。w3wp.exe 分配的空间从未超过 500MB,而且我偶尔会从繁忙的 .NET 应用程序(有多个正在运行的应用程序,每个应用程序都有一个单独的应用程序池)中收到 OutOfMemory 异常。

IIS6 网站/应用程序池可以使用的最大内存是多少?

答案1

Windows x86 下的应用程序限制为 2gb/ea。您可以通过在 boot.ini 中添加 /3gb 标志来更改此设置,但这可能会导致应用程序出现意外行为,应谨慎使用。MS 官方不支持此设置(http://technet.microsoft.com/en-us/library/bb124810.aspx

可以在相关应用程序池的“回收”选项卡下设置 IIS 的内存限制。

您如何确定应用程序永远不会超过 500MB?如果您使用任务管理器,请记住,它很少(如果有的话)能够准确表示 Windows 所理解的内存使用情况。使用进程资源管理器: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

还有许多其他相关问题:

  • 您的事件日志中是否记录了错误?
  • 是某一行代码引发了异常吗?如果是这样,这个 OutOfMemory 异常实际上是 IIS 问题,还是代码问题?
  • 您是否通过回收设置来限制应用程序池?
  • 这台机器上是否正在运行其他服务?

最有可能的是,即使 Windows 任务管理器没有显示,IIS、ASP.NET 及其所有相关包袱也正在达到 2GB 的限制。设置回收限制或升级到 x64 可能会产生巨大的影响。

答案2

偶尔会从繁忙的 .NET 应用程序中获取 OutOfMemory 异常

这个问题的答案太复杂了,无法给出答案。参见调整 .NET 应用程序性能以便对该主题进行完整的处理。

以下是一个非常简单(但仍然很好)的总结布鲁诺·朱耶

此外,.NET 运行时不允许使用高达 2 GB 的空间。垃圾收集器通过复制活动对象来工作,因此它需要相当大的空间来执行复制。

编辑:

以下是我的解释尝试……

如果你想知道 x86 上的 ASP.NET 工作进程的最大工作进程内存大小(由任务管理器报告)是多少,答案是“这取决于”

在任何类型的托管代码(如 Java 或 .NET)中,程序员放弃对内存的细粒度控制,作为不必处理指针的惩罚。在程序执行时,堆和堆栈将定期由垃圾收集器

具体来说,对于 ASP.NET,垃圾收集器在与网站相同的工作进程中运行。GC 会消耗自己的内存。如何很多内存完全取决于应用程序代码的编写方式。一个应用程序可能能够使用 1.8GB 内存,而另一个应用程序可能在 500MB 时就卡住了。为了理解为什么,您需要分析您的特定应用程序。

答案3

x86 Windows 操作系统上的任何进程都限制为 2gb,除非您在 boot.ini 文件中设置了 /3gb 开关,在这种情况下进程可以使用 3gb。

答案4

确保您没有在应用程序池上设置虚拟内存大小。如果您将此值设置为允许范围之外的数字,它将恢复为 512MB。请参阅KB923197

还请注意,如果您正在运行 ASP.Net 应用程序,ASP.Net 将在内存使用量达到 2GB 限制的 60% 或 1.2 GB 时回收池。这不是您的 ~500 场景,但在内存使用量很大的 32 位应用程序池中,我们有时会调整这一点以获得更多内存。

<system.web> 
  <processModel memoryLimit="80" />
</system.web> 

相关内容