我们目前正在评估将一些/ 3gb开关添加到我们的某些服务器,以增加一个正在运行的进程(使用IMAGEFILELARGEADDRESSAWARE标志集编译)的可用memeory,该进程已经超过了2gb的限制。
但是,我想了解的是内存如何分配在内存和用户进程之间> 4GB内存的服务器上。 根据doco,Windows将在4gb系统上将内核和用户进程之间的内存2gb / 2gb拆分。 当您在服务器上启用/ 3gb时,内存被拆分为1gb / 3gb。
我想知道的是如何在6GB RAM和PAE启用的服务器上分割内存? 内核是否仍然受限于1GB?
干杯山姆
我想我会发布一个后续的其他人尝试将信息整合到一个单一的职位(根据我所学到的和已发布的其他信息)。
PAE:
PAE将允许一个32位Windows服务器使用或超过4GB内存,最大取决于您正在运行的Windows版本(维基百科在这里有一个很好的参考)
需要注意的一点是,如果您启用了数据执行保护(DEP)或NoExecution(NX),那么这将有效启用PAE,而不必在boot.ini中明确启用它。
底线,PAE不会影响单个32位进程可以访问的内存量。 它只影响可以“看到”和使用的内存窗口总量(所以你可以有2个进程每个使用2GB,而Windows在6GB系统上使用2GB)
3GB:
首先,当我谈到可用于单个32位进程的内存时,我指的是进程虚拟地址空间 。 对于32位Windows操作系统上的32位进程,此限制为4GB。
在没有 / 3GB交换机的系统上,运行进程和Windows内核之间的4GB虚拟地址空间被拆分为2GB / 2GB。
当您启用3GB交换机时,虚拟地址空间中的拆分将更改为3GB / 1GB。 这允许进程使用更多的内存,代价是内核内存。 请注意:如果使用IMAGEFILELARGEADDRESSAWARE标志设置了可执行文件,Windows将只允许进程使用更多的2GB或内存。
现在,正如在其他文章中已经提到的那样,使用3GB交换机的代价是内核的内存要less一些。 内存减less的主要原因之一是可用的页表条目(PTE)数量。 页表是Windows虚拟内存pipe理器用来存储虚拟地址和物理地址在内存中的映射的数据结构。 如果没有足够的空闲PTE,那么即使进程还没有耗尽其地址空间,windows也可能无法在请求时为进程分配内存。
可以使用perfmon(\ Memory \ Free System Page Table Entries)来测量免费的PTE计数。 任何5000以下的东西都被微软视为关键。 例如,在原文中提到的服务器上,如果没有3GB交换机并且正在运行进程,则免费的PTE计数约为160k。 启用3GB之后,但在该过程开始之前,Windows报告了3.5k免费PTE(大幅降低)。 如果我们已经开始这个过程,这个数字会迅速下降。
弥补这一巨大变化的方法是在boot.ini中启用USERVA开关。 通过设置USERVA = 2800,这将移动内存中的3GB / 1GB分区,并将“返回”大约250MB返回给内核使用。 举例来说,在我们的系统的boot.ini中设置USERVA = 2800之后,在进程运行的情况下,免费的PTE计数现在约为60k(比我们所看到的3.5k好很多)。
有关USERVA开关的更多信息可以在Microsoft知识库文章中find 。
另外值得一提的是,启用PAE也会对免费的PTE计数产生影响。 PAE开关使每个PTE条目使用两倍于正常分配的虚拟地址空间。
希望这可以提供一个很好的简要的信息,任何人看日后的信息。
干杯山姆
听这个 RunAs无线电的情节。
这一集的主要焦点涵盖了明显的“为什么64位更好” – 但客人进入“为什么/ 3GB应该避免。”基本上,它大大减less了操作系统可用的页表项的数量 – 以至于OS可能会变得不稳定。
在一个坚果shell中 – 对于服务单个function的服务器(如AD控制器或SQL Server)可能是合适的,但是应该避免在提供多种function的系统上使用。 在一天结束时“你的里程可能会有所不同” – 记住/ 3GB可以很容易地使操作系统不稳定。
即使应用程序只有32位,您也可能要考虑使用64位操作系统。 在Windows x64上,32位进程获得4GB的RAM,而不是2GB。
有关详细信息,请参阅KB294418的虚拟内存部分。
据我所知,PAE交换机允许访问4GB以上的内存给服务器上的应用程序。 根据这个技术 ,应用程序并不真正了解这个内存交换,它都是在Windows内处理的。 我认为在6GB服务器中使用/ 3GB开关会将内核限制为1GB。 同时使用/ 3GB和/ PAE引入的另一个限制是服务器的地址不会超过16GB。
除非你试图为应用程序提供每MB的内存,否则你可能只需要使用不带/ 3GB的/ PAE。 这样,如果有一天你总共popup24或32GB的内存,那么你就不必去尝试弄清楚为什么Windows只用了16GB。
在我以前的系统上,我使用了/ 3GB开关,因为我的一个应用程序需要大量的内存。 最近,我升级到了64位Vista系统,并将应用程序升级到了64位版本,这使得我现在拥有了全部的12 GB。 但是,其他32位应用程序仍然限制在相同的3 GB内存(或不带开关的2 GB),因为它们看不到地址指针的大小。 (在32位系统中,地址指针是32位…)
然而,只要Windows本身能够处理更大的地址指针,/ 3GB开关结合超过3 GB的RAM仍然是有用的。 它允许Windows将更多应用程序保存在内存中,从而减less了对磁盘的交换,从而提高了性能。
PAE是硬件技巧,处理器有几个引脚来发送地址。 他们从32个引脚(位)增加到36个引脚。 对于任何知道这些附加引脚的应用程序,这允许高达64 GB的RAM。 Microsoft在其服务器软件中充分利用了这一点,因此Windows最多可以处理64 GB的内容。 如果消耗大量内存的进程也意识到这些额外的引脚,它也可以分配高达64 GB的RAM。 这种应用程序的技术被称为地址窗口化扩展 。 当然,这也需要在应用程序内部处理这个内存的特殊代码,并且让我想起应用程序指针最初仅限于16位(64KB)的旧MS-DOS时代,但由于处理器有20个引脚(后来24 ),您可以使用特殊的32位指针指向一个地址,或者只使用较旧的16位指针,并将其限制为64 KB。 (20位是1024 KB,DOS使用的是底部640 KB或1 GB以上的所有内容,24位是4 GB,这是第一个80386处理器普遍使用的上限)
正如我读到马克Russinovich的优秀post推动Windows的限制:物理内存 ,是的…在32位安装的Windows上的内核可用的1GB的内存与/ 3GB交换机仍然存在,即使在系统有高达128GB的RAM(支持W2K3 Datacenter的32位安装)。
Windows Server 2003数据中心版支持128GB的最大32位限制,这是由于内存pipe理器用于跟踪物理内存的结构会在较大的系统上占用系统的虚拟地址空间太多。 内存pipe理器跟踪一个称为PFN数据库的数组中的每个内存页面,为了性能,它将整个PFN数据库映射到虚拟内存中。 因为它代表了28字节数据结构的每页内存,128GB系统上的PFN数据库需要大约930MB。 32位Windows有一个由硬件定义的4GB虚拟地址空间,在当前执行的用户模式进程(例如记事本)和系统之间默认分割。 980MB因此消耗了可用的2GB系统虚拟地址空间的将近一半,仅剩下1GB用于映射内核,设备驱动程序,系统caching和其他系统数据结构,从而使得合理的中断:*
微软Windows shell程序员Raymond Chen在他的博客上发表了一系列有关/ 3GB开关,PAE,AWE和NX的文章。 他们应该被要求阅读任何人试图了解它是如何工作,如何相互作用,以及为什么在许多情况下,它可能不是你想要的:
http://blogs.msdn.com/oldnewthing/archive/2004/08/22/218527.aspx