2

我们有一些在 Windows Server 2003 Service Pack 2 上运行的 Win32 控制台应用程序,这些应用程序经常会因此而失败:

错误 1450 ( ERROR_NO_SYSTEM_RESOURCES):“系统资源不足,无法完成请求的服务。”

我们发现的所有文档都表明它与耗尽的免费系统页表条目的数量有关。我们在这些机器中有 16GB 的 RAM,并使用/3GB操作系统开关将 Windows 内核压缩到 1GB,并允许我们的进程访问 3GB 的地址空间。这大大减少了空闲系统页表条目的总数,因此结合我们大量使用 MapViewOfFile() ,内核页表条目即将耗尽可能并不奇怪。

但是,当使用性能监视器查看 Free System Page Table Entries 计数器时,重新启动时该值约为 36,000,并且在我们的应用程序启动时不会下降。我很难相信我们打开许多大型内存映射文件的应用程序对内核页表没有任何影响。如果我们不能相信计数器,那么要测试我们所做的任何系统更改的效果就会变得更加困难。

有一篇很有前途的知识库文章,性能工具没有准确显示 Windows Server 2003 中可用的免费系统页表条目,但它说问题已在 Service Pack 1 中修复,我们已经在 Service Pack 2 中。

有没有其他人遇到过或解决过这个问题?

更新:我在windbg(调试内核)中检查了!sysptes,该值与性能计数器相匹配,大约为36,000。我想这很可能意味着确实有很多免费的页表条目,而 Windows说的实话。如果 PTE 没有用完,它确实留下了为什么我们会收到 1450 错误的问题。

进一步更新:我们从未深入了解为什么会发生 1450 错误。 但是,我们将这些服务器上的操作系统升级到了 64 位 Windows。这允许现有的 32 位应用程序(无需重新编译)访问完整的 4GB 虚拟地址空间,并让带有那些讨厌的页表条目的内核内存区域也尽可能大。从那以后,我认为我们没有出现 1450 错误。

4

3 回答 3

1

您可以尝试使用 windbg 命令“!sysptes”来获取系统 PTE 信息吗?我不确定您是否可以通过实时内核调试来做到这一点,您可能需要进行内存转储。

于 2008-09-13T21:36:38.977 回答
0

我不确定您为什么认为这是由免费的系统页表条目用完ERROR_NO_SYSTEM_RESOURCES引起的?据我所知,此类通用错误代码用于不止一种资源类型。事实上,谷歌的第一个命中表明文件缓存内存不足也可能导致它。(KB 上的一个 XP 错误,它触发了这种错误模式)。

在你的情况下,我会检查“句柄计数”。另一个可能的问题是地址空间碎片。如果要创建 1GB 的文件映射视图,则需要 1GB 的可用地址空间,并且必须是连续的。如果您映射一个 1GB 文件、一个 800 MB 文件和一个 1GB 文件,关闭 800MB 文件并打开一个 900MB 文件,则 900MB 文件可能无法放入剩下的孔中。

于 2008-09-26T13:33:06.733 回答
0

MS 有两种方法可以让 32 位操作系统“处理”具有 4 GB 或更多 RAM 的硬件。

选项 1:是您对 Boot.ini 中的 /3GB 开关所做的操作。

选项 1 优点和缺点:

(缺点)此选项从正常的 2 GB 内核区域中吸取 1 GB - 因此使操作系统难以满足分页池分配和内核堆栈分配的需求。所以有人可能会认为使用 /3GB 开关会对他们有所帮助,但实际上这个选项正在让 32 位 Window OS 慢慢死去。

(缺点)但是,这给了我的应用程序 3GB.... 错误(因此这是一个缺点)问题是,只有从供应商重新编译为“/3GB 开关感知”的应用程序才能真正使用额外的 1 GB . 因此,整个使用 /3GB 开关对每个人来说都是一个非常糟糕的笑话。

阅读此链接以获得更好的文章:

http://blogs.technet.com/askperf/archive/2007/03/23/memory-management-demystifying-3gb.aspx

选项 2:使用 Boot.ini 中的 /PAE 开关。

选项 2 优点和缺点:

(优点)如果您有超过 4GB 的 RAM,这确实是唯一的选择。它通过将完整的应用程序内存占用放在 RAM 中来欺骗应用程序。通常,只有一个应用程序“工作集”内存在 RAM 中,其余的应用程序内存需求进入 Windows 页面文件。什么是应用程序总内存要求?- 它称为“虚拟大小”。

在我的世界里,我处理了一个基于 Java 的大型 IBM 产品。运行“应用程序”的服务器有 16 GB 的 RAM。我只需添加 /PAE 开关并观察(感谢 sysinternals Processes Explorer)应用程序分页请求从每秒 200 KB 增加到每秒 4MB。

问题: “为什么”?

答:整个应用程序都在 RAM 中。

问题: “应用程序是否知道它完全在 RAM 中运行?

回答:否 - 它以与始终运行相同的旧方式运行,“认为”它自身的一部分是位于 RAM 中的“工作集”内存,其余的应用程序内存需求进入 Windows 页面文件。

是的,就是这样翻转好。

请注意:Microsoft 在告诉任何人有关出色的 Windows 操作系统选项方面做得很差。呵呵

试试看,然后向 stackoverflow 报告....

于 2009-05-06T06:23:28.917 回答