物理内存
物理内存通常涉及到RAM(随机存取存储器),但它实际上还包括系统页面文件。RAM也称为主存或系统存储器,因为它是直接由CPU寻址。它被认为是你可以使用的最快的存储类型,但它是易失的,这意味着重启电脑时,会丢失所存储的东西。它也是昂贵的,与非易失性的存储(如硬盘)相比,其容量是有限的。因此,服务器用硬盘的组合来存储数据,然后将其加载到RAM中,在这里它可以更快地得到处理。
相比之下,RAM模块的吞吐量是以每秒千兆字节(GB /秒)与纳秒(ns)的响应时间来衡量,而硬盘是每秒兆字节(MB /秒)和毫秒(ms),SSD通常是MB / s和微秒(μs)。
下图显示不同版本和功能的SQL Server 2012可用的内存容量。Windows Server 2008 R2标准版最大支持32GB,Windows Server 2008 R2企业版最大支持2TB,而Windows Server 2012则最大支持4TB内存。
虚拟内存
如果计算机上运行的所有的程只能使用物理内存地址,该系统将很快遇到瓶颈。所有的进程必须共享相同的地址范围,这是受限于安装在计算机上的RAM的数量。因为物理RAM可以快速访问,并且不能无限制地增加,因此,它是一个需要被有效地利用的资源。Windows为每个进程分配一个虚拟地址空间(VAS),这在提应用程序和物理存储器之间提供了一个抽象层,使得操作系统可以为所有的进程选择使用的物理存储器的最有效方式。例如,两个不同的进程可以同时使用的内存地址0xFFF,因为它是一个虚拟地址,每个进程都有自己的具有相同的地址范围的VAS。
地址映射到物理内存与否,取决于操作系统,更确切地说,虚拟内存管理器。
虚拟地址空间的大小很大程度上取决于CPU架构。64位CPU上运行64位软件(也称为x64平台),之所以如此命名,是因为它是基于可以处理最大为64位长度值的架构。16TB的虚拟地址空间,在逻辑上分成8TB的两个范围:一个用于进程和一个保留给系统使用。这两个范围通常被称为用户模式和内核模式的地址空间,如下图所示:
每个应用程序(例如,SQL Server)中最多可以访问增值服务8TB,因此高达8TB内存(取决于操作系统支持 -还记得Windows Server 2012中支持4TB内存,所以我们已经完成一半了)。每个应用进程(例如SQL Server),最多可以访问8TB的VAS,因此高达8TB RAM,Windows Server 2012支持4TB内存。
虚拟内存管理器
虚拟内存管理器(VMM)是Windows将物理内存和虚拟地址空间连接在一起的一部分。当一个进程需要读取或写东西到内存中,它引用其VAS中的一个地址,VMM会将该地址映射到RAM中的一个地址。然而,不能保证下次访问时,仍然被映射到RAM中的地址,因为VMM可以决定临时把数据已到页文件,以允许别的进程使用物理内存地址。作为进程的一部分,VMM会更新VAS地址,并使其无效(不再指向RAM的一个地址)。下次访问这个地址时,它必须从磁盘上的页面文件加载,所以请求比较慢,这被称为一个页面错误,它会自动发生,不让你知道。
一个进程的VAS当前映射到物理RAM的那部分被称为工作集。如果某个进程请求的数据,当前不在工作集,那么它需要被重新加载回内存后方可使用。这就是所谓的硬页面错误(软页面错误是,页面仍然在物理内存的备用列表上)。要想修复他,VMM从页面文件中检索数据,找到一个内存的空闲页,无论是从空闲页的列表,还是从另一个进程,将页面文件中的数据写入内存,然后映射新的页面返回到进程的虚拟地址空间。
在性能监视器中,计数器Memory:Page Faults/sec包括硬和软页面错误,因此,如果你只想监视硬页面错误,你需要查看Memory: Page Reads/sec,以获得因解决硬页面错误引起的磁盘被访问的次数,然后对比Memory: Pages Input/sec来计算每个磁盘访问中页面被读取平均数量。
在具有足够RAM,能为每个进程提供所需内存的系统中,VMM除了分发内存和进程完成后做清理,就没别的事可做。在没有足够的RAM分配时,其所涉及到的工作就会多一点,VMM必须做一些工作,以为每个进程提供它所需要的内存。要做到这点,它会通过使用页面文件来临时存储一段时间内未被进程访问的数据,这个过程被称为页面置换(paging),数据经常被描述为已被调出到磁盘。
VMM使用页表为VAS地址记录每个映射,而映射信息本身被存放在页表条目(page table entry (PTE))。如下图所示,这使用了两个SQL Server实例。注意,虚线箭头表示一个无效的引用,当它被访问时,将产生一个硬页错误,导致页从页面文件中加载。