SQL Server için MAXDOP ayar algoritması


67

Yeni bir SQL Server MAXDOPkurarken , ayar için iyi bir başlangıç ​​noktası belirlemek için aşağıdaki kodu kullanıyorum :

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

Bunun biraz öznel olduğunu ve birçok şeye bağlı olarak değişebileceğini biliyorum; ancak yeni bir sunucu için başlangıç ​​noktası olarak kullanmak üzere sıkı bir kod yakalama kodu oluşturmaya çalışıyorum.

Bu kodda herhangi bir girişi olan var mı?


1
Varsayılan 4 işlemci ile önerim 2'dir. 0 sınırsız olarak ayarlar. MAXDOP'u ayarlarken, Paralelliğin Maliyet Eşiğini (CTFP) 40 ila 75 arasında bir değere ayarlamanızı öneririm. tanımak için}
yeOldeDataSmythe

42 Sonuçta, her şeyin cevabı. Bu yazı, örneğin 42 bin manzaraya sahip.
Max Vernon

Yanıtlar:


49

Bunu yapmanın en iyi yolu - size vereceği gibi coreinfo (sysinternals yardımcı programı) kullanmaktır.

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

Şimdi, yukarıdaki bilgilere dayanarak, Ideal MaxDop ayarı şu şekilde hesaplanmalıdır:

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.

Yani cevap - " duruma göre değişir işlemcinizin ayak izi" ve numa yapılandırma ve tablonun altındaki yukarıda anlattığım özetler:

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.

Düzenlendi: Aşağıda MAXDOP ayarı için Öneri oluşturmak için hızlı ve kirli bir TSQL betiği var

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

EDIT: Gelecekteki ziyaretçiler için test-dbamaxdop powershell işlevine bakabilirsiniz ( diğer son derece yararlı DBA işlevleriyle birlikte (TÜM BEDAVA !!).


case> cpu_count> hyperthread_ratio sonra 1 başka 0 sonuç, bunun doğru olduğuna emin misin? çünkü 8 mantıksal işlemci, 8 fiziksel işlemci ve 1 olarak hyperthread_ratio. Yine de inanmak zor bulduğum hyperthread'in etkin olduğunu söylüyor. Ve bu durumda, MAXDOP'u 1 olarak da alırsınız ki bu da doğru gelmiyor.
UdIt Solanki

@UdItSolanki HT'nin etkin olup olmadığını belirlemek için coreinfo kullanmak doğru yoldur. HTQL'in TSQL kullanarak etkin olup olmadığını bilmenin kesin bir yolu yoktur. Cevabımda test-dbamaxdopbahsettiğim gibi denedin mi?
Kin Shah

17

MAXDOP ayarını yaparken, genellikle bir NUMA düğümündeki çekirdek sayısıyla sınırlandırmak istersiniz. Bu şekilde zamanlamalar numa düğümleri arasında belleğe erişmeye çalışmıyor.


13

MSDN ekibinden bir gönderiye bakarken, bir makineden fiziksel çekirdek sayısını güvenilir bir şekilde elde etmenin bir yolunu buldum ve bunu iyi bir MAXDOP ayarı belirlemek için kullandım.

"İyi" derken, muhafazakar demek istiyorum. Yani, benim ihtiyacım bir NUMA düğümünde çekirdeklerin maksimum% 75'ini veya toplamda en fazla 8 çekirdek kullanmak.

SQL Server 2016 (13.x) SP2 ve üstü ve SQL Server 2017 ve üstü tüm sürümler, soket başına fiziksel çekirdek sayısı, soket sayısı ve NUMA düğüm sayısı hakkında temel ayrıntıları belirleyerek temel çizgiyi belirlemek için düzenli bir yol sağlar. Yeni bir SQL Server kurulumu için MAXDOP ayarı.

Yukarıda belirtilen sürümler için, bu kod bir NUMA düğümündeki fiziksel çekirdek sayısının% 75'inin muhafazakar bir MAXDOP ayarı önerir:

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 veya SQL Server 2016 SP2'den önceki SQL Server sürümleri için, numa sayısı başına çekirdek sayımı elde edemezsiniz sys.dm_os_sys_info. Bunun yerine, fiziksel çekirdek sayısını belirlemek için PowerShell'i kullanabiliriz:

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

Birisi, HyperThreading açıksa muhtemelen fiziksel çekirdeklerin iki katı olacak olan mantıksal çekirdek sayısını belirlemek için PowerShell'i de kullanabilir:

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));

