为 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
) 文件不使用writethrough
和alternatewritethrough
,因为它们使用强制刷新行为。 跟踪标志 3979 禁止对数据库和事务日志文件使用强制刷新行为,而使用writethrough
和alternatewritethrough
逻辑。在 SQL Server 中使用
FILE_FLAG_WRITE_THROUGH
打开的其他文件(例如数据库快照、用于数据库一致性检查的内部快照 (DBCC CHECKDB
)、探查器跟踪文件和扩展事件跟踪文件)使用writethrough
和alternatewritethrough
优化。
有关 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 功能且已进行相应配置的存储子系统和/或硬件
推荐配置:
启用跟踪标志 3979 作为启动参数。
使用 mssql-conf 配置
control.writethrough = 1
和control.alternatewritethrough = 0
。
对于不符合上述条件的几乎所有其他配置,建议的配置如下所示:
启用跟踪标志 3982 作为启动参数(这是 Linux 生态系统中 SQL Server 的默认值),同时确保未启用跟踪标志 3979 作为启动参数。
使用 mssql-conf 配置
control.writethrough = 1
和control.alternatewritethrough = 1
。
针对 Kubernetes 中部署的 SQL Server 容器的 FUA 支持
SQL Server 必须使用持久装载的存储,而不是
overlayfs
。存储必须使用 XFS 文件系统,并且应支持 FUA。 启用此设置之前,应与 Linux 发行版和存储供应商合作,确保 OS 和存储子系统支持 FUA 选项。 在 Kubernetes 上,可使用以下命令查询文件系统类型,其中
<pvc-name>
是PersistentVolumeClaim
:kubectl describe pv <pvc-name>
在输出中查找
fstype
,它设置为 XFS。托管 SQL Server Pod 的工作器节点应使用支持 FUA 功能的 Linux 发行版和版本(从 Red Hat Enterprise Linux 8.0、SUSE Linux Enterprise Server 12 SP5 或 Ubuntu 18.04 开始)。
如果满足上述条件,可使用以下建议的 FUA 设置。
启用跟踪标志 3979 作为启动参数。
使用 mssql-conf 配置
control.writethrough = 1
和control.alternatewritethrough = 0
。