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

67

При настройке нового SQL Server я использую следующий код, чтобы определить хорошую отправную точку для 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, в конце концов, ответ на все вопросы. Этот пост имеет 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

РЕДАКТИРОВАТЬ: Для будущих посетителей, вы можете посмотреть на функцию PowerShell-test-dbamaxdop (наряду с другими чрезвычайно полезными функциями DBA (ВСЕ БЕСПЛАТНО!).

Кин Шах
источник
случай, когда cpu_count> hyperthread_ratio затем 1 или 0 заканчивается, вы уверены, что это правда? потому что в случае 8 логических процессоров, 8 физических процессоров и 1 как Hyperthread_ratio. он по-прежнему говорит, что гиперпотоки включены, и мне трудно в это поверить. И в этом случае вы также получите MAXDOP как 1, что также не звучит правдоподобно.
UdIt Solanki
@UdItSolanki Правильный способ - использовать coreinfo, чтобы определить, включен ли HT или нет. Нет точного способа узнать, включен ли HT с использованием TSQL. Вы пробовали, test-dbamaxdopкак указано в моем ответе?
Кин Шах
17

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

mrdenny
источник
13

Взглянув на сообщение от команды MSDN , я нашел способ надежного получения количества физических ядер от компьютера и использования его для определения правильной настройки MAXDOP.

Под «хорошим» я имею в виду консервативный. То есть мое требование состоит в том, чтобы использовать максимум 75% ядер в узле NUMA или в целом максимум 8 ядер.

SQL Server 2016 (13.x) с пакетом обновления 2 (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 с пакетом обновления 2 (SP2), невозможно получить узел core-count-per-numa-node 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 ядра. Есть идеи почему?
BeginnerDBA
@BeginnerDBA - какую версию SQL Server вы используете?
Макс Вернон
его SQL Server 2012 и аналогичный для случая, когда я также тестировал на SQL2014
BeginnerDBA
SQL Server работает в виртуальной машине? Похоже, что число ядер на узел numa равно 1 - возможно, виртуальная машина настроена странно? Вы можете добавить это в конец скрипта для целей отладки: SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Макс Вернон
Благодарю. Нет, это физический сервер, позвольте мне также попробовать добавить это
BeginnerDBA
11

Как правило, используйте более высокое значение DOP для системы OLAP и более низкое (или нет) значение DOP для системы OLTP. Многие системы находятся где-то посередине, поэтому найдите удачную среду, которая позволяет случайной большой рабочей нагрузке получать достаточное количество процессоров для быстрого завершения работы без удушения рабочих нагрузок OLTP.

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

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

db2
источник
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.
Макс Вернон
Как к сведению, мой код выдает рекомендацию 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);
ShadowDancerLV
источник
3

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

Сервер 1
HTEnabled: 1
hyperthreadingRatio: 12
логических процессоров: 24
физических процессора: 2
логических процессора на numa: 12
NoOfNuma: 2
Параметр MaxDop должен быть: 6

Сервер 2
HTEnabled: 2
hyperthreadingRatio: 16 операций
логического процессора: 64
физический процессор: 4
логических процессора на 1 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

lad2025
источник
да, люблю функции в 2019 году. Это особенно приятное изменение.
Макс Вернон