我有一个在 Windows 2003 SP2 x86 上运行的 IIS 6 服务器。该服务器具有 4GB 的 RAM,并在分配 2GB 的情况下始终如一地运行。
我意识到使用 x86,服务器不会利用所有 4GB RAM,应用程序空间也有限,但 IIS 进程似乎在其他地方受到限制。w3wp.exe 分配的内存从未超过 500MB,而且我偶尔会从繁忙的 .NET 应用程序中得到 OutOfMemory 异常(有几个应用程序正在运行,每个应用程序都有一个单独的应用程序池)。
IIS6 网站/应用程序池可以使用的最大内存是多少?
Windows x86 下的应用程序限制为 2gb/ea。您可以通过将 /3gb 标志添加到 boot.ini 来更改此设置,但这可能会导致意外的应用程序行为,应谨慎使用。MS官方不支持这个(http://technet.microsoft.com/en-us/library/bb124810.aspx)
IIS 的内存限制可以在相关应用程序池的回收选项卡下设置。
您如何确定应用程序永远不会超过 500MB?如果您使用的是任务管理器,请记住,它很少(如果有的话)准确地表示 Windows 理解的内存使用情况。使用进程资源管理器: http ://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
还有一些其他相关的问题:
即使 Windows 任务管理器没有显示 IIS、ASP.NET 和所有相关的包,很可能都在运行 2GB 限制。设置回收限制或升级到 x64 可能会产生巨大的影响。
这个问题的答案太复杂了,无法回答。有关该主题的完整处理,请参阅“调整 .NET 应用程序性能”。
这是Bruno Jouhier的一个非常简单(但仍然相当不错)的摘要:
编辑:
这是我的解释尝试...
如果您想知道 x86 上的 ASP.NET 工作进程的最大工作进程内存大小(由任务管理器报告)是多少,答案是“它取决于”。
在任何类型的托管代码(如 Java 或 .NET)中,程序员都放弃了对内存的细粒度控制,以此作为对不必处理指针的惩罚。当程序执行时,垃圾收集器会定期清理堆和堆栈。
特别是对于 ASP.NET,垃圾收集器在与网站相同的工作进程中运行。GC 消耗自己的内存。多少内存完全取决于应用程序代码的编写方式。一个应用程序可能能够使用 1.8GB 的内存,而另一个应用程序可能会阻塞 500MB。为了了解原因,您需要分析您的特定应用程序。
x86 Windows 操作系统上的任何进程都限制为 2gb,除非您在 boot.ini 文件中设置了 /3gb 开关,在这种情况下,进程可以使用 3gb。
从此博客文章“SharePoint 应用程序池设置建议”:
根据我的经验, 800 MB是 32 位机器(2-4 GB RAM)的门槛。它在抛出“内存不足”异常之前回收应用程序池。
确保您没有在应用程序池上设置虚拟内存大小。如果将此值设置为允许范围之外的数字,它将恢复为 512MB。请参阅KB923197。
另请注意,如果您正在运行 ASP.Net 应用程序,ASP.Net 将以 2GB 内存限制的 60% 或 1.2 GB 回收池。这不是您的 ~500 方案,但是在具有大量内存使用的 32 位应用程序池上,我们有时会调整它以获得更多内存。
在 Windows 2003 上,您可以设置物理分配扩展(PAE) 以使用所有内存。IIS6 应用程序池的默认内存是5MB。