缓冲池扩展

适用于SQL Server

SQL Server 2014 (12.x)中引入的缓冲池扩展提供 数据库引擎 缓冲池的非易失性随机存取内存(即固态硬盘)扩展的无缝集成,从而显著提高 I/O 吞吐量。 缓冲池扩展在每个 SQL Server 版本中都不可用。 有关详细信息,请参阅 SQL Server 2016 各个版本支持的功能

缓冲池扩展的优点

SQL Server 数据库的主要用途是存储和检索数据,因此,大量磁盘 I/O 是该数据库引擎的一个核心特点。 由于磁盘 I/O 操作可能会占用消耗很多资源并且耗时较长,所以 SQL Server 侧重于使 I/O 极为高效。 缓冲池用作 SQL Server的主内存分配源。 缓冲区管理是实现高效 I/O 操作的关键环节。 缓冲区管理组件由下列两种机制组成:用于访问及更新数据库页的缓冲区管理器和用于减少数据库文件 I/O 的缓冲池。

数据和索引页从磁盘读入缓冲池,修改后的页(也称为脏页)写回磁盘。 服务器和数据库检查点上的内存压力会造成缓冲区缓存中的热(活动)脏页被逐出缓存并写入机械磁盘,然后又读回到缓存中。 这些 I/O 操作通常是大小为 4 KB 到 16 KB 的小型随机读和写操作。 小型随机 I/O 模式会导致频繁搜索、机械磁盘臂争用、I/O 滞后时间延长以及系统的总 I/O 吞吐量减少。

解决这些 I/O 瓶颈的典型方法是添加更多 DRAM,或者添加高性能 SAS 主轴。 虽然这些选项很有用,但它们有显著缺点:DRAM 比数据存储驱动器更昂贵,并且添加轴会增加硬件购置中的资本支出,并通过增加能耗和增加组件故障的概率来增加运营成本。

缓冲池扩展功能通过非易失性存储器(通常为 SSD)来扩展缓冲池缓存。 由于这种扩展,缓冲池可以容纳更大的数据库工作集,可强制在 RAM 和 SSD 之间对 I/O 分页。 这会有效地将小型随机 I/O 从机械磁盘卸载到固态硬盘。 由于固态硬盘滞后时间短且具有更佳随机 I/O 性能,缓冲池扩展可显著提高 I/O 吞吐量。

下面的列表说明了缓冲池扩展功能的优点。

  • 随机 I/O 吞吐量提高

  • I/O 滞后时间缩短

  • 事务吞吐量提高

  • 由于采用更大的混合缓冲池,读取性能提高

  • 具有一种可利用现有和将来的低成本内存驱动器的缓存体系结构

概念

以下术语适用于缓冲池扩展功能。

术语 说明
固态硬盘(SSD) 固态硬盘将数据永久存储在内存 (RAM) 中。 有关详细信息,请参阅维基百科上的定义
缓冲区 在 SQL Server 中,缓冲区是内存中的 8 KB 页,大小与数据或索引页大小相同。 因此,缓冲区缓存被划分为多个 8-KB 页。 缓冲区缓存中会保留一页,直到缓冲区管理器需要该缓冲区读入更多数据。 仅当数据被修改时,数据才会写回到磁盘。 这些内存中已修改的页称为脏页。 当页面等效于磁盘上的数据库映像时,页面是干净的。 在将缓冲区缓存中的数据写回磁盘之前,可对其进行多次修改。
缓冲池 也称为“缓冲区缓存”。 缓冲池是一个由所有数据库共享的全局资源,用于存放其缓存数据页。 缓冲池缓存的最大和最小大小是在启动期间确定的,或者当 SQL Server 的实例使用 sp_configure动态重新配置时。 此大小确定了运行的实例中在任何时候都可以缓存在缓冲池中的最大页数。

缓冲池扩展可以提交的最大内存可以受到计算机上运行的其他应用程序的限制,以防这些应用程序产生显著的内存压力。
检查点 检查点会创建一个已知的正常点,在意外关闭或崩溃后的恢复过程中, 数据库引擎 可以从该点开始应用事务日志中包含的更改。 检查点将脏页和事务日志信息从内存写入磁盘,并记录有关事务日志的信息。 有关详细信息,请参阅 数据库检查点(SQL Server)

