Алгоритм налаштування MAXDOP для SQL Server


67

Під час налаштування нового SQL-сервера я використовую наступний код, щоб визначити хорошу вихідну точку для MAXDOPналаштування:

/* 
   This will recommend a MAXDOP setting appropriate for your machine's NUMA memory
   configuration.  You will need to evaluate this setting in a non-production 
   environment before moving it to production.

   MAXDOP can be configured using:  
   EXEC sp_configure 'max degree of parallelism',X;
   RECONFIGURE

   If this instance is hosting a Sharepoint database, you MUST specify MAXDOP=1 
   (URL wrapped for readability)
   http://blogs.msdn.com/b/rcormier/archive/2012/10/25/
   you-shall-configure-your-maxdop-when-using-sharepoint-2013.aspx

   Biztalk (all versions, including 2010): 
   MAXDOP = 1 is only required on the BizTalk Message Box
   database server(s), and must not be changed; all other servers hosting other 
   BizTalk Server databases may return this value to 0 if set.
   http://support.microsoft.com/kb/899000
*/


DECLARE @CoreCount int;
DECLARE @NumaNodes int;

SET @CoreCount = (SELECT i.cpu_count from sys.dm_os_sys_info i);
SET @NumaNodes = (
    SELECT MAX(c.memory_node_id) + 1 
    FROM sys.dm_os_memory_clerks c 
    WHERE memory_node_id < 64
    );

IF @CoreCount > 4 /* If less than 5 cores, don't bother. */
BEGIN
    DECLARE @MaxDOP int;

    /* 3/4 of Total Cores in Machine */
    SET @MaxDOP = @CoreCount * 0.75; 

    /* if @MaxDOP is greater than the per NUMA node
       Core Count, set @MaxDOP = per NUMA node core count
    */
    IF @MaxDOP > (@CoreCount / @NumaNodes) 
        SET @MaxDOP = (@CoreCount / @NumaNodes) * 0.75;

    /*
        Reduce @MaxDOP to an even number 
    */
    SET @MaxDOP = @MaxDOP - (@MaxDOP % 2);

    /* Cap MAXDOP at 8, according to Microsoft */
    IF @MaxDOP > 8 SET @MaxDOP = 8;

    PRINT 'Suggested MAXDOP = ' + CAST(@MaxDOP as varchar(max));
END
ELSE
BEGIN
    PRINT 'Suggested MAXDOP = 0 since you have less than 4 cores total.';
    PRINT 'This is the default setting, you likely do not need to do';
    PRINT 'anything.';
END

Я усвідомлюю, що це трохи суб'єктивно, і може змінюватися залежно від багатьох речей; однак я намагаюся створити чітку загальну частину коду, яку слід використовувати як вихідну точку для нового сервера.

Хтось має якийсь внесок у цей код?


1
Моя рекомендація за замовчуванням для 4-х процесорів - 2. 0 встановлює її необмежену. І поки ви там налаштовуєте MAXDOP, я б рекомендував вам розглянути можливість коригування межі вартості для паралелізму (він же, CTFP) приблизно між 40 і 75. {Моя улюблена початкова настройка - 42 ... з причин, що багато шанувальників Sci-Fi будуть визнати}
yeOldeDataSmythe

Зрештою, це відповідь на все. Наприклад, ця публікація має 42 тисячі переглядів.
Макс Вернон

Відповіді:


49

Найкращий спосіб зробити це - використовувати coreinfo (утиліту від sysinternals), оскільки це допоможе вам

a. Logical to Physical Processor Map
b. Logical Processor to Socket Map
c. Logical Processor to NUMA Node Map as below :

Logical to Physical Processor Map:
**----------------------  Physical Processor 0 (Hyperthreaded)
--**--------------------  Physical Processor 1 (Hyperthreaded)
----**------------------  Physical Processor 2 (Hyperthreaded)
------**----------------  Physical Processor 3 (Hyperthreaded)
--------**--------------  Physical Processor 4 (Hyperthreaded)
----------**------------  Physical Processor 5 (Hyperthreaded)
------------**----------  Physical Processor 6 (Hyperthreaded)
--------------**--------  Physical Processor 7 (Hyperthreaded)
----------------**------  Physical Processor 8 (Hyperthreaded)
------------------**----  Physical Processor 9 (Hyperthreaded)
--------------------**--  Physical Processor 10 (Hyperthreaded)
----------------------**  Physical Processor 11 (Hyperthreaded)

