Windows Server 2003 SP2是否能说明有关免费系统页表项的真相?

时间:2020-03-05 18:52:14  来源:igfitidea点击:

我们在Windows Server 2003 Service Pack 2上运行了一些Win32控制台应用程序,这些应用程序通常会因以下原因而失败:

Error 1450 (ERROR_NO_SYSTEM_RESOURCES): "Insufficient system resources exist to complete the requested service."

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

但是,使用Performance Monitor查看"可用系统页表条目"计数器时,重新启动时该值约为36,000,并且在我们的应用程序启动时不会降低。我很难相信我们的应用程序(它打开了许多大的内存映射文件)对内核页表没有任何影响。如果我们不敢相信计数器,那么测试我们所做的任何系统更改的效果就会更加困难。

有一篇很有前途的知识库文章,《性能工具》不能准确显示Windows Server 2003中可用的"免费系统页面表"条目,但它表示此问题已在Service Pack 1中得到解决,而我们已经在Service Pack 2中了。

还有其他人为这个问题苦苦挣扎或者解决了吗?

更新:我已经在windbg中检查了!sysptes(调试内核),并且该值与性能计数器相匹配,大约为36,000。我猜这很可能意味着确实有很多免费页表项,而Windows讲的是实话。确实留下了一个问题,即如果PTE没用完,为什么会出现1450错误。

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

解决方案

回答

我们可以尝试使用windbg命令"!sysptes"来获取系统PTE信息吗?我不确定是否可以使用实时内核调试来执行此操作,我们可能必须获取内存转储。

回答

我不确定为什么我们认为ERROR_NO_SYSTEM_RESOURCES是仅由免费的系统页面表条目用完引起的吗?据我所知,此类通用错误代码用于多种资源类型。实际上,Google的第一条命中表明文件高速缓存内存不足也可能导致它。 (XP错误的KB,导致此错误模式跳闸)。

就我们而言,我将检查"句柄计数"。另一个可能的问题是地址空间碎片。如果要创建1GB的文件映射视图,则需要1GB的可用地址空间,并且该空间必须是连续的。如果我们映射1GB文件,800 MB文件和1GB文件,请关闭800MB文件并打开900MB文件,这900MB文件可能不适合剩余的孔。

回答

MS有两种方法可以让32位OS与具有4 GB或者更大RAM的硬件"交易"。

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

选项1利弊:

(CONS)此选项从正常的2 GB内核区域中吸取1 GB,因此使OS难以满足分页缓冲池分配和内核堆栈分配的需求。因此,人们可能会认为使用/ 3GB开关会对他们有所帮助,但实际上,此选项使32位Window OS陷入了缓慢的死亡。

(CONS)但是,这给我的应用程序提供了3GB。...错误(因此这是一个CON)问题在于,只有从供应商重新编译为" / 3GB切换感知"的应用程序才可以真正使用额外的1 GB 。因此,/ 3GB交换机的整个使用对每个人来说都是一个非常糟糕的经历。

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

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

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

选项2利弊:

(PROS)如果RAM大于4GB,这实际上是唯一的选择。它通过将完整的应用程序内存占用空间放置在RAM中来欺骗应用程序。通常,RAM中只有应用程序"工作集"内存,其余的应用程序内存需求进入Windows Pagefile。应用程序总内存需求是多少?它称为"虚拟尺寸"。

在我的世界中,我有一个很庞大的基于Java的IBM产品,我正在处理。运行"应用程序"的服务器具有16 GB的RAM。我只需添加/ PAE开关,然后观察(由于使用sysinternals Processes Explorer)应用程序分页请求就从每秒200 KB上升到每秒4MB。

问题:"为什么"?

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

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

答:否。它一直以与以前相同的方式运行,"思考"是它的一部分,它本身是内存中的"工作集"内存,其余应用程序内存需求进入Windows Pagefile。

是的,这就是好事。

请注意:Microsoft在向所有人介绍出色的Windows OS选项方面做得很差。 h

试试看,并报告给stackoverflow...。