详细信息

SSD 存储用作内存子系统的扩展而不是磁盘存储子系统的扩展。 也就是说,通过缓冲池扩展文件,缓冲池管理器可以使用 DRAM 和 NAND 闪存,在由固态硬盘支持的非易失性随机存取内存中保持一个大得多的温热页缓冲池。 这会在固态硬盘上创建一个多级缓存层次结构,级别 1 (L1) 作为 DRAM,级别 2 (L2) 作为缓冲池扩展文件。 仅将干净页写入 L2 缓存,以帮助确保数据安全。 缓冲区管理器会处理 L1 和 L2 缓存之间的干净页移动。

下图所示为缓冲池相对于其他 SQL Server 组件的高级体系结构概览。

SSD 缓冲池扩展体系结构的关系图。

启用缓冲池扩展后,该功能会指定固态硬盘上缓冲池缓存文件的大小和文件路径。 此文件是固态硬盘上的一个连续存储范围,是在 SQL Server实例启动期间静态配置的。 只有在禁用了缓冲池扩展功能的情况下,才能修改此文件的配置参数。 禁用缓冲池扩展后,将从注册表中删除所有相关的配置设置。 SQL Server 实例关闭时,将会删除缓冲池扩展文件。

容量限制

SQL Server Enterprise 版本允许最大缓冲池扩展大小是 max server memory值的 32 倍。

SQL Server Standard 版本允许最大缓冲池扩展大小为 max server memory值的四倍。

最佳做法

我们建议您遵循以下最佳做法。

  • 首次启用缓冲池扩展后,应重启 SQL Server 实例以获得最大性能优势。

  • 设置缓冲池扩展,使物理内存(max server memory)的大小与缓冲池扩展大小之间的比率不超过1:16。 1:4 到 1:8 范围内的较低比率可能是最佳。 有关设置 max server memory 选项的信息,请参阅 服务器内存配置选项

  • 在生产环境中实现之前,应彻底测试缓冲池扩展。 进入生产环境后,请避免对文件进行配置更改或关闭该功能。 这些活动可能对服务器性能产生负面影响,因为禁用该功能时缓冲池的大小明显减少。 禁用后,在重新启动 SQL Server 实例之前,不会回收用于支持该功能的内存。 但是,如果重新启用该功能,则会重复使用内存,而无需重启实例。

返回有关缓冲池扩展的信息

您可以使用以下动态管理视图来显示缓冲池扩展的配置并返回有关扩展中的数据页的信息。

SQL Server 缓冲区管理器对象中提供了用于跟踪缓冲池扩展文件中的数据页的性能计数器。 有关详细信息,请参阅 缓冲池扩展性能计数器

以下 XEvent 可用。

XEvent 说明 参数
sqlserver.
buffer_pool_extension_pages_written
在将页或页组从缓冲池逐出并写入缓冲池扩展文件时激发。 number_page
first_page_id
first_page_offset
initiator_numa_node_id
sqlserver.
buffer_pool_extension_pages_read
在将页从缓冲池扩展文件读取到缓冲池时激发。 number_page
first_page_id
first_page_offset
initiator_numa_node_id
sqlserver.
buffer_pool_extension_pages_evicted
在将页从缓冲池扩展文件中逐出时激发。 number_page
first_page_id
first_page_offset
initiator_numa_node_id
sqlserver.
buffer_pool_eviction_thresholds_recalculated
在计算逐出阈值时激发。 warm_threshold
cold_threshold
pages_bypassed_eviction
eviction_bypass_reason
eviction_bypass_reason_description
任务说明 文章
启用和配置缓冲池扩展。 更改服务器配置
修改缓冲池扩展配置 更改服务器设置
查看缓冲池扩展配置 sys.dm_os_buffer_pool_extension_configuration
监视缓冲池扩展 sys.dm_os_buffer_descriptors

SQL Server、Buffer Manager 对象