Logical Processor to Socket Map:
************------------  Socket 0
------------************  Socket 1

Logical Processor to NUMA Node Map:
************------------  NUMA Node 0
------------************  NUMA Node 1

Тепер, виходячи з вищенаведеної інформації, параметр Ideal MaxDop слід обчислити як

a.  It has 12 CPUs which are hyper threaded giving us 24 CPUs.
b.  It has 2 NUMA node [Node 0 and 1] each having 12 CPUs with Hyperthreading ON.
c.  Number of sockets are 2 [socket 0 and 1] which are housing 12 CPUs each.

Considering all above factors, the max degree of Parallelism should be set to 6 which is ideal value for server with above configuration.

Отже, відповідь - " це залежить " від сліду вашого процесора та конфігурації NUMA та нижче таблиці, підсумовуючи те, що я пояснив вище:

8 or less processors    ===> 0 to N (where N= no. of processors)
More than 8 processors  ===> 8
NUMA configured         ===> MAXDOP should not exceed no of CPUs assigned to each 
                                 NUMA node with max value capped to 8
Hyper threading Enabled ===> Should not exceed the number of physical processors.

Відредаговано: Нижче наводиться швидкий і брудний скрипт TSQL для створення рекомендації для налаштування MAXDOP

/*************************************************************************
Author          :   Kin Shah
Purpose         :   Recommend MaxDop settings for the server instance
Tested RDBMS    :   SQL Server 2008R2

**************************************************************************/
declare @hyperthreadingRatio bit
declare @logicalCPUs int
declare @HTEnabled int
declare @physicalCPU int
declare @SOCKET int
declare @logicalCPUPerNuma int
declare @NoOfNUMA int

select @logicalCPUs = cpu_count -- [Logical CPU Count]
    ,@hyperthreadingRatio = hyperthread_ratio --  [Hyperthread Ratio]
    ,@physicalCPU = cpu_count / hyperthread_ratio -- [Physical CPU Count]
    ,@HTEnabled = case 
        when cpu_count > hyperthread_ratio
            then 1
        else 0
        end -- HTEnabled
from sys.dm_os_sys_info
option (recompile);

select @logicalCPUPerNuma = COUNT(parent_node_id) -- [NumberOfLogicalProcessorsPerNuma]
from sys.dm_os_schedulers
where [status] = 'VISIBLE ONLINE'
    and parent_node_id < 64
group by parent_node_id
option (recompile);

select @NoOfNUMA = count(distinct parent_node_id)
from sys.dm_os_schedulers -- find NO OF NUMA Nodes 
where [status] = 'VISIBLE ONLINE'
    and parent_node_id < 64

-- Report the recommendations ....
select
    --- 8 or less processors and NO HT enabled
    case 
        when @logicalCPUs < 8
            and @HTEnabled = 0
            then 'MAXDOP setting should be : ' + CAST(@logicalCPUs as varchar(3))
                --- 8 or more processors and NO HT enabled
        when @logicalCPUs >= 8
            and @HTEnabled = 0
            then 'MAXDOP setting should be : 8'
                --- 8 or more processors and HT enabled and NO NUMA
        when @logicalCPUs >= 8
            and @HTEnabled = 1
            and @NoofNUMA = 1
            then 'MaxDop setting should be : ' + CAST(@logicalCPUPerNuma / @physicalCPU as varchar(3))
                --- 8 or more processors and HT enabled and NUMA
        when @logicalCPUs >= 8
            and @HTEnabled = 1
            and @NoofNUMA > 1
            then 'MaxDop setting should be : ' + CAST(@logicalCPUPerNuma / @physicalCPU as varchar(3))
        else ''
        end as Recommendations

