อัลกอริทึมการตั้งค่า 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

ฉันรู้ว่านี่เป็นเรื่องส่วนตัวและอาจแตกต่างกันไปตามหลายสิ่ง แต่ฉันพยายามที่จะสร้างโค้ด catch-all ที่รัดกุมเพื่อใช้เป็นจุดเริ่มต้นสำหรับเซิร์ฟเวอร์ใหม่

ใครบ้างมีอินพุตในรหัสนี้


1
คำแนะนำของฉันสำหรับการเริ่มต้นกับ 4 โปรเซสเซอร์คือ 2 0 ตั้งเป็นไม่ จำกัด และในขณะที่คุณตั้งค่า MAXDOP ฉันขอแนะนำให้คุณพิจารณาปรับค่าใช้จ่ายต้นทุนสำหรับ Parallelism (aka, CTFP) ให้อยู่ระหว่าง 40 และ 75 {การตั้งค่าเริ่มต้นที่ชื่นชอบคือ 42 ... เพราะแฟน Sci-Fi หลายคนจะ รู้จัก}
yeOldeDataSmythe

42 คือคำตอบของทุกสิ่ง ตัวอย่างเช่นโพสต์นี้มีการดู 42,000 ครั้ง
Max Vernon

คำตอบ:


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

ตอนนี้จากข้อมูลข้างต้นการตั้งค่าในอุดมคติของ 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

