Soft-NUMA (SQL Server)

适用于:SQL Server

新式处理器在每个插槽上都有多个内核。 通常每个插槽表示为单个 NUMA 节点。 SQL Server 数据库引擎在每个 NUMA 节点上划分多个不同内部结构和分区服务线程。 对于每个插槽具有 10 个或更多核心的处理器,使用软件 NUMA 将硬件 NUMA 节点拆分开来通常会提高可扩展性和性能。 在 SQL Server 2014 (12.x) SP2 之前,基于软件的 NUMA (soft-NUMA) 需要编辑注册表才能添加节点配置关联掩码,并且是针对主机级别而不是每个实例进行配置。 从 SQL Server 2014 (12.x) SP2 和 SQL Server 2016 (13.x) 开始,当 SQL Server 数据库引擎 服务启动时会在数据库实例级别自动配置 soft-NUMA。

软件 NUMA 不支持热添加处理器。

自动软件 NUMA

使用 SQL Server 2016 (13.x),只要 SQL Server 数据库引擎在启动时检测到每个 NUMA 或插槽内的物理内核数目超过 8 个,在默认情况下就会自动创建 soft-NUMA 节点。 在对节点中的物理核心进行计数时,不会区分同时的多线程并行处理 (SMT) 处理器核心。 当检测到的物理核心数超过每个套接字 8 个时,SQL Server 数据库引擎会创建软 NUMA 节点,这些节点理想情况下包含 8 个核心,但每个节点可以降至 4 个或最多 8 个物理核心。 可以通过 CPU 关联掩码限制硬件节点的大小。 NUMA 节点数永远不会超过支持的 NUMA 节点的最大数目。

可以使用带有 SET SOFTNUMA 参数的 ALTER SERVER CONFIGURATION 语句来禁用或重新启用 soft-NUMA。 更改此设置的值后,需要重新启动数据库引擎才会生效。

下图显示了当 SQL Server 检测到硬件 NUMA 节点的每个节点或插槽包含八个以上物理核心时,您会在 SQL Server 错误日志中看到的有关 soft-NUMA 的信息类型。

2016-11-14 13:39:43.17 Server      SQL Server detected 2 sockets with 12 cores per socket and 24 logical processors per socket, 48 total logical processors; using 48 logical processors based on SQL Server licensing. This is an informational message; no user action is required.
2016-11-14 13:39:43.35 Server      Automatic soft-NUMA was enabled because SQL Server has detected hardware NUMA nodes with greater than 8 physical cores.
2016-11-14 13:39:43.63 Server      Node configuration: node 0: CPU mask: 0x0000000000555555:0 Active CPU mask: 0x0000000000555555:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
2016-11-14 13:39:43.63 Server      Node configuration: node 1: CPU mask: 0x0000000000aaaaaa:0 Active CPU mask: 0x0000000000aaaaaa:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
2016-11-14 13:39:43.63 Server      Node configuration: node 2: CPU mask: 0x0000555555000000:0 Active CPU mask: 0x0000555555000000:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
2016-11-14 13:39:43.63 Server      Node configuration: node 3: CPU mask: 0x0000aaaaaa000000:0 Active CPU mask: 0x0000aaaaaa000000:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.

注意

从 SQL Server 2014 (12.x) SP 2 开始,使用跟踪标志 8079 以启用 SQL Server 的自动 Soft-NUMA 功能。 从 SQL Server 2016 (13.x) 开始,此行为由引擎控制,跟踪标志 8079 不再有效。 有关详细信息,请参阅 使用 DBCC TRACEON 设置跟踪标志

手动软件 NUMA

若要手动将 SQL Server 配置为使用 soft-NUMA,请禁用自动 soft-NUMA,并编辑注册表以添加节点配置关联掩码。 使用此方法时,软 NUMA 掩码可指定为二进制、DWORD(十六进制或十进制)或 QWORD(十六进制或十进制)注册表项。 若要配置超过前 32 个的 CPU,请使用 QWORD 或 BINARY 注册表值(在 SQL Server 2012 (11.x) 之前的版本中,不能使用 QWORD 值)。 修改注册表后,必须重启 数据库引擎,soft-NUMA 配置才会生效。