РЕДАКТИРУЙТЕ: Для майбутніх відвідувачів ви можете ознайомитись із функцією оболонки тесту-dbamaxdop (разом з іншими надзвичайно корисними функціями DBA (ВСЕ БЕЗКОШТОВНО !!)


випадок, коли cpu_count> hyperthread_ratio, то ще 1 кінець 0, ви впевнені, що це правда? тому що у випадку 8 логічних процесорів, 8 фізичних процесорів і 1 як гіпертрейд_раціо. вона все ще говорить, що ввімкнено гіпертону, в яку мені важко повірити. І в цьому випадку ви також отримуєте MAXDOP як 1, що також не відповідає дійсності.
UdIt Solanki

@UdItSolanki Правильним способом є використання coreinfo, щоб визначити, чи ввімкнено HT чи ні. Не існує остаточного способу дізнатися, чи ввімкнено HT за допомогою TSQL. Ви спробували, test-dbamaxdopяк було сказано у моїй відповіді?
Кін Шах

17

Під час встановлення MAXDOP, як правило, потрібно обмежити його кількістю ядер у вузлі NUMA. Таким чином графіки не намагаються отримати доступ до пам'яті через вузли numa.


13

Дивлячись на повідомлення від команди MSDN , я придумав спосіб надійно отримати підрахунок фізичних ядер з машини та використати це для визначення хорошої настройки MAXDOP.

Під «добрим» я маю на увазі консервативність. Тобто моя вимога - використовувати максимум 75% ядер у вузлі NUMA, або загальний максимум 8 ядер.

SQL Server 2016 (13.x) SP2 і новіші версії, а також всі версії SQL Server 2017 і вище деталі поверхні про кількість фізичного ядра на сокет, кількість сокетів та кількість вузлів NUMA, що дозволяє охайним способом визначити базову лінію Налаштування MAXDOP для нової установки SQL Server.

Для вищезгаданих версій цей код рекомендує консервативне встановлення MAXDOP 75% від кількості фізичних ядер у вузлі NUMA:

DECLARE @socket_count int;
DECLARE @cores_per_socket int;
DECLARE @numa_node_count int;
DECLARE @memory_model nvarchar(120);
DECLARE @hyperthread_ratio int;

SELECT @socket_count = dosi.socket_count
       , @cores_per_socket = dosi.cores_per_socket
       , @numa_node_count = dosi.numa_node_count
       , @memory_model = dosi.sql_memory_model_desc
       , @hyperthread_ratio = dosi.hyperthread_ratio
FROM sys.dm_os_sys_info dosi;

SELECT [Socket Count] = @socket_count
       , [Cores Per Socket] = @cores_per_socket
       , [Number of NUMA nodes] = @numa_node_count
       , [Hyperthreading Enabled] = CASE WHEN @hyperthread_ratio > @cores_per_socket THEN 1 ELSE 0 END
       , [Lock Pages in Memory granted?] = CASE WHEN @memory_model = N'CONVENTIONAL' THEN 0 ELSE 1 END;

DECLARE @MAXDOP int = @cores_per_socket;
SET @MAXDOP = @MAXDOP * 0.75;
IF @MAXDOP >= 8 SET @MAXDOP = 8;

SELECT [Recommended MAXDOP setting] = @MAXDOP
       , [Command] = 'EXEC sys.sp_configure N''max degree of parallelism'', ' + CONVERT(nvarchar(10), @MAXDOP) + ';RECONFIGURE;';

Для версій SQL Server до SQL Server 2017 або SQL Server 2016 SP2 ви не можете отримати вузол «число-ядро на число» sys.dm_os_sys_info. Натомість ми можемо використовувати PowerShell для визначення кількості фізичних ядер:

powershell -OutputFormat Text -NoLogo -Command "& {Get-WmiObject -namespace 
"root\CIMV2" -class Win32_Processor -Property NumberOfCores} | select NumberOfCores"

Можна також використовувати PowerShell для визначення кількості логічних ядер, що, швидше за все, буде вдвічі більше фізичних ядер, якщо HyperThreading увімкнено:

