我们有一些在 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 错误。