gpt4 book ai didi

c# - processModel memoryLimit 是否仅适用于 ASP.Net? (System.OutOfMemoryException)

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:57 34 4
gpt4 key购买 nike

我们正在运行基于 .Net 1.1 的 Windows 服务(不是 ASP.Net 应用程序),并且在高负载下出现 System.OutOfMemoryException 错误。

该服务基本上托管一个内存缓存,由 Assets 哈希表组成,其中嵌套了一个帐户哈希表,其中是一个存储给定时间段( Assets +账户组合)值的类。该服务向客户端提供此数据的聚合,并接受对数据的更新。节点总数在整个服务生命周期内保持不变。

在 machine.Config 中,我们看到如下内容:

    <processModel 
enable="true"
timeout="Infinite"
idleTimeout="Infinite"
shutdownTimeout="00:00:05"
requestLimit="Infinite"
requestQueueLimit="5000"
restartQueueLimit="10"
memoryLimit="60"
webGarden="false"
cpuMask="0xffffffff"
userName="machine"
password="AutoGenerate"
/>

这些似乎都与 ASP.Net/IIS 应用程序有关,但我们的 OutOfMemoryException 不会在 ASP.Net 下发生,并且似乎没有针对非 ASP 应用程序的等效配置设置。

这部分是否适用于所有基于 .Net 的应用程序,而不仅仅是 ASP.Net?

我问是因为,当错误发生时,我们的服务消耗了大约 1.2 GB 的内存(我们在内存中存储了一个大型数据库,是的,这是有充分理由的),巧合的是大约等于 2GB 的 60%( 32 位应用程序的内存“限制”)。这个明显的 IIS 配置设置是否会导致我们的 Windows 服务内存也被限制?

更复杂的是,我们在 64 位 Windows Server 2003 下的 .Net 1.1 32 位 上运行(是的,我们确实有理由这种不寻常的配置),具有 12 GB 的 RAM。据我了解,每个 32 位进程应该能够处理多达 4GB 的 RAM,不是吗?或者,这是否需要更改注册表或 .Net 配置文件?

注意:我知道/3GB windows 启动开关,但由于我们在 64 位 windows 上,我认为这不应该适用(但如果我错了请随时纠正我)。

更新1

人们似乎同意 processModel 配置仅特定于 ASP.Net 应用程序。

一个答案说 64 位操作系统上的 32 位应用程序仍然有每个进程 2GB 的限制,但我能找到的大多数引用资料都说 每个 32 位进程可以访问 4GB 64 位操作系统。 (但是,也许这只能通过设置 IMAGEFILELARGEADDRESSAWARE 位来启用?)

一些相关链接

如何为 C# 应用设置 IMAGE_FILE_LARGE_ADDRESS_AWARE 位:
http://bytes.com/groups/net-c/569198-net-4gt

在 x64 操作系统 (32Gb Ram) 上使用 Web Garden 的 32 位应用程序的 IIS6 可用内存:
IIS6 Available Memory for 32-Bit Application with Web Garden on x64 OS (32Gb Ram)

.NET 调试演示实验 3:内存:
http://blogs.msdn.com/tess/archive/2008/02/15/net-debugging-demos-lab-3-memory.aspx
应该有助于找到 OutOfMemoryException 的细节?

突破极限——虚拟内存:
http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx
阅读本文以了解概念,并使用 teSTLimit 排除机器/配置问题。一旦确信这是您的应用程序的错,请阅读并重新阅读 Tess 博客中的文章。

最终更新

好吧,对于我们的情况,结果显然是缺少 .Net Service Pack....显然远程处理有一个问题,在 Service Pack 之后它完全清除了这个异常!

最佳答案

processModel 配置元素特定于 ASP.NET 进程,不适用于其他 .NET 进程。

如果您在 64 位操作系统上运行 32 位进程,您仍然受到 32 位进程的进程限制,即 2GB。实际限制实际上接近 1.5 到 1.8GB,具体取决于您的应用程序特征 - 换句话说,您实际上不太可能达到 2GB 进程障碍。

为了让您的 Windows 服务充分利用您期望的 4GB 进程空间,您需要:

  • 将您的进程标记为 LARGE_ADDRESS_AWARE。相信这可以使用 editbin.exe 来完成,但我从来没有这样做过!它还可能会打开一个新的蠕虫 jar 头......:) 我会看看我是否无法验证。
  • 在 boot.ini 中添加/3GB
  • 重启服务器

还要考虑应用程序的内存分配配置文件。如果您分配的对象大小大于 85K,那么这些对象将分配到大对象堆中。大型对象堆已清除,但不像其他堆那样被压缩,这意味着您可能会遇到碎片,这最终将阻止 .net 内存管理器分配连续的内存块来满足请求。

您可能想要对进程进行快照并查看哪些对象在哪些堆中,以便更好地了解进程内存空间内正在发生的事情。

另外,检查服务器上页面文件的大小。考虑到它在所有进程之间共享,大小不当的页面文件也可能导致问题,尽管这往往会因系统异常而出错,并带有一些关于“虚拟内存”的措辞。

祝你好运!

Z

引用资料:

Memory Limits for Windows Releases

Tess Ferrandez, .NET Debugging: Memory

关于c# - processModel memoryLimit 是否仅适用于 ASP.Net? (System.OutOfMemoryException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1230413/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com