powershell -OutputFormat Text -NoLogo -Command "& {Get-WmiObject -namespace 
"root\CIMV2" -class Win32_Processor -Property NumberOfCores} 
| select NumberOfLogicalProcessors"

T-SQL:

/* 
   This will recommend a MAXDOP setting appropriate for your machine's NUMA memory
   configuration.  You will need to evaluate this setting in a non-production 
   environment before moving it to production.

   MAXDOP can be configured using:  
   EXEC sp_configure 'max degree of parallelism',X;
   RECONFIGURE

   If this instance is hosting a Sharepoint database, you MUST specify MAXDOP=1 
   (URL wrapped for readability)
   http://blogs.msdn.com/b/rcormier/archive/2012/10/25/
   you-shall-configure-your-maxdop-when-using-sharepoint-2013.aspx

   Biztalk (all versions, including 2010): 
   MAXDOP = 1 is only required on the BizTalk Message Box
   database server(s), and must not be changed; all other servers hosting other 
   BizTalk Server databases may return this value to 0 if set.
   http://support.microsoft.com/kb/899000
*/
SET NOCOUNT ON;

DECLARE @CoreCount int;
SET @CoreCount = 0;
DECLARE @NumaNodes int;

/*  see if xp_cmdshell is enabled, so we can try to use 
    PowerShell to determine the real core count
*/
DECLARE @T TABLE (
    name varchar(255)
    , minimum int
    , maximum int
    , config_value int
    , run_value int
);
INSERT INTO @T 
EXEC sp_configure 'xp_cmdshell';
DECLARE @cmdshellEnabled BIT;
SET @cmdshellEnabled = 0;
SELECT @cmdshellEnabled = 1 
FROM @T
WHERE run_value = 1;
IF @cmdshellEnabled = 1
BEGIN
    CREATE TABLE #cmdshell
    (
        txt VARCHAR(255)
    );
    INSERT INTO #cmdshell (txt)
    EXEC xp_cmdshell 'powershell -OutputFormat Text -NoLogo -Command "& {Get-WmiObject -namespace "root\CIMV2" -class Win32_Processor -Property NumberOfCores} | select NumberOfCores"';
    SELECT @CoreCount = CONVERT(INT, LTRIM(RTRIM(txt)))
    FROM #cmdshell
    WHERE ISNUMERIC(LTRIM(RTRIM(txt)))=1;
    DROP TABLE #cmdshell;
END
IF @CoreCount = 0 
BEGIN
    /* 
        Could not use PowerShell to get the corecount, use SQL Server's 
        unreliable number.  For machines with hyperthreading enabled
        this number is (typically) twice the physical core count.
    */
    SET @CoreCount = (SELECT i.cpu_count from sys.dm_os_sys_info i); 
END

SET @NumaNodes = (
    SELECT MAX(c.memory_node_id) + 1 
    FROM sys.dm_os_memory_clerks c 
    WHERE memory_node_id < 64
    );

DECLARE @MaxDOP int;

/* 3/4 of Total Cores in Machine */
SET @MaxDOP = @CoreCount * 0.75; 

/* if @MaxDOP is greater than the per NUMA node
    Core Count, set @MaxDOP = per NUMA node core count
*/
IF @MaxDOP > (@CoreCount / @NumaNodes) 
    SET @MaxDOP = (@CoreCount / @NumaNodes) * 0.75;

/*
    Reduce @MaxDOP to an even number 
*/
SET @MaxDOP = @MaxDOP - (@MaxDOP % 2);

/* Cap MAXDOP at 8, according to Microsoft */
IF @MaxDOP > 8 SET @MaxDOP = 8;

PRINT 'Suggested MAXDOP = ' + CAST(@MaxDOP as varchar(max));

Я запустив сценарій, і він рекомендував мені MAXDOP = 0. важко повірити для 4 вузла NUMA, логічно оброблених HT, логічних процесорів = 20 на 4 ядра. Будь-яка ідея чому?
ПочатокDBA

@BeginnerDBA - яку версію SQL Server ви використовуєте?
Макс Вернон

