软件 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 数据库引擎 会创建 soft-NUMA 节点,在理想情况下包含 8 个内核,但也可少至每节点 5 个逻辑内核,或多达 9 个。 可以通过 CPU 关联掩码限制硬件节点的大小。 NUMA 节点数永远不会超过支持的 NUMA 节点的最大数目。

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

SQL Server 检测到硬件 NUMA 节点的每个节点或插槽内物理内核多于 8 个时,此图显示可在 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 能够使用自动软件 NUMA。 从 SQL Server 2016 (13.x) 开始,此行为由引擎控制,跟踪标志 8079 不再有效。 有关详细信息,请参阅 DBCC TRACEON - 跟踪标志

手动软件 NUMA

通过禁用自动 soft_NUMA 并编辑注册表,可手动配置 SQL Server 来使用 soft-NUMA,以添加节点配置关联掩码。 借助这种方法,软件 NUMA 掩码可以表示为二进制、DWORD(十六进制或十进制)或 QWORD(十六进制或十进制)注册表项。 要配置前 32 个 CPU 以后的 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 的实例时,不复制软件 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 和 CPU 1、将软件 NUMA 节点 1 映射到 CPU 2 和 CPU 3,以及将软件 NUMA 节点 2 映射到 CPU 4、CPU 5、CPU 6 和 CPU 7。

提示

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

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

具有多个 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 (Transact-SQL) 来查看自动软件 NUMA 的运行值,但不能使用 sp_configure 更改其值。 必须使用带有 SET SOFTNUMA 参数的 ALTER SERVER CONFIGURATION (Transact-SQL) 语句。