Автор: Paul Randal, NUMA and soft-NUMA in SQL Server: To get additional I/O threads
Производительность может быть значительно улучшена, если ядро SQL Server обнаруживает физические узлы NUMA в системе Windows. Наряду с аппаратным NUMA, Microsoft также представила архитектуру soft-NUMA (программный NUMA) для создания дополнительных виртуальных узлов NUMA внутри SQL OS. Начиная с SQL Server 2016 (13.x), если ядро базы данных обнаруживает более восьми «физических ядер на узел NUMA» или более восьми «сокетов», узлы soft-NUMA создаются автоматически. Создание узлов soft-NUMA позволяет ядру базы данных SQL Server создавать больше потоков ввода-вывода для повышения производительности требовательных транзакционных рабочих нагрузок SQL Server.
Процесс создания soft-NUMA начинается во время запуска службы SQL Server. По умолчанию создание soft-NUMA включено в SQL Server и может быть отключено или повторно включено с помощью инструкции ALTER SERVER CONFIGURATION (Transact-SQL) с аргументом SET SOFTNUMA. Изменение значения этого параметра требует перезапуска ядра базы данных для вступления в силу.
Цель soft-NUMA: Цель soft-NUMA — создать искусственную группировку ядер CPU, где каждая группа представляет собой узел soft-NUMA. Это создание NUMA внутри SQL Server позволяет ядру базы данных (SQL OS) создавать дополнительные потоки «LAZY WRITER», «LOG WRITER» и «RESOURCE MONITOR» на каждый узел NUMA. Ядро базы данных SQL Server автоматически принимает решение и создаёт soft-NUMA и вышеуказанные потоки на основе существующего NUMA и ядер CPU.
Обратите внимание, что архитектура soft-NUMA не создаёт отдельные локальные узлы памяти для каждого узла NUMA. Вместо этого все виртуальные узлы soft-NUMA используют один и тот же узел памяти, к которому принадлежит группа CPU и который изначально был доступен SQL Server. Это означает, что для узла soft-NUMA не будет локальной поддержки памяти.
Преимущества soft-NUMA: Поскольку SQL Server является полностью NUMA-осведомлённым приложением, наличие дополнительных потоков «LAZY WRITER», «RESOURCE MONITOR» и «LOG WRITER» может обеспечить значительное повышение производительности. Дополнительные преимущества:
- Создаёт несколько потоков «LAZY WRITER», по одному на каждый узел NUMA.
- Создаёт несколько потоков «RESOURCE MONITOR», по одному на каждый узел NUMA.
- Может создать два или более потоков «LOG WRITER» в зависимости от каждого узла NUMA.
- Уменьшает количество ошибок «Non-Yielding Scheduler» и повышает отзывчивость SQL Server.
- Улучшает операции CHECKPOINT и ввода-вывода.
- Уменьшает конкуренцию за LATCH.
Менее 9 ядер CPU: Независимо от того, установлен ли SQL Server непосредственно на оборудовании или работает на виртуальной машине, требования к созданию soft-NUMA будут одинаковыми. Если мы запускаем SQL Server на виртуальной машине с 8 ядрами CPU, мы не будем иметь soft-NUMA. Однако мы можем легко манипулировать топологией CPU на уровне гипервизора, чтобы создать или предоставить два узла vNUMA для Windows Server. SQL Server будет рассматривать это как физический NUMA и создаст два реальных узла NUMA и связанные с ними потоки ввода-вывода.
Остерегайтесь создания нескольких vNUMA с небольшим объёмом памяти — это не улучшит производительность, а скорее создаст проблемы с производительностью из-за удалённого доступа к памяти. Вы можете оценить использование памяти узлом NUMA с помощью следующего DMV:
SELECT * FROM sys.dm_os_memory_node_access_stats;
Запросы/DMV для исследования
-- Аппаратный NUMA/Узел памяти
SELECT @@servername AS 'sql_intance',
'Orginal NUMA/Memory Node' AS 'Memory Node',
memory_node_id,
CONVERT(DECIMAL(18,2),(virtual_address_space_reserved_kb / 1024.0)) AS virtual_address_space_reserved_mb,
CONVERT(DECIMAL(18,2),(virtual_address_space_committed_kb / 1024.0)) AS virtual_address_space_committed_mb,
CONVERT(DECIMAL(18,2),(locked_page_allocations_kb / 1024.0)) AS locked_page_allocations_mb,
CONVERT(DECIMAL(18,2),(pages_kb / 1024.0)) AS pages_mb,
CONVERT(DECIMAL(18,2),(shared_memory_reserved_kb / 1024.0)) AS shared_memory_reserved_mb,
CONVERT(DECIMAL(18,2),(shared_memory_committed_kb / 1024.0)) AS shared_memory_committed_mb,
CONVERT(DECIMAL(18,2),(foreign_committed_kb / 1024.0)) AS foreign_committed_mb,
CONVERT(DECIMAL(18,2),(target_kb / 1024.0)) AS target_mb
FROM sys.dm_os_memory_nodes
WHERE memory_node_id <> 64;
-- Информация об оборудовании после применения soft-NUMA
SELECT @@servername AS 'sql_intance',
virtual_machine_type_desc,
cpu_count,
softnuma_configuration_desc,
socket_count,
cores_per_socket
FROM sys.dm_os_sys_info;
-- Узлы soft-NUMA
SELECT @@servername AS 'sql_intance',
'Memory Node with soft-NUMA' AS 'Memory Node',
node_id,
node_state_desc,
cpu_count
FROM sys.dm_os_nodes
WHERE node_state_desc = 'ONLINE';
-- Потоки
SELECT @@servername AS 'sql_intance',
spid,
lastwaittype,
cmd,
status
FROM sys.sysprocesses
WHERE cmd IN ( 'LAZY WRITER', 'RESOURCE MONITOR', 'LOG WRITER' );
Примеры создания NUMA и soft-NUMA
Эта конфигурация была выполнена в среде ESXi 8.0, Windows Server 2022 и SQL Server 2022. Независимо от среды, конечный результат будет одинаковым.
1 vSocket, 8 vCores на vSocket, без применения топологии CPU
Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64)
SQL Server detected 1 sockets with 8 cores per socket and 8 logical processors per socket, 8 total logical processors; using 8 logical processors based on SQL Server licensing.
CPU vectorization level(s) detected: SSE SSE2 SSE3 SSSE3 SSE41 SSE42 AVX AVX2 POPCNT BMI1 BMI2 AVX512 (F CD BW DQ VL)
Node configuration: node 0: CPU mask: 0x00000000000000ff:0 Active CPU mask: 0x00000000000000ff:0.
Total Log Writer threads: 2, Node CPUs: 4, Nodes: 1, Log Writer threads per CPU: 1, Log Writer threads per Node: 2
1 vSocket, 9 vCores на vSocket, без применения топологии CPU
Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64)
SQL Server detected 1 sockets with 9 cores per socket and 9 logical processors per socket, 9 total logical processors; using 9 logical processors based on SQL Server licensing.
Automatic soft-NUMA was enabled because SQL Server has detected hardware NUMA nodes with greater than 8 physical cores.
Node configuration: node 0: CPU mask: 0x000000000000001f:0 Active CPU mask: 0x000000000000001f:0.
Node configuration: node 1: CPU mask: 0x00000000000001e0:0 Active CPU mask: 0x00000000000001e0:0.
Total Log Writer threads: 2, Node CPUs: 2, Nodes: 2, Log Writer threads per CPU: 1, Log Writer threads per Node: 2
1 vSocket, 10 vCores на vSocket, без применения топологии CPU
Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64)
SQL Server detected 1 sockets with 10 cores per socket and 10 logical processors per socket, 10 total logical processors; using 10 logical processors based on SQL Server licensing.
Automatic soft-NUMA was enabled because SQL Server has detected hardware NUMA nodes with greater than 8 physical cores.
CPU vectorization level(s) detected: SSE SSE2 SSE3 SSSE3 SSE41 SSE42 AVX AVX2 POPCNT BMI1 BMI2 AVX512 (F CD BW DQ VL)
Node configuration: node 0: CPU mask: 0x000000000000001f:0 Active CPU mask: 0x000000000000001f:0.
Node configuration: node 1: CPU mask: 0x00000000000003e0:0 Active CPU mask: 0x00000000000003e0:0.
Total Log Writer threads: 2, Node CPUs: 2, Nodes: 2, Log Writer threads per CPU: 1, Log Writer threads per Node: 2
2 vSocket, 5 vCores на vSocket, без применения топологии CPU
Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64)
SQL Server detected 2 sockets with 5 cores per socket and 5 logical processors per socket, 10 total logical processors; using 10 logical processors based on SQL Server licensing.
Automatic soft-NUMA was enabled because SQL Server has detected hardware NUMA nodes with greater than 8 physical cores.
CPU vectorization level(s) detected: SSE SSE2 SSE3 SSSE3 SSE41 SSE42 AVX AVX2 POPCNT BMI1 BMI2 AVX512 (F CD BW DQ VL)
Node configuration: node 0: CPU mask: 0x000000000000001f:0 Active CPU mask: 0x000000000000001f:0.
Node configuration: node 1: CPU mask: 0x00000000000003e0:0 Active CPU mask: 0x00000000000003e0:0.
Total Log Writer threads: 2, Node CPUs: 2, Nodes: 2, Log Writer threads per CPU: 1, Log Writer threads per Node: 2
2 vSocket, 5 vCores на vSocket, 2 vNUMA, применена топология CPU
Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64)
SQL Server detected 2 sockets with 5 cores per socket and 5 logical processors per socket, 10 total logical processors; using 10 logical processors based on SQL Server licensing.
CPU vectorization level(s) detected: SSE SSE2 SSE3 SSSE3 SSE41 SSE42 AVX AVX2 POPCNT BMI1 BMI2 AVX512 (F CD BW DQ VL)
Node configuration: node 0: CPU mask: 0x000000000000001f:0 Active CPU mask: 0x000000000000001f:0.
Node configuration: node 1: CPU mask: 0x00000000000003e0:0 Active CPU mask: 0x00000000000003e0:0.
Total Log Writer threads: 2, Node CPUs: 2, Nodes: 2, Log Writer threads per CPU: 1, Log Writer threads per Node: 22 vSocket, 4 vCores на vSocket, 2 vNUMA, применена топология CPU
Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64)
SQL Server detected 2 sockets with 4 cores per socket and 4 logical processors per socket, 8 total logical processors; using 8 logical processors based on SQL Server licensing.
CPU vectorization level(s) detected: SSE SSE2 SSE3 SSSE3 SSE41 SSE42 AVX AVX2 POPCNT BMI1 BMI2 AVX512 (F CD BW DQ VL)
Node configuration: node 0: CPU mask: 0x000000000000000f:0 Active CPU mask: 0x000000000000000f:0.
Node configuration: node 1: CPU mask: 0x00000000000000f0:0 Active CPU mask: 0x00000000000000f0:0.
Total Log Writer threads: 2, Node CPUs: 2, Nodes: 2, Log Writer threads per CPU: 1, Log Writer threads per Node: 2
Ссылки
- Soft-NUMA (SQL Server)
- How It Works: Soft NUMA, I/O Completion Thread, Lazy Writer, Workers and Memory Nodes
- NUMA







Комментариев нет:
Отправить комментарий