його SQL-сервер 2012 і подібне для випадку, коли я тестував і на SQL2014
BeginnerDBA

Чи працює SQL Server у віртуальній машині? Схоже, кількість ядер на вузол numa дорівнює 1 - можливо, VM дивно налаштований? Ви можете додати це до кінця сценарію для налагодження: SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Макс Вернон,

Дякую. Ні, його фізичний сервер, дозвольте мені спробувати додати це також
BeginnerDBA

11

Як правило, використовуйте більш високий DOP для системи OLAP, а нижчий (або ні) DOP для системи OLTP. Багато систем знаходяться десь посередині, тому знайдіть задоволений носій, який дозволяє періодично великим навантаженням отримати достатню кількість процесора для швидкого завершення, не задушуючи навантаження OLTP.

Крім того, будьте обережні щодо використання cpu_countстовпця, щоб отримати основний підрахунок. Якщо ввімкнено гіперточування, цей стовпець, як видається, відображає кількість логічних підданих процесорів. Взагалі кажучи, ви не хочете, щоб DOP був вищим за кількість фізичних ядер. Розповсюдження великого паралельного навантаження на логічні процесори просто збільшить накладні витрати без реальної користі.

Також є hyperthread_ratioколонка, але я не впевнений, що це являє собою. Документація теж не дуже чітка. Число, яке я бачу в нашій системі, припускає, що це може бути або кількість фізичних ядер у всій системі, або кількість логічних процесорів на чіп. У документації стверджується, що я повинен бачити зовсім іншу фігуру.


1
Я вважаю, що hyperthread_ratioце кількість логічних ядер на процесор. Я трохи побіг назад, і якщо я правильно пам’ятаю, до такого висновку я прийшов. Можливо, @AaronBertrand має більше інформації про це. Не сприймайте це як важкий і швидкий факт ще до перевірки.
Томас Стрінгер

Документація @ThomasStringer стверджує, що і від запуску на декількох машинах це саме так виглядає. Однак з цього стовпця досить складно сказати, чи реально включена гіперточка чи ні. Наприклад, на одному з моїх серверів він повідомляє про 8 - сервер має 2 фізичних процесора, з 4 ядрами на кожному процесорі, з увімкненою гіперпереборкою. На машинах без гіперточення він повідомляє 4 за тих самих обставин, але не перезавантажуючи (і вимикаючи гіперточення), ви ніколи не побачите цієї зміни!
Макс Вернон

7

Я також натрапив на статтю http://support.microsoft.com/kb/2806535 і не можу знайти кореляцію із вищезазначеними сценаріями.

Також мені цікаво, чому існує диференціація для "@logicalCPUs> = 8 і @HTEnabled = 1 і @NoofNUMA = 1" і "@logicalCPUs> = 8 і @HTEnabled = 1 і @NoofNUMA> 1" стає тим самим.

Зрештою, я закінчив писати власний фрагмент коду, що відповідає статті зверху, хоча навіть там я хотів би більш точне визначення та / або розрізнення щодо "процесорів", "процесора" та "фізичних процесорів".

Не соромтеся мати спіна з ним.

/*************************************************************************
Author          :   Dennis Winter (Thought: Adapted from a script from "Kin Shah")
Purpose         :   Recommend MaxDop settings for the server instance
Tested RDBMS    :   SQL Server 2008R2

**************************************************************************/
declare @hyperthreadingRatio bit
declare @logicalCPUs int
declare @HTEnabled int
declare @physicalCPU int
declare @SOCKET int
declare @logicalCPUPerNuma int
declare @NoOfNUMA int
declare @MaxDOP int

select @logicalCPUs = cpu_count -- [Logical CPU Count]
    ,@hyperthreadingRatio = hyperthread_ratio --  [Hyperthread Ratio]
    ,@physicalCPU = cpu_count / hyperthread_ratio -- [Physical CPU Count]
    ,@HTEnabled = case 
        when cpu_count > hyperthread_ratio
            then 1
        else 0
        end -- HTEnabled
from sys.dm_os_sys_info
option (recompile);

