为 Linux 上的 SQL Server 配置持久性内存 (PMEM)

适用于: SQL Server - Linux

本文介绍如何为 Linux 上的 SQL Server 2019 (15.x) 及更高版本配置永久性内存 (PMEM)。

概述

SQL Server 2019 (15.x) 引入了大量使用永久性内存的内存中功能。 本文介绍为 Linux 上的 SQL Server 配置永久性内存所需的步骤。

注意

引入了“启发”一词,旨在传达使用永久内存感知文件系统的概念 。 通过使用内存映射 (mmap()),可以从用户空间应用程序直接访问文件系统。 在创建文件的内存映射时,应用程序可能会完全绕过 I/O 堆栈发出加载/存储指令。 从主机扩展应用程序的角度来看,这是一种“启发式”文件访问方法,它是允许 SQLPAL 与 Windows 或 Linux OS 交互的代码。

为 PMEM 设备创建命名空间

配置设备

在 Linux 中,使用 ndctl 实用工具。

  • 安装 ndctl 以配置 PMEM 设备。 可在此处找到。
  • 使用 ndctl 创建命名空间。 命名空间在 PMEM NVDIMM 之间交错,可以对设备上的内存区域提供不同类型的用户空间访问。 fsdax 是 SQL Server 的默认和所需模式。
ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev

我们已选择 fsdax 模式,并且使用系统内存来存储每页的元数据。 我们推荐使用 --map=dev。 此选项会将元数据直接存储在命名空间上。 目前,使用 --map=mem 将元数据存储在内存中是一项试验性功能。

使用 ndctl 验证命名空间。

示例输出如下:

# ndctl list -N
{
  "dev":"namespace0.0",
  "mode":"fsdax",
  "map":"dev",
  "size":4294967296,
  "sector_size":512,
  "blockdev":"pmem0",
  "numa_node":0
}

创建和装载 PMEM 设备

例如,使用 XFS

mkfs.xfs -f /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax
xfs_io -c "extsize 2m" /mnt/dax

例如,使用 EXT4

mkfs.ext4 -b 4096 -E stride=512 -F /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax

技术注意事项

  • XFS/EXT4 的 2 MB 块分配,如上文所述
  • 块分配和 mmap 之间的不一致会导致无提示回退到 4 KB
  • 文件大小应为 2 MB 的倍数(取模 2 MB)
  • 请勿禁用透明大页 (THP)(在大多数分发服务器上默认是启用状态)

使用 ndctl 配置、创建和装载设备后,可以将数据库文件放在该设备中,也可以创建新的数据库。

在使用以下命令的模式 fsdax 下配置时,可以将 SQL Server 数据文件(MDFS、NDFS)和 tempdb 文件存储在 PMEM 设备上。 请勿将其用于存储 SQL Server 日志 (LDFS) 文件,因为事务日志需要位于提供扇区原子保证的存储上:

ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev

在前面的命令中设置映射选项之前,请记住以下几点:

  • 为了在访问和更新此设备的这些 NVDIMM 页面条目时获得最佳性能,最好使用 -map=mem
  • 如果 NVDIMM 的容量过大(超过 512 GB),请设置 –map=dev,此操作会影响 IO 吞吐量并影响性能

对于 PMEM 设备上的 SQL Server 日志文件,配置 PMEM 设备以使用扇区/块转换表 (BTT)。 这为这种存储设备技术的 SQL Server 日志文件提供了所需的扇区原子性。 我们还建议执行工作负荷性能验证。 你可以比较此解决方案与一流 NVMe SSD 之间的工作负荷的 SQL Server 日志性能,然后选择最符合需求并提供更佳性能的解决方案。

ndctl create-namespace -f -e namespace0.0 --mode= sector

禁用强制刷新行为

由于 PMEM 设备是 O_DIRECT(直接 I/O)安全的,因此可以禁用强制刷新行为

注意

