“浅谈对于虚拟内存的一些认识”说到自己对操作系统中虚拟内存的一些认识,其中提到“/3GB switch”这个概念。它涉及到Windows到底如何使用大内存的问题,在这里就详细的说一下。
2^32 = 4,294,967,296 bytes
4,294,967,296 / (1,024 x 1,024) = 4,096 MB = 4GB
  从上面的算式可以得出这样的结论,所有32位应用程序都有 4 GB 的进程地址空间(32位地址最多可以映射 4 GB 的内存)。对于Microsoft Windows 操作系统,应用程序可以访问 2 GB 的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余 2 GB 为操作系统保留(也称为内核模式地址空间)。
  典型情况是当物理内存不大于 4 GB 时,在Windows下运行的进程最多可以访问 2 GB 的内存地址空间,其中一些内存是物理内存,另一些是虚拟内存(物理内存为 4 GB 则完全使用物理内存而不需要虚拟内存)。此时,运行的程序越多进程也越多,占用的内存地址空间也就越接近 2 GB 这一最大值。当出现这种情况时,分页进程将显著增加并且会对性能产生负面影响。为了避免这种情况,需要向程序提供更多的物理内存这会降低对交换页面文件内存的需要,通常会使用 /3gb 参数或者 /pae 参数和AWE(也有两者都使用的情况,但个人不建议)。
  系统分配给应用程序的地址空间和CPU能够访问的物理内存并不是一个概念,地址空间受到限制只能有 4 GB 但CPU则能够访问大于 4 GB 的物理内存,地址空间和物理内存的分配是没有关联的。 AWE 通过函数调用与系统协商把一段地址空间与某一段物理内存映射(使用三级指针,增加一级指针。以2的指数次方的效果增加了可以访问的内存容量),应用程序除了按照通常方法访问的物理内存以外,获得的额外物理内存虽然增加了一些开销,但与物理内存和硬盘之间的页面交换还是提高了效率。