select @logicalCPUPerNuma = COUNT(parent_node_id) -- [NumberOfLogicalProcessorsPerNuma]
from sys.dm_os_schedulers
where [status] = 'VISIBLE ONLINE'
    and parent_node_id < 64
group by parent_node_id
option (recompile);

select @NoOfNUMA = count(distinct parent_node_id)
from sys.dm_os_schedulers -- find NO OF NUMA Nodes 
where [status] = 'VISIBLE ONLINE'
    and parent_node_id < 64

IF @NoofNUMA > 1 AND @HTEnabled = 0
    SET @MaxDOP= @logicalCPUPerNuma 
ELSE IF  @NoofNUMA > 1 AND @HTEnabled = 1
    SET @MaxDOP=round( @NoofNUMA  / @physicalCPU *1.0,0)
ELSE IF @HTEnabled = 0
    SET @MaxDOP=@logicalCPUs
ELSE IF @HTEnabled = 1
    SET @MaxDOP=@physicalCPU

IF @MaxDOP > 10
    SET @MaxDOP=10
IF @MaxDOP = 0
    SET @MaxDOP=1

PRINT 'logicalCPUs : '         + CONVERT(VARCHAR, @logicalCPUs)
PRINT 'hyperthreadingRatio : ' + CONVERT(VARCHAR, @hyperthreadingRatio) 
PRINT 'physicalCPU : '         + CONVERT(VARCHAR, @physicalCPU) 
PRINT 'HTEnabled : '           + CONVERT(VARCHAR, @HTEnabled)
PRINT 'logicalCPUPerNuma : '   + CONVERT(VARCHAR, @logicalCPUPerNuma) 
PRINT 'NoOfNUMA : '            + CONVERT(VARCHAR, @NoOfNUMA)
PRINT '---------------------------'
Print 'MAXDOP setting should be : ' + CONVERT(VARCHAR, @MaxDOP)

Хороший фрагмент коду. Я не впевнений, чи розумієте ви, що hyperthread_ratioстовпець уводить в sys.dm_os_sys_infoоману ... наприклад, на моїй робочій станції я маю єдиний 4-ядерний процесор з увімкненою гіпертетичністю - диспетчер завдань бачить 8 логічних процесорів, а ваш код повідомляє про коефіцієнт гіперточення до бути 1.
Макс Вернон

Як FYI, мій код дає рекомендацію 6 для цієї машини, що дозволить залишити 2 ядра навіть у найбільш напружених паралельних запитах.
Макс Вернон

Hyperthread_ratio - це справді проблема, хоча краще вирішити не можна - принаймні, не наскільки мені відомо. Дивіться цей блог для отримання додаткових подробиць: sqlblog.com/blogs/kalen_delaney/archive/2007/12/08/… А щодо вашого другого допису - мені б добре знати, яке значення для "максимальної ступеня паралізму" ви обрали для вашої машини. :-D Також я досить нова в цій темі - просто натрапила на це лише тому, що раніше не знала і потребувала цієї інформації. Отже, яким би був ваш висновок: 2 ядра все ще доступні добре чи погано?
Денніс Зима,

4

Ця версія дає вам приємний єдиний набір результатів із існуючим параметром MAXDOP і має підтримувати версії SQL 2008-2017 без необхідності використовувати xp_cmdshell.

