混合缓冲池

适用于: SQL Server 2019 (15.x) 及更高版本

使用混合缓冲池,缓冲池对象能够引用驻留在永久性内存 (PMEM) 设备上的数据库文件中的数据页,而不是提取磁盘中的数据页副本并将其缓存在易失 DRAM 中。 此功能是在 SQL Server 2019 (15.x) 中引入的,且在 SQL Server 2022 (16.x) 中得到进一步增强。

显示启用了混合缓冲池和未启用混合缓冲池的缓冲池的关系图。

持久性内存 (PMEM) 设备支持字节寻址,并且如果使用直接访问 (DAX) 持久性内存感知的文件系统(例如 XFS、EXT4 或 NTFS),则可以使用 OS 中的常用文件系统 API 来访问文件系统上的文件。 或者,SQL Server 可以对 PMEM 设备上文件的内存映射执行所谓的加载和存储操作。 这允许 PMEM 感知的应用程序(如 SQL Server)访问设备上的文件,而无需遍历传统存储堆栈。

混合缓冲池使用此功能对内存映射的文件执行加载和存储操作,从而将 PMEM 设备用作缓冲池的缓存以及数据库文件的存储位置。 这就造成了一种独特的情况,即逻辑读取和物理读取在本质上成为了相同的操作。 持久性内存设备可通过内存总线访问,就像常规的易失 DRAM 一样。

默认情况下,混合缓冲池的 PMEM 模块上仅缓存干净数据页。 若要将某个页面修改并标记为脏页,必须将该页面从 PMEM 设备复制到 DRAM 缓冲池,对其进行修改,然后最终将修改后的页面的副本从 DRAM 写回 PMEM 模块,此时可以再次将其标记为干净页面。 此过程使用正常的后台操作(例如检查点或惰性编写器),将 PMEM 模块视为标准块设备。

混合缓冲池功能同时适用于 Windows 和 Linux。 PMEM 设备必须使用支持 DAX (DirectAccess) 的文件系统。 XFS、EXT4 和 NTFS 文件系统都支持 DAX 扩展,因此可以直接从用户空间访问文件系统。 SQL Server 将检测适当配置的 PMEM 磁盘设备上是否存在数据库数据文件,并在数据库启动时(或附加、还原或创建数据库时)自动执行数据库文件必要的内存映射。

有关详细信息,请参阅:

启用混合缓冲池

SQL Server 2019 (15.x) 引入了动态数据语言 (DDL) 来控制混合缓冲池。

以下示例为 SQL Server 实例启用混合缓冲池:

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED HYBRID_BUFFER_POOL = ON;

默认情况下,混合缓冲池在实例范围内处于禁用状态。 要使设置更改生效,必须重启 SQL Server 实例。 必须重启以帮助分配足够的哈希页,以计算服务器上的总 PMEM 容量。

以下示例为特定数据库启用混合缓冲池。

ALTER DATABASE <databaseName> SET MEMORY_OPTIMIZED = ON;

默认情况下,混合缓冲池在数据库范围内处于启用状态。

启用混合缓冲池

以下示例在实例级别禁用混合缓冲池:

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED HYBRID_BUFFER_POOL = OFF;

默认情况下,在实例级别禁用混合缓冲池。 为了使此更改生效,必须重启实例。 重启可确保为缓冲池分配足够的哈希页,因为现在需要考虑服务器上的 PMEM 容量。

以下示例为特定数据库禁用混合缓冲池。

ALTER DATABASE <databaseName> SET MEMORY_OPTIMIZED = OFF;

默认情况下,混合缓冲池在数据库范围内处于启用状态,在服务器范围内处于禁用状态。

查看混合缓冲池配置

显示运行时值

以下示例返回实例的当前混合缓冲池配置状态。

SELECT * FROM
sys.server_memory_optimized_hybrid_buffer_pool_configuration;

以下示例列出混合缓冲池 (is_memory_optimized_enabled) 的数据库和数据库级别设置。

还可以在未启用 DAX 的情况下装载 PMEM 模块或为其设置格式,并将其视为常规块设备(即通过内核执行 I/O)。 以这种方式配置时,SQL Server 无法使用 PMEM 模块来执行字节可寻址操作(即所有调用都将使用内核空间驱动程序)。

SELECT name, is_memory_optimized_enabled FROM sys.databases;

具有直接写入功能的混合缓冲池

具有直接写入行为的混合缓冲池可减少需要在驻留于 PMEM 设备上的已修改数据或索引页上执行的 memcpy 命令的数量。 它将可持久保存的持久化日志缓冲区用作修改页面的方法,可在无需将页面复制到 DRAM 缓冲池之一的情况下修改页面。 这样一来,驻留在 PMEM 设备上的数据库文件中的页面是直接被修改的,而不需要在 DRAM 缓冲池中缓存并在之后异步刷新到磁盘。 此行为仍然遵循预写日志 (WAL) 语义,因为持久事务日志缓冲区中的日志记录已被写入或加固至持久媒体。 通过该方式,我们发现使用混合缓冲池的事务工作负载和持久化日志缓冲区在性能上得到很大的提升。

若要启用直接写入模式,请为数据库启用混合缓冲池和持久化日志缓冲区,并启用启动跟踪标志 809

混合缓冲池的最佳做法

  • 在 Windows 上格式化 PMEM 设备时,使用可用于 NTFS 的最大分配单元大小(Windows Server 2019 和更高版本中为 2 MB)并确保已为 DAX(直接访问)格式化该设备。

  • 在 Windows 上启用“锁定内存页”策略。

  • 文件大小应为 2 MB 的倍数(模数 2 MB 应等于零)。

  • 如果混合缓冲池的服务器范围设置禁用,则任何用户数据库将不能使用该功能。

  • 启用混合缓冲池的服务器范围设置后,你可使用数据库范围设置禁用单个用户数据库的功能。

  • 从 SQL Server 2019 (15.x) CU 3(请参阅 KB4538118)开始,读取缓存默认已启用,此进程在混合缓冲池中跟踪最热门页面,然后自动提升为 DRAM 缓冲池以改进性能。

  • 从 SQL Server 2022 (16.x) CU 1 开始,当混合缓冲池与持久化日志缓冲区结合使用时,“直接写入”属于默认行为。 这应该会改进几乎所有工作负载的性能,但总有回归的可能性,应该在应用 CU 之前对其进行全面测试。 如果由于此行为更改而出现回归,可以使用启动跟踪标志 898 还原到以前的行为。

  • 从 SQL Server 2022 (16.x) CU 1 开始,SQL Server 将在启动时忽略跟踪标志 809。 跟踪标志 809 和跟踪标志 898 仅适用于 Windows,不适用于 Linux 上的 SQL Server。 只有在经过认证的 Microsoft Server 专业人员指示这样做时,才应使用跟踪标志。