代码改变世界

3.6 SQL Server 内存

2018-06-28 09:03  笑一笑十年少!!!  阅读(267)  评论(0)    收藏  举报

SQL Server运行过程主要集中在内存中,因此下面分两个部分进行介绍,第一部分先 了解Windows中的内存管理,因为内存资源首先是由操作系统来管理的,SQL Server的内 存申请必须得到操作系统的同意,这样才可以得到资源。我们常说的内存实际上分为物理 内存(Physical Memory/RAM)和虚拟内存(Virtual Memory)。第二部分是介绍 SQL Server 内部的内存结构,以及如何侦测内存问题。

3.6.1物理内存和虚拟内存

事实上,本节涉及的内容已经超出了数据库范畴,但因为SQL Server运行在Windows 上,如果不清楚Windows是如何管理及使用物理内存和虚拟内存,在深人研究的过程中就会 出现瓶颈。下面主要介绍Windows管理内存和应用系统(包括SQL Server)的运行情况。

内存的性能指标主要是GB/s和ns (纳秒),前者是吞吐量,后者是响应时间。磁盘的 性能指标是MB/s和呷(微秒)。两者的差距是千倍。

2. 虚拟内存

如果所有的应用都运行在物理内存中,那么物理内存将会很容易变成瓶颈,因为所有 的进程都必须共享相同的地址范围。另外物理内存不能随便增加,所以需要高效使用资源。

Windows会授予每个进程一个虚拟地址空间(Virtual address space, VAS),通过VAS 建立起应用程序和物理内存之间的桥梁。两个进程可以使用相同的VAS,VAS的大小取决 于CPU的架构,64位系统可以使用0〜16EB的空间,不过厂商通常会限制到16TB。其 中8TB为内核模式(Kernel Mode), 8TB为用户模式(User Mode)。换句话来说,SQL Server可以访问8TB的VAS。近年来,32位系统已经逐渐退出市场,所以本书主要关注64 位系统。顺便说一下,32位系统仅支持4GB的VAS,它分为2GB的内核模式和2GB的用 户模式。

3. 虚拟内存管理器

虚拟内存管理器(Virtual Memory Manager, VMM),是Windows的一部分,负责管理 所有物理内存,并在系统中所有需要内存的进程之间共享。VMM的工作就是在进程需要操 作内存(读写)时,提供VAS。VMM通过管理每个进程的虚拟内存来实现该项工作

为了实现管理,VMM会在必要时从VAS中回收物理内存。将驻留在内存中的数据存 储到页面文件中,这样保证数据不会丢失。当进程再次需要内存时,VMM会从页面文件 中查找数据,并在一块空闲内存中写入这部分数据,然后将新页面映射到需要操作的VAS 中。如果这个过程发生延时或中断,就会成为页面错误,可以通过监控SQL Server实例的 Process: Page Faults/sec计数器来査看是否存在过度的页面切换。

如果系统有足够的RAM, VMM只需要传输内存并在进程结束后清理内存;如果没有 足够的RAM, VMM就需要使用页面文件来存储数据了,这会带来一定的额外开销。

4. 定义页面文件大小

页面文件是磁盘文件。计算机使用页面文件来增加虚拟内存的物理存储地址。也就是 说,当正在运行的进程使用的内存超过了可用的RAM,操作系统会使用一个或多个VAS把数据移动到物理磁盘的页面文件中,从而释放内存,用于其他用途。前面曾提到过,页 面文件有一定的性能问题,所以应尽可能地保证SQL Server只使用物理内存。在默认情况 下,Windows会维护相当于RAM1.5倍大小的页面文件。这个页面文件的主要目的是提高 数据从磁盘移到内存中的效率。如果担心过大的页面文件会影响性能,可以考虑把页面文 件设为可用RAM的50%。另外,有时候SQL Server和操作系统可能没有很好地共享可用物理内存,这时可能会 看到有关虚拟内存不足的系统警告。对于这种情况,最佳方法是增加RAM、重新配置SQL Server的内存,或者增加页面文件的大小。

 

5. NUMA

NUMA指的是非一致性内存访问(non-uniform memory access),另外一种系统体系结

构是SMP (对称多处理器),两者的主要区别是将内存连到哪里以及如何在系统总线上排列

处理器。在 SMP中,内存通过一条共享总线对称地连接到所有处理器;而在NUMA中,

每组处理器有自己的“本地”内存池。这个优点是只要所需的数据存在于本地内存池中,

每个处理器就不需要访问太远的内存,但是如果数据不在本地,则开销会略高于SM P:

以在使用NUMA时,应该尽量保证数据存放在本地内存中。

如果CPU插槽比较充足,可以使用每4 个插槽一组,作为一个NUMA节点。这个数

量是可以调整的,但是随着节点数增多,数据存放在本地内存的几率就会减小,而且管理

节点的开销也会随之增大。SQL Server会在启动时创建自己的内部节点,用于映射NUMA 节点。

6. SQL Server NUMA CPU 配置

可以使用sys.dm os schedulers来直接查看SQL Server的NUMA配置。例如下面的查

询在笔者计算机上的结果如图3-8所示。

SELECT scheduler_id , cpu_id , parent_node_id , status FROM sys.dm_os_schedulers

图3-8中这个结果代表笔者计算机上有4 个逻辑

CPU ( cpu i d ) , 但是没有做 NUMA ( parent node id

只有0 和64),而64 DAC专用的,每个调度都会

有一个。