26.8.26

NUMA и soft-NUMA в SQL Server: Получение дополнительных потоков ввода-вывода

Автор: 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: 2

2 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

Ссылки




Комментариев нет:

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