แก้ไข: สำหรับผู้เข้าชมในอนาคตคุณสามารถดูฟังก์ชั่นtest-dbamaxdop powershell (พร้อมกับฟังก์ชั่น DBA ที่เป็นประโยชน์อื่น ๆ (ฟรีทั้งหมด !!)


ตัวพิมพ์เล็กเมื่อ cpu_count> hyperthread_ratio แล้ว 1 ส่วน 0 สิ้นสุดคุณแน่ใจหรือว่านี่เป็นความจริง? เพราะในกรณีของตัวประมวลผลแบบลอจิคัล 8 ตัวตัวประมวลผลทางกายภาพ 8 ตัวและ 1 เป็น hyperthread_ratio มันยังบอกว่ามีการเปิดใช้งานไฮเปอร์เธรดซึ่งฉันยากที่จะเชื่อ และในกรณีนี้คุณยังได้รับ MAXDOP เป็น 1 ซึ่งไม่เป็นความจริง
UdIt Solanki

@UdItSolanki วิธีที่ถูกต้องคือการใช้ coreinfo เพื่อตรวจสอบว่ามีการเปิดใช้งาน HT หรือไม่ไม่มีวิธีการที่ชัดเจนในการรู้ว่า HT เปิดใช้งานโดยใช้ TSQL หรือไม่ คุณลองtest-dbamaxdopตามที่กล่าวไว้ในคำตอบของฉันหรือไม่
Kin Shah

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 คุณไม่สามารถรับ 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 enbaled, ตัวประมวลผลเชิงตรรกะ = 20 ต่อ 4 คอร์ มีความคิดอะไรไหม
BeginnerDBA

@BeginnerDBA - คุณใช้ SQL Server เวอร์ชันใดอยู่
Max Vernon

SQL Server 2012 และคล้ายกันสำหรับกรณีเมื่อฉันทดสอบบน SQL2014 เช่นกัน
BeginnerDBA

SQL Server ทำงานใน VM หรือไม่ ดูเหมือนว่าจำนวนหลักต่อโหนด numa เป็น 1 - บางที VM ถูกกำหนดค่าแปลก ๆ ? คุณสามารถเพิ่มส่วนนี้ไว้ท้ายสคริปต์เพื่อจุดประสงค์ในการดีบั๊ก: SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Max Vernon

ขอบคุณ ไม่มันเป็นฟิสิคัลเซิร์ฟเวอร์ให้ฉันลองเพิ่มมันด้วย
BeginnerDBA

11

ตามกฎทั่วไปให้ใช้ DOP ที่สูงขึ้นสำหรับระบบ OLAP และต่ำกว่า (หรือไม่) DOP สำหรับระบบ OLTP ระบบจำนวนมากอยู่ระหว่างกันดังนั้นให้ค้นหาสื่อที่มีความสุขที่อนุญาตให้เวิร์กโหลดขนาดใหญ่เป็นครั้งคราวเพื่อให้ได้ CPU ที่เพียงพอที่จะทำให้เสร็จได้อย่างรวดเร็วโดยไม่บีบคอ OLTP ภาระงานของคุณ

นอกจากนี้ควรระวังเกี่ยวกับการใช้cpu_countคอลัมน์เพื่อรับจำนวนนับ หากเปิดใช้งานไฮเปอร์เธรดคอลัมน์นี้ดูเหมือนว่าจะแสดงจำนวนของตัวประมวลผลเชิงตรรกะที่เปิดเผย โดยทั่วไปคุณไม่ต้องการให้ DOP สูงกว่าจำนวนของแกนประมวลผลทางกายภาพ การกระจายเวิร์กโหลดแบบขนานจำนวนมากข้ามตัวประมวลผลแบบลอจิคัลจะเพิ่มโอเวอร์เฮดโดยไม่มีประโยชน์จริง

นอกจากนี้ยังมีhyperthread_ratioคอลัมน์ แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร เอกสารไม่ชัดเจนเช่นกัน จำนวนที่ฉันเห็นในระบบของเราแสดงว่าอาจเป็นจำนวนแกนประมวลผลทางกายภาพในระบบทั้งหมดหรือจำนวนตัวประมวลผลเชิงตรรกะต่อชิป เอกสารอ้างว่าฉันควรเห็นตัวเลขต่างกันโดยสิ้นเชิง


1
ฉันเชื่อว่าhyperthread_ratioเป็นจำนวนของแกนตรรกะต่อโปรเซสเซอร์ ฉันวิ่งเข้าไปในนั้นเล็กน้อยและถ้าฉันจำได้อย่างถูกต้องนั่นคือข้อสรุปที่ฉันได้รับ อาจ @AaronBertrand มีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ อย่าเข้าใจว่าเป็นเรื่องจริงและรวดเร็วก่อนการยืนยัน
Thomas Stringer

@ThomasStringer เอกสารระบุว่าและจากการเรียกใช้บนเครื่องหลายเครื่องนั่นคือสิ่งที่ดูเหมือนว่า อย่างไรก็ตามมันเป็นเรื่องยากที่จะบอกจากคอลัมน์นั้นว่าการเปิดใช้งานไฮเปอร์เธรดจริงหรือไม่ ตัวอย่างเช่นหนึ่งในเซิร์ฟเวอร์ของฉันรายงานว่า 8 - เซิร์ฟเวอร์มีฟิสิคัล CPU 2 ตัวพร้อมคอร์ 4 คอร์สำหรับแต่ละ CPU โดยเปิดใช้งานไฮเปอร์เธรด บนเครื่องที่ไม่มีไฮเปอร์เธรดจะรายงาน 4 ภายใต้สถานการณ์เดียวกัน แต่หากไม่มีการรีบูตเครื่อง (และปิดการทำไฮเปอร์เธรด) คุณจะไม่เห็นการเปลี่ยนแปลงนั้น!
Max Vernon

7

ฉันยังสะดุดเกี่ยวกับบทความhttp://support.microsoft.com/kb/2806535และไม่พบความสัมพันธ์กับสคริปต์ด้านบน

นอกจากนี้ฉันสงสัยว่าทำไมจึงมีความแตกต่างสำหรับ "@logicalCPUs> = 8 และ @HTEnabled = 1 และ @NoofNUMA = 1" และ "@logicalCPUs> = 8 และ @HTEnabled = 1 และ @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_ratioคอลัมน์ในsys.dm_os_sys_infoนั้นทำให้เข้าใจผิด ... บนเวิร์กสเตชันของฉันตัวอย่างเช่นฉันมีซีพียู 4 คอร์เดียวที่เปิดใช้งานไฮเปอร์เธรด - ตัวจัดการงานเห็นโลจิคัลซีพียู 8 ตัวและรหัสของคุณรายงานอัตราส่วน เป็น 1
Max Vernon

ในฐานะที่เป็น FYI รหัสของฉันสร้างคำแนะนำที่ 6 สำหรับเครื่องนี้ซึ่งจะปล่อยให้ 2 คอร์สามารถใช้ได้แม้ภายใต้การค้นหาแบบขนานที่เครียดที่สุด
Max Vernon

hyperthread_ratio นั้นเป็นปัญหา แต่ก็ไม่สามารถแก้ไขได้ดีกว่า - อย่างน้อยก็ไม่ใช่ความรู้ของฉัน ดูบล็อกนี้สำหรับรายละเอียดเพิ่มเติม: sqlblog.com/blogs/kalen_delaney/archive/2007/12/08/ … และเกี่ยวกับโพสต์ที่สองของคุณ - ฉันยินดีที่ได้รู้ว่าสิ่งใดที่คุ้มค่าสำหรับ "การเปรียบเทียบระดับสูงสุด" ที่คุณเลือก สำหรับเครื่องของคุณ :-D นอกจากนี้ฉันค่อนข้างใหม่ในหัวข้อนี้ - เพิ่งสะดุดเพราะฉันไม่เคยรู้มาก่อนและต้องการข้อมูลนี้ ดังนั้นสิ่งที่จะเป็นข้อสรุปของคุณคือ 2 คอร์ยังคงมีสิ่งที่ดีหรือไม่ดี?
Dennis Winter

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
ซีพียูตรรกะ: 24
ซีพียูทางกายภาพ: 2
ซีพียูตรรกะต่อ Numa: 12
NoOfNuma: 2
ตั้งค่า MaxDop ควรจะ: 6

เซิร์ฟเวอร์ 2
HTEnabled: 2
hyperthreadingRatio: 16
ซีพียูตรรกะ: 64
ซีพียูทางกายภาพ: 4
ตรรกะซีพียูต่อ numa: 16
NoOfNuma: 4
การตั้งค่า MaxDop ควรเป็น: 4

ฉันรู้ว่านี่เป็นเพียงข้อเสนอแนะ แต่มีบางอย่างที่ไม่ถูกต้องสำหรับฉันที่เซิร์ฟเวอร์ (# 2) ด้านบนมีโปรเซสเซอร์ 4 ตัวแทนที่จะเป็น 2 และ 8 แกนต่อซีพียูจริงแทนที่จะเป็น 6 จะแนะนำ MAXDOP ที่ 4 กับ 6 สำหรับเซิร์ฟเวอร์ที่มีประสิทธิภาพน้อยกว่า

บทความ kbb ด้านบนแนะนำ 8 สถานการณ์ของฉันด้านบน "สำหรับเซิร์ฟเวอร์ที่เปิดใช้งาน NUMA และเปิดใช้งานไฮเปอร์เธรดค่า MAXDOP ไม่ควรเกินจำนวนตัวประมวลผลทางกายภาพต่อโหนด NUMA"


หากคุณตั้งค่า MAXDOP สูงกว่าจำนวนโหนด cores / numa คุณจะต้องโทรออกไปยังหน่วยความจำไกลซึ่งช้ากว่าการโทรใกล้หน่วยความจำหลาย ๆ ครั้ง นี่เป็นเพราะแต่ละโหนด numa มีหน่วยความจำของตัวเอง การมีเคียวรีใช้เธรดมากกว่าที่มีอยู่ในโหมด numa เดียวจะกระจายโหลด CPU บนหลายคอร์และทำให้โหนดหน่วยความจำหลายโหนด
Max Vernon

ฉันขอแนะนำให้ตั้งค่า MAXDOP เป็นการตั้งค่าที่เหมาะสมสำหรับเซิร์ฟเวอร์ของคุณที่ใช้งานโหลด มีเพียงคุณเท่านั้นที่สามารถกำหนดการตั้งค่าที่ดีที่สุดสำหรับการโหลดเฉพาะของคุณ โพสต์นี้เป็นเพียงแนวทางเท่านั้น
Max Vernon

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 นั่นคือการเปลี่ยนแปลงที่ดีโดยเฉพาะอย่างยิ่ง
Max Vernon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.