SQL ServerのMAXDOP設定アルゴリズム


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です。認識}
yeOldeDataSmythe

42は、結局のところ、すべてに対する答えです。たとえば、この投稿には42,000ビューがあります。
マックスヴァーノン

回答:


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.

編集済み:以下は、MAXDOP設定の推奨事項を生成するための迅速で汚いTSQLスクリプトです。

/*************************************************************************
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

編集:将来の訪問者のために、test-dbamaxdop powershell関数を見ることができます(他の非常に役立つDBA関数と一緒に(すべて無料!!)。


cpu_count> hyperthread_ratio then 1 else 0 endの場合、これは本当ですか?8個の論理プロセッサ、8個の物理プロセッサ、および1個のhyperthread_ratioの場合。それでも、信じられないほどハイパースレッドが有効になっていると言われています。その場合、MAXDOPも1になりますが、これも正しくありません。
UdIt Solanki

@UdItSolanki正しい方法は、coreinfoを使用してHTが有効になっているかどうかを判断することです。TSQLを使用してHTが有効になっているかどうかを確認する明確な方法はありません。test-dbamaxdop私の答えで述べたように試しましたか?
キンシャー

17

MAXDOPを設定する場合、通常はNUMAノードのコアの数に制限する必要があります。そうすれば、スケジュールはnumaノード全体でメモリにアクセスしようとしません。


13

MSDNチームからの投稿を見て、マシンから物理コアカウントを確実に取得し、それを使用して適切なMAXDOP設定を決定する方法を考え出しました。

「良い」とは、保守的な意味です。つまり、私の要件は、NUMAノード内のコアの最大75%、または全体で最大8コアを使用することです。

SQL Server 2016(13.x)SP2以上、およびSQL Server 2017以上のすべてのバージョンは、ソケットあたりの物理コア数、ソケット数、NUMAノードの数に関する詳細を表面化し、ベースラインを整然とした方法で判断できるようにします新しいSQL ServerインストールのMAXDOP設定。

上記のバージョンの場合、このコードは、NUMAノード内の物理コアの数の75%の控えめなMAXDOP設定を推奨します。

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 2017またはSQL Server 2016 SP2より前のバージョンのSQL Serverの場合、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を使用して論理コアの数を決定することもできます。これは、ハイパースレッディングが有効になっている場合、物理コアの数の2倍になる可能性があります。

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 enbaled、論理プロセッサ= 4コアあたり20については信じがたい。理由は何ですか?
BeginnerDBA

@BeginnerDBA-どのバージョンのSQL Serverを使用していますか?
マックスヴァーノン

SQL Server 2012およびSQL2014で同様にテストした場合と同様
BeginnerDBA

SQL ServerはVMで実行されていますか?numaノードあたりのコアカウントは1のように見えます。おそらく、VMが奇妙に構成されているのでしょうか。あなたは、デバッグの目的で、スクリプトの最後にこれを追加することができます: SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
マックス・バーノン

ありがとう。いいえ、物理サーバーです。これも追加してみましょう
BeginnerDBA

11

一般的なルールとして、OLAPシステムには高いDOPを使用し、OLTPシステムには低い(または使用しない)DOPを使用します。多くのシステムはその中間にあるため、OLTPワークロードを停止することなく、時折大規模なワークロードで十分なCPUを迅速に完了することを可能にする幸せな媒体を見つけてください。

また、cpu_count列を使用してコアカウントを取得することにも注意してください。ハイパースレッディングが有効な場合、この列は公開された論理プロセッサーの数を反映しているようです。一般的に、DOPを物理コアの数よりも高くすることは望ましくありません。重い並列ワークロードを論理プロセッサに分散すると、オーバーヘッドが増加するだけで、実質的なメリットはありません。

hyperthread_ratio列もありますが、それが何を表しているのかはわかりません。ドキュメントもあまり明確ではありません。私たちのシステムに表示される数字は、システム全体の物理コアの数、またはチップあたりの論理プロセッサの数のいずれかである可能性があることを示唆しています。ドキュメンテーションは、私はまったく別の数字を見るべきだと主張しています。


1
これはhyperthread_ratioプロセッサあたりの論理コアの量だと思います。私は少し前にそのことに遭遇しました、そして、私が正しく覚えているならば、それは私が来た結論です。たぶん@AaronBertrandがそれについてもっと情報を持っています。検証する前に、それを難し​​くて速い事実として受け取らないでください。
トーマスストリンガー

@ThomasStringerのドキュメントには、複数のマシンで実行すると、それがどのように見えるかが示されています。ただし、その列からハイパースレッディングが実際に有効になっているかどうかを判断するのは非常に困難です。たとえば、私のサーバーの1つでは8が報告されています。サーバーには2つの物理CPUがあり、各CPUに4つのコアがあり、ハイパースレッディングが有効になっています。ハイパースレッディングのないマシンでは、同じ状況で4が報告されますが、再起動(およびハイパースレッディングをオフ)しないと、その変化は見られません!
マックスヴァーノン

7

また、http://support.microsoft.com/kb/2806535の記事につまずきましたが、上記のスクリプトとの相関関係が見つかりません。

また、結果として「@logicalCPUs> = 8 and @HTEnabled = 1 and @NoofNUMA = 1」と「@logicalCPUs> = 8 and @HTEnabled = 1 and @NoofNUMA> 1」の区別が存在する理由も疑問です同じになります。

結局、上記の記事に一致する独自のコードを書くことになりましたが、「プロセッサ」、「CPU」、「物理プロセッサ」についてのより正確な定義や差別化が大好きだったでしょう。

気軽に試してみてください。

/*************************************************************************
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_ratiosys.dm_os_sys_infoが誤解を招くかどうかわからない...たとえば、私のワークステーションでは、ハイパースレッディングが有効になっている単一の4コアCPUがあります-タスクマネージャーは8つの論理CPUを認識し、コードはハイパースレッディング率を報告します1である
マックス・バーノン

参考までに、私のマシンのコードはこのマシンに対して6の推奨値を生成します。これにより、最もストレスの多い並列クエリの下でも2つのコアが使用可能になります。
マックスヴァーノン14年

hyperthread_ratioは確かに問題ですが、より良く解決することはできません-少なくとも私の知る限りでは。詳細については、このブログをご覧ください。sqlblog.com / blogs / kalen_delaney / archive / 2007/12/08 / そして、2番目の投稿について-あなたが選んだ「最大度の視差」の値を知っていただければ幸いですあなたのマシンのために。:-Dまた、私はこのトピックで非常に新しいです-私は以前にこの情報を知らなかったので、この情報が必要だったという理由だけでこれにつまずいた。したがって、あなたの結論は何ですか、2つのコアはまだ良いことですか悪いことですか?
デニス冬

4

このバージョンでは、既存のMAXDOP設定で単一の結果セットが提供され、xp_cmdshellを使用する必要なく、SQL 2008-2017のバージョンで保持できます。

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
論理CPU:24
物理CPU:2つの
12:NUMAあたり論理CPU
NoOfNumaは:2
MAXDOP設定がなければならない:6

サーバ2
HTEnabled:2
hyperthreadingRatio:16
論理CPU:64個の
物理CPU:4
の論理CPUあたりnuma:16
NoOfNuma:4
MaxDop設定は:4

これらは単なる提案に過ぎないことを理解しています。しかし、上記のサーバー(#2)が2ではなく4プロセッサーで、6ではなく物理CPUごとに8コアであるということは、私には正しくないと思われます。強力でないサーバーの場合は6に対して、MAXDOPは4を推奨します。

上記のkbbの記事は、上記の私のシナリオを示唆しています。「NUMAが構成され、ハイパースレッディングが有効になっているサーバーの場合、MAXDOP値はNUMAノードあたりの物理プロセッサーの数を超えてはなりません。」


MAXDOPをコア/ numaノードの数よりも高く設定すると、nearメモリを呼び出すよりも何倍も遅いfarメモリへの呼び出しになります。これは、各numaノードに独自のメモリがあるためです。単一のnumaモードに存在するよりも多くのスレッドをクエリに使用させると、CPU負荷が複数のコアに分散し、したがって複数のメモリノードに分散します。
マックスヴァーノン

MAXDOPを、負荷を実行しているサーバーにとって意味のある設定に設定することをお勧めします。特定の負荷に最適な設定を決定できるのはあなただけです。この投稿はガイドラインにすぎません。
マックスヴァーノン

2

SQL Server 2019 CTP 3.0のインストール中に、新しいタブMaxDOPがあります。実際の値は事前定義されています(以前のバージョンではデフォルトは0でした)。

SQL Server 2019セットアップ中にMAXDOPを設定する

ここに画像の説明を入力してください

画像ソース:https : //www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png


うん、2019年の機能が大好きです。それは特に素晴らしい変化です。
マックスヴァーノン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.