理解内存----物理和虚拟内存

物理内存

物理内存通常涉及到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实例。注意,虚线箭头表示一个无效的引用,当它被访问时,将产生一个硬页错误,导致页从页面文件中加载。

 

页文件大小
默认情况下,Windows会管理页面文件的大小,推荐1.5倍内存大小的页面文件大小。页面文件的主要目的是为了让Windows暂时将数据从RAM移到磁盘,以帮助它有效地管理资源。当一个页面文件经常使用,则表明存在内存压力,其解决的办法就是优化你的内存资源,或购买更多的RAM,而不是优化你的页面文件。如果你担心磁盘空间,那么将页面文件设置为总的可用RAM的50%将是一个安全的赌注。
 
NUMA
非统一内存架构(NUMA----Non-Uniform Memory Architecture)是一种硬件设计,通过移除主板瓶颈提高服务器的可扩展性。传统的架构,每个处理器都通过到主板上中央存储控制器的共享系统总线访问每个内存条。这就是所谓的对称多处理(SMP----symmetric multiprocessing),它具有有限的可扩展性,因为当你开始增加处理器数量时,共享系统总线迅速成为一个瓶颈。
在NUMA系统中,每个处理器有它自己的存储控制器和一个到RAM的直接连接,这被称为本地存储器,它们一起表示为一个NUMA节点。
为了确保存放在各个CPU缓存上的数据的一致性,所有的主流实现都使用高速缓存一致性的NUMA(CCNUMA----cache-coherent NUMA),这确保了,当数据在一个CPU缓存里被更新,任何其他CPU上缓存的数据副本也将被更新。
NUMA节点可以访问属于另一个NUMA节点的内存,但这样会带来额外的开销,因此延迟,这就是所谓的远程内存。
Coreinfo,来自Sysinternals的一个免费工具,可以在TechNet网站上找到,她可以显示很多关于处理器拓扑的有趣信息,其中包括由处理器访问远程存储器的访问成本映射。
 
SQL Server对NUMA的使用
SQL Server在启动时自动创建自己的内部节点,这些节点直接映射到NUMA节点,所以你能直接查询SQL Server,并在处理器、NUMA节点和内存分配等方面得到主板的物理设计方面的展示。例如,下图显示了具有两个处理器,每个处理器具有4个内核和一个本地存储器,构成了一个NUMA节点的服务器的表示。当SQL Server启动时,SQLOS会识别逻辑处理器的数量,并创建一个调度器,用于一个内部节点的每个处理器。存储节点和调度节点是分离的,因为它在物理级别上。这提供了更大程度上的灵活性和独立性,这种设计是为了克服早起Windows版本中内存管理的局限性。
SQL Server NUMA CPU配置
你可以使用几个DMV查看SQL Server中NUMA配置相关的信息,如sys.dm_os_schedulers和sys.dm_os_nodes:
 
SQL Server NUMA内存配置
正如前面了解到,SQL Server内存节点直接映射到硬件层面的NUMA节点,所以无法改变整个存储节点的分布。SQL Server知道服务器的NUMA配置,其目的是减少远程存储器访问的需求。因此,当一个任务正在运行时,存储对象会在相同的NUMA节点上被创建,作为任务,任何时候它都有效地这样做。例如,如果你执行一个简单的查询,它在节点0中的调度0上分配线程,则SQL Server将尝试使用节点0中的内存,来满足所有新的内存要求,以将其保留在本地。
在每个硬件NUMA节点,SQL Server尝试使用多少内存,取决于服务器内存,服务器内存受max server memory选项的影响。无论你是否配置Max Server Memory,SQL Server都会设置一个目标服务器内存,它代表SQL Server的内存使用目标。这个目标值,由检测到的NUMA节点均分。
如果服务器没有对NUMA节点均分RAM,你会发现你需要使用远程内存来满足SQL Server的目标存储。下图说明了这一点,节点3的目标服务器内存不能满足本地内存,因为内存没有被均匀地分布在主板上的NUMA节点:
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值