适用于:Linux 上的 SQL Server
本文介绍如何在 Linux 上配置 SQL Server 2019(15.x)及更高版本的持久内存(PMEM)。
Overview
SQL Server 2019(15.x)增加了持久内存支持,以加速多种存储密集型操作。
在支持PMEM的文件系统中,内存映射(mmap())为用户空间应用程序提供了对文件数据的直接访问。 当文件创建内存映射时,应用程序可以发布绕过存储层的加载/存储指令。
Note
从主机扩展应用的角度来看,这种直接访问被称为启发文件访问方法,这也是 SQL Server 与主机操作系统交互的方式,使用了 SQL 平台抽象层(SQLPAL)。
本文将向您展示如何在 Linux 上配置 Linux 上的 SQL Server 的持久内存。
为 PMEM 设备创建命名空间
配置设备
在 Linux 中,使用 ndctl 实用工具。
- 安装
ndctl以配置 PMEM 设备,操作步骤参见安装 NDCTL。 - 使用
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 、创建并挂载设备后,你可以把数据库文件放进去,或者创建一个新的数据库。
您可以使用以下命令将 SQL Server 数据文件(.mdf, )和tempdb文件存储在 PMEM 设备上fsdax.ndf的模式中。 不要使用此模式存储 SQL Server 日志.ldf文件,因为事务日志需要提供扇区原子保证的存储:
ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev
在前面的命令中设置映射选项之前,请记住以下几点:
- 为了在访问和更新该设备的NVDIMM页面条目时获得最佳性能,请使用
-map=mem - 如果NVDIMM容量过大(大于512 GB),则设
-map=dev,这会影响输入输出吞吐量并降低性能
对于PMEM设备上的SQL Server日志文件,配置PMEM设备使用扇区/块转换表(BTT)。 这种配置为SQL Server日志文件提供了该存储技术所需的扇区原子性。 进行工作负载性能验证。 比较你工作负载下的SQL Server日志性能,比较该方案与同级NVMe SSD的方案,然后选择最适合你需求的。
ndctl create-namespace -f -e namespace0.0 --mode= sector
禁用强制刷新行为
由于 PMEM 设备是 O_DIRECT(直接 I/O)安全的,因此可以禁用强制刷新行为。
Note
存储系统可以通过保证对设备的写入存在于一个能够在系统崩溃、接口重置和断电时仍能持续存在的介质上,并且该介质本身是硬件冗余的,从而确保任何缓存或分阶段写入的安全性和耐久性。
默认情况下,在 SQL Server 2017 (14.x) CU 6 及更高版本中,数据库(
.mdf和.ndf)和事务日志 (.ldf) 文件不使用writethrough和alternatewritethrough,因为它们使用强制刷新行为。 Trace flag 3979 会禁用数据库和事务日志文件的强制冲洗行为,并使用writethroughandalternatewritethrough逻辑。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 分发版在 I/O 子系统级别实现强制单元访问(FUA),以确保数据持续性。 SQL Server 利用此功能为 Linux 工作负载提供高效可靠的 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 开始)
Note
从 SQL Server 2025(17.x)开始,不支持 SUSE Linux Enterprise Server (SLES)。
Linux 内核 4.18 或更高版本上用于 SQL Server 存储的 XFS 文件系统。
Linux 内核 5.6 或更高版本上的 SQL Server 存储 ext4 文件系统。
Note
当 Linux 内核版本低于 5.6 时,使用 XFS 文件系统托管 SQL Server 数据和事务日志文件。 从内核版本 5.6 开始,可以根据特定要求在 XFS 和 ext4 之间进行选择。
支持和配置 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 或 ext4 文件系统,并且应支持 FUA(ext4 不支持低于版本 5.6 的 Linux 内核上的 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。