Senaryoyu çalıştırdım ve bana MAXDOP = 0 önerdi. 4 NUMA düğümü için inanmak zor, HT enbaled, mantıksal işlemciler = 4 çekirdek için 20 =. Neden bir fikrin var mı?
BaşlayanDBA

@BeginnerDBA - hangi SQL Server sürümünü kullanıyorsunuz?
Max Vernon

onun SQL server 2012 ve SQL2014 üzerinde de test ederken durum için benzer
BeginnerDBA

SQL Server bir VM'de çalışıyor mu? Her numa düğümü için çekirdek sayısı 1'dir - belki de VM garip bir şekilde yapılandırılmıştır? Bunu hata ayıklama amacıyla betiğin sonuna ekleyebilirsiniz: SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Max Vernon

Teşekkürler. Hayır, fiziksel bir sunucu, şunu da eklemeye çalışayım
BeginnerDBA

11

Genel bir kural olarak, bir OLAP sistemi için daha yüksek DOP kullanın ve bir OLTP sistemi için daha düşük (veya hayır) DOP kullanın. Pek çok sistem, aralarında bir yerdedir, bu nedenle, büyük iş yükünün, OLTP iş yüklerinizi boğmadan, hızlı bir şekilde tamamlanması için yeterli CPU almasını sağlayan mutlu bir ortam bulun.

Ayrıca, cpu_countbir çekirdek sayımı elde etmek için sütunu kullanma konusunda dikkatli olun . Hyperthreading etkinse, bu sütun maruz kalan mantıksal işlemci sayısını yansıtıyor gibi görünmektedir. Genel olarak, DOP'un fiziksel çekirdek sayısından daha yüksek olmasını istemiyorsunuz. Mantıksal işlemciler arasında ağır bir paralel iş yükü yaymak, hiçbir ek faydası olmadan ek yükü artırır.

Ayrıca bir hyperthread_ratiosütun var, ama neyi temsil ettiğinden emin değilim. Belgeler de çok net değil. Sistemimizde gördüğüm sayı, ya tüm sistemdeki fiziksel çekirdek sayısı ya da yonga başına mantıksal işlemci sayısı olabileceğini gösteriyor. Belgeler, tamamen farklı bir rakam görmem gerektiğini iddia ediyor.


1
hyperthread_ratioİşlemci başına mantıksal çekirdek miktarı olduğuna inanıyorum . Kısa bir süre önce bununla karşılaştım ve doğru hatırlıyorsam geldiğim sonuç budur. Belki @AaronBertrand bu konuda daha fazla bilgiye sahiptir. Doğrulamadan önce bunu henüz hızlı ve sert bir gerçek olarak kabul etmeyin.
Thomas Stringer

@ThomasStringer, dokümantasyonun ve birden fazla makinede çalıştırılmasının nasıl göründüğünü belirtir. Bununla birlikte, bu sütundan hiper-dişlemenin gerçekten etkin olup olmadığını söylemek oldukça zordur. Örneğin, sunucularımdan birinde 8 bildirir - sunucunun her işlemcide 4 çekirdekli, hiper iş parçacığı etkinleştirilmiş 2 fiziksel işlemcisi vardır. Hiper-titremesi olmayan makinelerde aynı koşullar altında 4 bildirir, ancak yeniden başlatmadan (ve hiper-kemiği kapatmadan) bu değişikliği asla göremezsiniz!
Max Vernon

7

Ayrıca, http://support.microsoft.com/kb/2806535 makalesinde de bulundum ve yukarıdaki kodlarla korelasyonu bulamıyorum.

Ayrıca, neden sonuç olarak "@logicalCPUs> = 8 ve @HTEnabled = 1 ve @NoofNUMA = 1" ve "@logicalCPUs> = 8 ve @HTEnabled = 1 ve @NoofNUMA> 1" için neden farklılıklar olduğunu merak ediyorum. aynı olur.