1、/3gb 参数。
为了支持 3 GB 的用户模式进程空间,必须将 /3gb 参数添加到boot.ini文件中并重新启动计算机,从而使 /3gb 参数生效。设置此参数后,用户应用程序线程可以寻址 3 GB 的进程地址空间,而为操作系统保留 1 GB 的进程地址空间。它的思想是让应用程序所需的内存有更多部分在物理内存中,而不是在分页的虚拟内存中,但是这样使得内核模式地址空间被压缩,前面提到的 Non-Paged Pool会从256M下降到128M,因此操作系统的很多操作也会受到限制。
使用 /3gb 参数最多能为应用程序多提供 1 GB 地址空间,所以个人建议不要挤占内核模式地址空间使用 /pae 而不是 /3gb 参数。
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Windows Server 2003, Enterprise" /fastdetect /3GB
2、/pae 参数和AWE。
物理地址扩展(Physical Address Extension-以下简称PAE)可以支持 4 GB 以上物理内存,PAE允许将最多 64 GB 的物理内存用作常规的 4 KB 页面。向 Boot.ini 文件添加 /pae 参数并重新启动计算机后系统将支持 4 GB 以上的物理内存。
地址窗口化扩展插件(Address Windowing Extensions-以下简称AWE),AWE 是 Windows 的内存管理功能的一组扩展,它使应用程序能够使用的内存量超过通过标准 32 位寻址可使用的 2-3 GB 内存。AWE 允许应用程序获取物理内存,然后将非分页内存的视图动态映射到 32 位地址空间。虽然 32 位地址空间限制为 4 GB,但是非分页内存却可以远远大于 4 GB。这使需要大量内存的应用程序(如大型数据库系统)能使用的内存量远远大于 32 位地址空间所支持的内存量。AWE 只能应用于 32 位操作系统。
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Windows Server 2003, Enterprise" /fastdetect /PAE
注:如果计算机上的可用物理内存超过 16 GB,操作系统就需要 2 GB 的虚拟地址空间供系统使用,因此只能支持 2 GB 的用户模式虚拟地址空间。为了使操作系统能够使用超过 16 GB 的内存,应确保 Boot.ini 文件中没有 /3gb 参数。如果存在该参数,操作系统就不能使用超过 16 GB 的物理内存。
下面的示例说明了如何配置 AWE
1、SQL Server 2000,启用 AWE 并将 max server memory 配置为 12 GB:
--显示高级选项,默认某些隐藏选项无法查看和更改。
sp_configure 'show advanced options', 1
--更新系统存储过程更改的配置,使用当前已配置值。
RECONFIGURE
GO
--启用 AWE
sp_configure 'awe enabled', 1
RECONFIGURE
GO
--配置最大服务内存为 12G
sp_configure 'max server memory', 12288
RECONFIGURE
GO
2、SQL Server 2005,启用 AWE 并将 min server memory 配置为 4 GB,将 max server memory 配置为 12 GB:
启用 AWE:
sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'awe enabled', 1
RECONFIGURE
GO
重新启动 SQL Server 后,SQL Server 错误日志中应显示以下消息:
Address Windowing Extensions enabled
配置内存:
sp_configure 'min server memory', 4096
RECONFIGURE
GO
sp_configure 'max server memory', 12288
RECONFIGURE
GO
对上面的设置有以下几点说明:
(1)、SQL Server 2005启用 AWE 之后需要重启SQL Server服务,而2000没有要求重启。
(2)、SQL Server 2005支持动态分配 AWE 映射内存,内存设置使缓冲池动态管理 4 GB 到 12 GB 之间的 AWE 映射内存,而SQL Server 2000中不适用此动态 AWE 。
(3)、 min server memory 保证了 SQL Server 实例的缓冲池可用的最小内存量。SQL Server 不会在启动时立即分配 min server memory 指定的内存量。不过,除非降低 min server memory 的值,否则当内存使用量由于客户端负荷而达到该值后,SQL Server 不能从已分配的缓冲池中释放内存。
SQL Server 并不一定分配 min server memory 指定的内存量。如果服务器上的负荷从不需要分配 min server memory 指定的内存量,则 SQL Server 将以较少的内存运行。
(4)、 max server memory 避免了 SQL Server 缓冲池使用的内存量多于指定的内存量,这样剩余的可用内存可以用来快速启动其他应用程序。SQL Server 不会在启动时立即分配 max server memory 指定的内存量。内存使用量会随着 SQL Server 的需要增加,直到达到 max server memory 指定的值。除非提高 max server memory 的值,否则 SQL Server 不能超过此内存使用量。
(5)、SQL Server 2005需要在启用 AWE 之前锁定内存页,启用之后最大化网络应用程序数据吞吐量
(6)、锁定内存页
确定哪些帐户可以使用进程将数据保留在物理内存中,从而阻止系统将数据分页到磁盘的虚拟内存中。在 SQL Server 2005 中,“锁定内存页”选项默认设置为 OFF,需要将此权限指定给正在运行 SQL Server 的帐户。
如何启用“锁定内存中的页”选项
1). 在“开始”菜单上,单击“运行”。在“打开”框中,键入 gpedit.msc。
    将打开“组策略”对话框。
2). 在“组策略”控制台上,展开“计算机配置”,再展开“Windows 设置”。
3). 展开“安全设置”,再展开“本地策略”。
4). 选择“用户权利指派”文件夹。
    细节窗格中随即显示出策略。
5). 在该窗格中,双击“锁定内存中的页”。
6). 在“本地安全策略设置”对话框中,单击“添加”按钮。
7). 在“选择用户或组”对话框中,添加有权运行 sqlservr.exe 的帐户。
(7)、最大化网络应用程序数据吞吐量
如果在“网络连接”中选中了“最大化文件共享的数据吞吐量”选项,则操作系统将在文件系统缓存中缓存应用程序的 I/O 页面,从而优先处理执行缓冲输入/输出 (I/O) 操作的应用程序。此选项可能会限制可用于 SQL Server 正常操作的内存。
检查当前操作系统的设置:
1). 在“控制面板”中,双击“网络连接”,再双击“本地连接”。
2). 在“常规”选项卡上,单击“属性”,选择“Microsoft 网络的文件和打印机共享”,再单击“属性”。
3). 选中“最大化网络应用程序数据吞吐量”,单击“确定”,再关闭其余对话框。
  上面罗嗦了半天实际上就是对Windows系统如何支持 4 GB 以上的物理内存。这里参考了SQL Server 2005 联机丛书以及283037和274750两篇KB。

看过51CTO朋友xintao800的一篇关于虚拟内存的文章,对里面的一些观点保留意见。