select
[ServerName]                    = @@SERVERNAME
, [ComputerName]                = SERVERPROPERTY('ComputerNamePhysicalNetBIOS') 
, [LogicalCPUs]             
, hyperthread_ratio 
, [PhysicalCPU]             
, [HTEnabled]               
, LogicalCPUPerNuma
, [NoOfNUMA]
, [MaxDop_Recommended]          = convert(int,case when [MaxDop_RAW] > 10 then 10 else [MaxDop_RAW] end)
, [MaxDop_Current]              = sc.value
, [MaxDop_RAW]
, [Number of Cores] 
from
(
select
     [LogicalCPUs]              
    , hyperthread_ratio 
    , [PhysicalCPU]             
    , [HTEnabled]               
    , LogicalCPUPerNuma
    , [NoOfNUMA]
    , [Number of Cores] 
    , [MaxDop_RAW]              = 
        case
            when [NoOfNUMA] > 1 AND HTEnabled = 0 then logicalCPUPerNuma 
            when [NoOfNUMA] > 1 AND HTEnabled = 1 then convert(decimal(9,4),[NoOfNUMA]/ convert(decimal(9,4),Res_MAXDOP.PhysicalCPU) * convert(decimal(9,4),1))
            when HTEnabled = 0 then  Res_MAXDOP.LogicalCPUs
            when HTEnabled = 1 then  Res_MAXDOP.PhysicalCPU
        end
from
(
    select
         [LogicalCPUs]              = osi.cpu_count
        , osi.hyperthread_ratio 
        , [PhysicalCPU]             = osi.cpu_count/osi.hyperthread_ratio
        , [HTEnabled]               = case when osi.cpu_count > osi.hyperthread_ratio then 1 else 0 end
        , LogicalCPUPerNuma
        , [NoOfNUMA]
        , [Number of Cores] 
    from 
    (
        select
            [NoOfNUMA]  = count(res.parent_node_id)
            ,[Number of Cores]  = res.LogicalCPUPerNuma/count(res.parent_node_id)
            ,res.LogicalCPUPerNuma
        from
        (
            Select
                s.parent_node_id
                ,LogicalCPUPerNuma  = count(1)
            from
                sys.dm_os_schedulers s
            where
                s.parent_node_id < 64
                and
                s.status = 'VISIBLE ONLINE'
            group by 
                s.parent_node_id
        ) Res
        group by
            res.LogicalCPUPerNuma
    ) Res_NUMA
    cross apply sys.dm_os_sys_info osi
) Res_MAXDOP
)Res_Final
cross apply sys.sysconfigures sc
where sc.comment = 'maximum degree of parallelism'
option (recompile);

3

Хороший сценарій, але стаття kb: http://support.microsoft.com/kb/2806535 не повністю відповідає вашому коду. Що я пропускаю?

Сервер 1
HTEnabled: 1
hyperthreadingRatio: 12
логічний cpus: 24
фізичний cpus: 2
логічний cpus на число: 12
NoOfNuma: 2
MaxDop повинен бути: 6

Server 2
HTEnabled: 2
hyperthreadingRatio: 16
логічний cpus: 64
фізичний cpus: 4
логічний cpus на numa: 16
NoOfNuma: 4
Параметр MaxDop повинен бути: 4

Я усвідомлюю, що це просто пропозиції; але мені щось не здається, що сервер (№2) вище з 4 процесорами замість 2 та 8 ядер на фізичному процесорі замість 6; рекомендував би MAXDOP на рівні 4 проти 6 для менш потужного сервера.

Стаття про kbb вище пропонує 8 мій сценарій вище. "Для серверів, у яких налаштовано NUMA та увімкнено гіпертодування, значення MAXDOP не повинно перевищувати кількість фізичних процесорів на вузол NUMA."


Якщо встановити MAXDOP вище, ніж кількість ядер / вузол numa, у кінцевому підсумку виклики в далеку пам'ять, які в багато разів повільніше, ніж дзвінки поблизу пам'яті. Це тому, що кожен вузол numa має власну пам’ять; мати запит, використовуючи більше потоків, ніж в одному режимі numa, поширить завантаження процесора на декілька ядер, а отже, на декілька вузлів пам'яті.
Макс Вернон

Я рекомендую встановити MAXDOP на налаштування, яке має сенс для вашого сервера, який виконує ваше завантаження. Тільки ви можете визначити найкращі настройки для вашого конкретного навантаження; ця посада є лише настановою.
Макс Вернон

2

Під час встановлення SQL Server 2019 CTP 3.0 є нова вкладка MaxDOP. Фактичне значення заздалегідь визначене (у попередніх версіях за замовчуванням було 0).

Налаштування MAXDOP під час налаштування SQL Server 2019

введіть тут опис зображення

Джерело зображення: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png


Так, дуже люблю риси в 2019 році. Це особливо приємна зміна.
Макс Вернон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.