Ne de olsa, yukarıdan yazılan makaleye uyan kendi kod parçamı yazmayı bıraktım, yine de orada "işlemciler" "CPU" ve "fiziksel işlemciler" hakkında daha kesin bir tanım ve / veya farklılaşmayı çok isterdim.

Senin dönüşünü yapmaktan çekinme.

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

Güzel kod parçası. hyperthread_ratioKolonun sys.dm_os_sys_infoyanıltıcı olduğunu fark edip etmediğinizden emin değilim ... iş istasyonumda, örneğin, hiper-diş etkin olan tek bir 4 çekirdekli işlemcim var - Görev Yöneticisi 8 mantıksal CPU görüyor ve kodunuz hiper iş parçacığı oranını rapor ediyor. 1. Olmak
Max Vernon

Bir FYI olarak, kodum bu makine için 6 öneri üretmekte ve bu da en stresli paralel sorgularda bile 2 çekirdeği bırakacaktır.
Max Vernon

Hyperthread_ratio gerçekten bir konudur, ancak daha iyi çözülemez - en azından benim bildiğim kadarıyla değil. Daha fazla bilgi için bu Blogu inceleyin: sqlblog.com/blogs/kalen_delaney/archive/2007/12/08/… İkinci yazınız hakkında - "Azami derecede paralellik derecesi" için hangi değeri seçtiğinizi bilmek isterim Makineniz için. :-D Ayrıca bu konuda oldukça yeniyim - sadece bunun hakkında tökezledi çünkü daha önce bilmiyordum ve bu bilgiye ihtiyacım vardı. Öyleyse, sonucunuz ne olurdu, 2 çekirdek hala iyi bir şey mi yoksa kötü mü?
Dennis Winter,

4

Bu sürüm, mevcut MAXDOP ayarıyla ayarlanmış hoş ve tek bir sonuç verir ve xp_cmdshell kullanmaya gerek kalmadan SQL 2008-2017 sürümlerine dayanmalıdır.

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

Güzel script, ancak kb makalesi: http://support.microsoft.com/kb/2806535 kodunuzla tamamen örtüşmez. Neyi kaçırıyorum?

Sunucu 1
HTEnabled: 1
HyperthreadingRatio: 12
mantıksal cpus: 24
fiziksel cpus: Sayı
başına 2 mantıksal
cpus: 12 NoOfNuma: 2
MaxDop ayarı şöyle olmalıdır: 6

Sunucu 2
HTEnabled: 2
HyperthreadingRatio: 16
mantıksal cpus : 64
fiziksel cpus: 4
mantıksal cpus numa: 16
NoOfNuma: 4
MaxDop ayarı şöyle olmalı: 4

Bunların sadece öneri olduğunu biliyorum; ama bir şey bana yukarıda 2 yerine 4 işlemcili bir sunucunun (# 2) ve 6 yerine fiziksel CPU başına 8 çekirdeğin olduğunu doğru gelmiyor; daha az güçlü sunucu için 4'e karşı MAXDOP'u 6'ya tavsiye ederim.

Yukarıdaki kbb makalesinde 8 yukarıdaki senaryo önerim var. "NUMA'nın yapılandırılmış ve aşırı izlemenin etkin olduğu sunucular için, MAXDOP değerinin NUMA düğümü başına fiziksel işlemci sayısını aşmaması gerekir."


MAXDOP'u çekirdek / numa düğümü sayısından daha yükseğe ayarlarsanız, uzak belleğe çağrı yapmaktan çok daha yavaş olan uzaktaki belleğe yapılan aramalarla bitirdiniz. Bunun nedeni, her numa düğümünün kendi hafızasına sahip olmasıdır; bir sorguya sahip olmak, tek bir sayı modunda mevcut olandan daha fazla iş parçacığı kullanmak, CPU yükünü çoklu çekirdeklere ve dolayısıyla çoklu bellek düğümlerine yayar.
Max Vernon,

MAXDOP'u, yükünüzü çalıştıran sunucunuz için anlamlı bir ayara getirmenizi tavsiye ederim. Kendi yükünüz için en iyi ayarı yalnızca siz belirleyebilirsiniz; bu yayın sadece bir kılavuzdur.
Max Vernon

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.