存储系统可以确保任何缓存或暂存的写入都被视为是安全且持久的,方法是保证向设备发出的写入保留在一个介质上,该介质将在系统崩溃、接口重置和电源故障时持续存在,并且该介质本身是硬件冗余的。

  • 默认情况下,在 SQL Server 2017 (14.x) CU 6 及更高版本中,数据库(.mdf.ndf)和事务日志 (.ldf) 文件不使用 writethroughalternatewritethrough,因为它们使用强制刷新行为。 跟踪标志 3979 禁止对数据库和事务日志文件使用强制刷新行为,而使用 writethroughalternatewritethrough 逻辑。

  • 在 SQL Server 中使用 FILE_FLAG_WRITE_THROUGH 打开的其他文件(例如数据库快照、用于数据库一致性检查的内部快照 (DBCC CHECKDB)、探查器跟踪文件和扩展事件跟踪文件)使用 writethroughalternatewritethrough 优化。

有关 SQL Server 2017 (14.x) CU 6 中引入的更改的详细信息,请参阅 KB 4131496。 有关强制单元访问 (FUA) 内部结构的详细信息,请参阅 FUA 内部结构

SQL Server 和强制单元访问 (FUA) I/O 子系统功能

某些版本的受支持 Linux 分发版支持 FUA I/O 子系统功能,以提供数据持久性。 SQL Server 使用 FUA 功能为 SQL Server 工作负载提供高效且可靠的 I/O。 有关 Linux 分发版的 FUA 支持的更多信息及其对 SQL Server 的影响,请参阅 Linux 上的 SQL Server:强制单元访问 (FUA) 内部结构

SUSE Linux Enterprise Server 12 SP5、Red Hat Enterprise Linux 8.0 和 Ubuntu 18.04 引入了对 I/O 子系统中的 FUA 功能的支持。 如果你使用的是 SQL Server 2017 (14.x) CU 6 及更高版本,应使用以下配置,以便通过 SQL Server 使用 FUA 进行高性能、高效的 I/O 实现。

如果满足以下条件,请使用此推荐配置。

  • SQL Server 2017 (14.x) CU 6 及更高版本

  • 支持 FUA 功能的 Linux 发行版和版本(从 Red Hat Enterprise Linux 8.0、SUSE Linux Enterprise Server 12 SP5 或 Ubuntu 18.04 开始)

  • 用于 SQL Server 存储的 XFS 文件系统

  • 支持 FUA 功能且已进行相应配置的存储子系统和/或硬件

推荐配置:

  1. 启用跟踪标志 3979 作为启动参数。

  2. 使用 mssql-conf 配置 control.writethrough = 1control.alternatewritethrough = 0

对于不符合上述条件的几乎所有其他配置,建议的配置如下所示:

  1. 启用跟踪标志 3982 作为启动参数(这是 Linux 生态系统中 SQL Server 的默认值),同时确保未启用跟踪标志 3979 作为启动参数。

  2. 使用 mssql-conf 配置 control.writethrough = 1control.alternatewritethrough = 1

针对 Kubernetes 中部署的 SQL Server 容器的 FUA 支持

  1. SQL Server 必须使用持久装载的存储,而不是 overlayfs

  2. 存储必须使用 XFS 文件系统,并且应支持 FUA。 启用此设置之前,应与 Linux 发行版和存储供应商合作,确保 OS 和存储子系统支持 FUA 选项。 在 Kubernetes 上,可使用以下命令查询文件系统类型,其中 <pvc-name>PersistentVolumeClaim

    kubectl describe pv <pvc-name>
    

    在输出中查找 fstype,它设置为 XFS。

  3. 托管 SQL Server Pod 的工作器节点应使用支持 FUA 功能的 Linux 发行版和版本(从 Red Hat Enterprise Linux 8.0、SUSE Linux Enterprise Server 12 SP5 或 Ubuntu 18.04 开始)。

如果满足上述条件,可使用以下建议的 FUA 设置。

  1. 启用跟踪标志 3979 作为启动参数。

  2. 使用 mssql-conf 配置 control.writethrough = 1control.alternatewritethrough = 0