我们目前正在评估将 /3gb 开关添加到我们的一些服务器,以增加超出 2gb 限制的正在运行的进程之一(使用 IMAGEFILELARGEADDRESSAWARE 标志集编译)的可用内存。
但是,我想了解的是内存是如何在具有 > 4gb RAM 的服务器上的内核和用户进程之间分配的。根据文档,Windows 将在 4gb 系统上的内核和用户进程之间拆分 2gb / 2gb 内存。当您在服务器上启用 /3gb 时,内存被拆分为 1gb / 3gb。
我想知道的是,在启用了 6gb RAM 和 PAE 的服务器上,内存是如何分割的??内核是否仍被限制为 1gb?
干杯山姆
我想我会为其他人发布后续信息,以尝试将信息整合到一个帖子中(基于我所学到的知识和已经发布的其他信息)。
PAE:
PAE 将允许 32 位 Windows 服务器使用或超过 4GB 的 RAM,最大值取决于您正在运行的 Windows 版本(维基百科在这里有一个很好的参考)
需要注意的一点是,如果您打开了数据执行保护 (DEP) 或 NoExecution (NX),那么这将有效地启用 PAE,而无需在 boot.ini 中显式启用它。
归根结底,PAE 对单个 32 位进程可以访问的内存量没有影响。它只影响窗口可以“看到”和使用的内存总量(因此您可以有 2 个进程,每个进程使用 2GB,Windows 在 6GB 系统上使用 2GB)
3GB:
首先,当我谈到单个 32 位进程可用的内存时,我指的是进程虚拟地址空间。对于 32 位 Windows 操作系统上的 32 位进程,此限制为 4GB。
在没有/3GB 开关的系统上,4GB 的虚拟地址空间在正在运行的进程和 Windows 内核之间分割为 2GB / 2GB。
当您启用 3GB 开关时,虚拟地址空间的分割更改为 3GB / 1GB。这允许进程以内核内存为代价使用更多内存。请注意:如果可执行文件已使用 IMAGEFILELARGEADDRESSAWARE 标志集进行编译,Windows 将只允许进程使用更多的 2GB 或内存。
现在,正如其他帖子中提到的那样,使用 3GB 开关的代价是内核可以使用的内存更少。内存减少的主要损失之一是可用的页表条目 (PTE) 的数量。页表是 Windows 虚拟内存管理器用来存储内存中虚拟地址和物理地址之间的映射的数据结构。如果您没有足够的可用 PTE,则窗口可能无法在请求时为进程分配内存,即使该进程尚未耗尽其地址空间。
可以使用 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 知识库文章。
还值得一提的是,启用 PAE 也会对免费 PTE 计数产生影响。PAE 开关使每个 PTE 条目使用正常分配的虚拟地址空间的两倍。
希望这为以后查看的任何人提供了一个简洁的信息摘要。
干杯山姆
收听RunAs Radio 的这一集。
这一集的主要焦点涵盖了显而易见的“为什么 64 位更好”——然而,嘉宾进入了“为什么应该避免 /3GB”。基本上,它显着减少了操作系统可用的页表条目的数量——以至于操作系统变得不稳定。
简而言之 - 它可能适用于为单一功能提供服务的服务器(如 AD 控制器或 SQL Server),但应避免在提供多种功能的系统上使用。归根结底,“您的里程可能会有所不同”——请记住,/3GB 很容易使操作系统不稳定。
即使应用程序只有 32 位,您也可能需要考虑 64 位操作系统。在 Windows x64 上,32 位进程获得 4GB 的 RAM,而不是 2GB。
有关详细信息,请参阅KB294418的虚拟内存部分。
据我所知,PAE 开关允许服务器上的应用程序访问 4GB 以上的内存。根据这个技术说明,应用程序并不真正了解这种内存交换,它都是在 Windows 中处理的。我认为在 6GB 服务器中使用 /3GB 开关会将内核限制为 1GB。同时使用 /3GB 和 /PAE 引入的另一个限制是服务器地址不能超过 16GB。
除非您试图为应用程序消耗每一 MB 内存,否则您可能只想使用 /PAE 而不是 /3GB。这样一来,如果有一天您总共使用 24 或 32GB 的 RAM,您就不必尝试找出 Windows 仅使用 16GB 的原因。
在我以前的系统上,我使用了 /3GB 开关,因为我的一个应用程序需要大量内存。最近,我升级到了 64 位 Vista 系统,并将应用程序升级到了 64 位版本,这使它拥有我现在拥有的全部 12 GB。但是,其他 32 位应用程序仍然受限于相同的 3 GB 内存(或没有开关的 2 GB),仅仅是因为它们无法看到超出地址指针的大小。(并且在 32 位系统中,地址指针是 32 位...)
但是,只要 Windows 本身能够处理更大的地址指针,/3GB 开关与超过 3 GB 的 RAM 组合仍然有用。它允许 Windows 将更多的应用程序保留在内存中,因此它交换到磁盘的次数要少得多,从而提高了性能。
PAE 是一种硬件技巧,处理器有更多的引脚来发送地址。它们已从 32 个引脚(位)增加到 36 个引脚。这允许任何知道这些附加引脚的应用程序使用高达 64 GB 的 RAM。微软在他们的服务器软件中很好地利用了这一点,因此 Windows 最多可以处理 64 GB。如果消耗这么多内存的进程也知道这些额外的引脚,它也可以分配多达 64 GB 的 RAM。这种应用程序技术称为地址窗口扩展. 当然,这也需要应用程序中的特殊代码来处理这个内存,这让我想起了旧的 MS-DOS 时代,应用程序指针最初仅限于 16 位(64 KB),但因为处理器有 20 个引脚(后来是 24 ),您可以使用特殊的 32 位指针来指向一个地址,或者只是坚持使用较旧的 16 位指针并保持在 64 KB 以内。(20 位是 1024 KB,DOS 使用底部 640 KB 或 1 GB 以上的所有内容。24 位是 4 GB,这在最初的 80386 处理器中很流行作为上限。)
当我阅读 Mark Russinovich 的优秀文章Pushing the Limits of Windows: Physical Memory时,是的......即使在具有高达 128GB 的系统上,使用 /3GB 开关安装 32 位 Windows 时内核可用的 1GB 内存仍然存在RAM(支持 32 位安装的 W2K3 数据中心)。
Raymond Chen,Microsoft 的一位 Windows shell 程序员,在他的博客上有一系列关于 /3GB 开关、PAE、AWE 和 NX 的精彩文章。对于任何试图了解这一切如何运作、如何相互作用以及为什么在许多情况下它可能不是你想要的东西的人来说,它们都应该是必读的:
http://blogs.msdn.com/oldnewthing/archive/2004/08/22/218527.aspx