title | description | author | ms.author | ms.date | ms.service | ms.subservice | ms.topic | f1_keywords | helpviewer_keywords | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Soft-NUMA (SQL Server) |
Learn about soft-NUMA in SQL Server 2014 SP2 and newer versions. See how to use automatic soft-NUMA and how to manually configure SQL Server to use soft-NUMA. |
rwestMSFT |
randolphwest |
01/27/2025 |
sql |
configuration |
conceptual |
|
|
[!INCLUDE SQL Server]
Modern processors have multiple cores per socket. Each socket is represented, usually, as a single NUMA node. The SQL Server database engine partitions various internal structures and partitions service threads per NUMA node. With processors containing 10 or more cores per socket, using software NUMA to split hardware NUMA nodes generally increases scalability and performance. Prior to [!INCLUDE ssSQL14] SP2, software-based NUMA (soft-NUMA) required you to edit the registry to add a node configuration affinity mask, and was configured at the host level, rather than per instance. Starting with [!INCLUDE ssSQL14] SP2 and [!INCLUDE sssql16-md], soft-NUMA is configured automatically at the database-instance level when the [!INCLUDE ssDEnoversion] service starts.
Hot-add processors aren't supported by soft-NUMA.
With [!INCLUDE sssql16-md], whenever the [!INCLUDE ssDEnoversion] detects more than eight physical cores per NUMA node or socket at startup, soft-NUMA nodes are created automatically by default. Simultaneous multithreading (SMT) processor cores aren't differentiated when counting physical cores in a node. When the detected number of physical cores is more than eight per socket, the [!INCLUDE ssDEnoversion] creates soft-NUMA nodes that ideally contain eight cores, but can go down to four or up to eight physical cores per node. The size of the hardware node can be limited by a CPU affinity mask. The number of NUMA nodes never exceeds the maximum number of supported NUMA nodes.
You can disable or re-enable soft-NUMA using the ALTER SERVER CONFIGURATION statement with the SET SOFTNUMA
argument. Changing the value of this setting requires a restart of the database engine to take effect.
The figure below shows the type of information regarding soft-NUMA that you see in the SQL Server error log, when [!INCLUDE ssNoVersion] detects hardware NUMA nodes with greater than eight physical cores per each node or socket.
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.
Note
Starting with [!INCLUDE ssSQL14] SP 2, use Trace Flag 8079 to allow [!INCLUDE ssNoVersion] to use Automatic soft-NUMA. Starting with [!INCLUDE sssql16-md] this behavior is controlled by the engine and trace flag 8079 has no effect. For more information, see DBCC TRACEON - Trace Flags.
To manually configure [!INCLUDE ssNoVersion] to use soft-NUMA, disable automatic soft-NUMA, and edit the registry to add a node configuration affinity mask. When using this method, the soft-NUMA mask can be stated as a binary, DWORD (hexadecimal or decimal), or QWORD (hexadecimal or decimal) registry entry. To configure more than the first 32 CPUs use QWORD or BINARY registry values (QWORD values can't be used prior to [!INCLUDE ssSQL11]). After modifying the registry, you must restart the [!INCLUDE ssDE] for the soft-NUMA configuration to take effect.
Tip
CPUs are numbered starting with 0
.
Warning
[!INCLUDE ssNoteRegistry]
Consider the example of a computer with eight CPUs that doesn't have hardware NUMA. Three soft-NUMA nodes are configured.
[!INCLUDE ssDE] instance A is configured to use CPUs 0 through 3. A second instance of the [!INCLUDE ssDE] is installed and configured to use CPUs 4 through 7. The example can be visually represented as:
CPUs 0 1 2 3 4 5 6 7
Soft-NUMA <-N0-><-N1-><----N2---->
SQL Server <instance A><instance B>
Instance A, which experiences significant I/O, now has two I/O threads and one lazy writer thread. Instance B, which performs processor-intensive operations, has only one I/O thread and one lazy writer thread. Differing amounts of memory can be assigned to the instances, but unlike hardware NUMA, they both receive memory from the same operating system memory block, and there's no memory-to-processor affinity.
The lazy writer thread is tied to the SQLOS view of the physical NUMA memory nodes. Therefore, whatever the hardware presents as the number of physical NUMA nodes, this is the number of lazy writer threads that are created. For more information, see How It Works: Soft NUMA, I/O Completion Thread, Lazy Writer Workers and Memory Nodes.
Note
The Soft-NUMA registry keys aren't copied when you upgrade an instance of [!INCLUDE ssNoVersion].
Run the following statement on instance A to configure it to use CPUs 0, 1, 2, and 3 by setting the CPU affinity mask:
ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 3;
Run the following statement on instance B to configure it to use CPUs 4, 5, 6, and 7 by setting the CPU affinity mask:
ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 4 TO 7;
Using the Registry Editor program (regedit.exe
), add the following registry keys to map soft-NUMA node 0 to CPUs 0 and 1, soft-NUMA node 1 to CPUs 2 and 3, and soft-NUMA node 2 to CPUs 4, 5, 6, and 7.
Tip
To specify CPUs 60 through 63, use a QWORD value of F000000000000000
or a BINARY value of 1111000000000000000000000000000000000000000000000000000000000000
.
In the following example, assume you have a DL580 G9 server, with 18 cores per socket (in four sockets), and each socket is in its own K-group. A soft-NUMA configuration that you might create would look something like the following example: six cores per node, three nodes per group, four groups.
Example for a SQL Server instance with multiple K-Groups | Type | Value name | Value data |
---|---|---|---|
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 |
You can use the following DMVs to view the current state and configuration of soft-NUMA.
-
sp_configure (Transact-SQL): Displays the current value (
0
or1
) for SOFTNUMA. -
sys.dm_os_sys_info (Transact-SQL): The
softnuma_configuration
andsoftnuma_configuration_desc
columns display the current configuration values.
While you can view the running value for automatic soft-NUMA using sp_configure (Transact-SQL), you can't change its value using sp_configure
. You must use the ALTER SERVER CONFIGURATION (Transact-SQL) statement with the SET SOFTNUMA
argument.