提示

CPU 从 0 开始编号。

警告

错误编辑注册表会严重损坏您的系统。 更改注册表项之前,建议您备份计算机中的所有重要数据。

以一台具有八个 CPU 但不具备硬件 NUMA 架构的计算机为例。 配置了三个软件 NUMA 节点。 将数据库引擎实例 A 配置为使用第 0 个到第 3 个 CPU。 安装 数据库引擎 的第二个实例并将其配置为使用第 5 个到第 8 个 CPU。 该示例可以直观表示为:

CPUs         0  1  2  3  4  5  6  7
Soft-NUMA   <-N0-><-N1-><----N2---->
SQL Server  <instance A><instance B>

大量使用 I/O 的实例 A 现在有两个 I/O 线程和一个惰性编写器线程。 执行大量占用处理器操作的实例 B 仅有一个 I/O 线程和一个惰性编写器线程。 可以向实例分配不同的内存量,但是与硬件 NUMA 不同,它们都从同一个操作系统内存块中接收内存,并且不具有从内存到处理器的关联。

惰性编写器线程与物理 NUMA 内存节点的 SQLOS 视图有关。 因此,无论硬件显示的物理 NUMA 节点数是多少,所创建的惰性写入器线程数就是多少。 有关详细信息,请参阅工作原理:Soft NUMA、I/O 完成线程、惰性编写器工作线程和内存节点

注意

升级 SQL Server 实例时,不会复制 Soft-NUMA 注册表项。

设置 CPU 亲和性掩码

在实例 A 中运行下面的语句,通过设置 CPU 关联掩码将它配置为使用 CPU 0、CPU 1、CPU 2 和 CPU 3:

ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 3;

在实例 B 中运行下面的语句,通过设置 CPU 关联掩码将它配置为使用 CPU 4、CPU 5、CPU 6 和 CPU 7:

ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 4 TO 7;

将软 NUMA 节点映射到 CPU

使用注册表编辑器 (regedit.exe) 添加以下注册表键,将软件 NUMA 节点 0 映射到 CPU 0 和 1,将软件 NUMA 节点 1 映射到 CPU 2 和 3,并将软件 NUMA 节点 2 映射到 CPU 4、5、6 和 7。

提示

若要指定第 60 个到第 63 个 CPU,请使用 QWORD 值 F000000000000000 或 BINARY 值 1111000000000000000000000000000000000000000000000000000000000000

在以下示例中,假定你有 DL580 G9 服务器,每个插槽(共 4 个插槽)具有 18 个内核并且每个插槽都位于其自己的 K 组中。 你可能创建的软 NUMA 配置可能如下例所示:每个节点 6 个内核,每组 3 个节点,共 4 组。

具有多个 K 组的 SQL Server 实例的示例 类型 值名称 数值数据
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node0 DWORD CPUMask 0x3f
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node0 DWORD Group 0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node1 DWORD CPUMask 0x0fc0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node1 DWORD Group 0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node2 DWORD CPUMask 0x3f000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node2 DWORD Group 0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node3 DWORD CPUMask 0x3f
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node3 DWORD Group 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node4 DWORD CPUMask 0x0fc0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node4 DWORD Group 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node5 DWORD CPUMask 0x3f000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node5 DWORD Group 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node6 DWORD CPUMask 0x3f
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node6 DWORD Group 2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node7 DWORD CPUMask 0x0fc0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node7 DWORD Group 2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node8 DWORD CPUMask 0x3f000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node8 DWORD Group 2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node9 DWORD CPUMask 0x3f
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node9 DWORD Group 3
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node10 DWORD CPUMask 0x0fc0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node10 DWORD Group 3
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node11 DWORD CPUMask 0x3f000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node11 DWORD Group 3

元数据

可以使用以下 DMV 来查看 soft-NUMA 的当前状态和配置。

虽然可以使用 sp_configure 查看自动软 NUMA 的运行值,但不能使用 sp_configure更改其值。 必须将 SET SOFTNUMA 参数与 ALTER SERVER CONFIGURATION 语句一起使用。