SQL सर्वर के लिए MAXDOP सेटिंग एल्गोरिथ्म


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 है ... कई वैज्ञानिक-प्रशंसकों के लिए। पहचान}
yeOldeDataSmythe

42 है, सब के बाद, सब कुछ का जवाब। उदाहरण के लिए इस पोस्ट में 42 हजार विचार हैं।
मैक्स वर्नोन

जवाबों:


49

इसका सबसे अच्छा तरीका है - कोरिनफो (यूटिलिटी द्वारा उपयोगिता) का उपयोग करें क्योंकि यह आपको देगा

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

अब, उपरोक्त जानकारी के आधार पर, आदर्श मैक्सडॉप सेटिंग की गणना की जानी चाहिए

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

संपादित करें: भविष्य के आगंतुकों के लिए, आप परीक्षण-dbamaxdop powerhell फ़ंक्शन ( अन्य अत्यंत उपयोगी DBA फ़ंक्शन (ALL FREE !!) के साथ देख सकते हैं।


मामला जब cpu_count> hyperthread_ratio तो 1 और 0 अंत, क्या आपको यकीन है कि यह सच है? क्योंकि 8 तार्किक प्रोसेसर के मामले में, 8 भौतिक प्रोसेसर और 1 हाइपरथ्रेड_ऑर्ग के रूप में। यह अभी भी कहता है कि हाइपरथ्रेड सक्षम है जिस पर मुझे विश्वास करना मुश्किल है। और उस स्थिति में, आपको MAXDOP 1 के रूप में भी मिलता है जो कि सही नहीं लगता है।
उदित सोलंकी

@UdItSolanki एचटी सक्षम है या नहीं यह निर्धारित करने के लिए Coreinfo का उपयोग करने का सही तरीका है। यह जानने का कोई निश्चित तरीका नहीं है कि क्या HTQL TSQL का उपयोग करके सक्षम है। क्या आपने test-dbamaxdopमेरे उत्तर में बताए अनुसार प्रयास किया?
परिजन शाह

17

MAXDOP सेट करते समय आप आमतौर पर इसे NUMA नोड में कोर की संख्या तक सीमित करना चाहते हैं। इस तरह शेड्यूल मेमोरी को सुमा नोड्स तक पहुँचाने की कोशिश नहीं कर रहा है।


13

MSDN टीम के एक पोस्ट को देखते हुए , मैं एक मशीन से भौतिक कोर काउंट को मज़बूती से प्राप्त करने का एक तरीका लेकर आया हूँ, और एक अच्छा MAXDOP सेटिंग निर्धारित करने के लिए इसका उपयोग करता हूँ।

"अच्छा" से मेरा मतलब है रूढ़िवादी। अर्थात्, मेरी आवश्यकता एक NUMA नोड में अधिकतम 75% कोर का उपयोग करना है, या कुल 8 कोर की अधिकतम है।

SQL सर्वर 2016 (13.x) SP2 और इसके बाद के संस्करण, और SQL सर्वर 2017 और ऊपर के सभी संस्करणों के भौतिक विवरणों के बारे में प्रति सॉकेट, सॉकेट काउंट और NUMA नोड्स की संख्या के बारे में विवरण, आधार रेखा निर्धारित करने के लिए एक सुव्यवस्थित तरीके से अनुमति देता है एक नए SQL सर्वर इंस्टॉलेशन के लिए 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 सर्वर 2017 या SQL Server 2016 SP2 से पहले SQL सर्वर के संस्करणों के लिए, आप से कोर-काउंट-प्रति-अंक-नोड प्राप्त नहीं कर सकते sys.dm_os_sys_info। इसके बजाय, हम भौतिक कोर गणना निर्धारित करने के लिए PowerShell का उपयोग कर सकते हैं:

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

तार्किक कोर की संख्या निर्धारित करने के लिए एक भी PowerShell का उपयोग कर सकता है, जो संभवतः हाइपरथ्रेडिंग चालू होने पर भौतिक कोर की संख्या से दोगुना होगा:

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

टी-एसक्यूएल:

/* 
   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 बढ़े हुए, तार्किक प्रोसेसर = 4 प्रति कोर 20। कोई विचार क्यों?
BeginnerDBA

@BeginnerDBA - SQL सर्वर के किस संस्करण का आप उपयोग कर रहे हैं?
मैक्स वर्नोन

इसका SQL सर्वर 2012 और केस के लिए समान है जब मैंने SQL2014 के साथ
BeginnerDBA

क्या VM में SQL सर्वर चल रहा है? ऐसा लगता है कि प्रति अंक मूल संख्या 1 है - शायद VM को अजीब तरीके से कॉन्फ़िगर किया गया है? आप इसे डीबगिंग उद्देश्यों के लिए स्क्रिप्ट के अंत में जोड़ सकते हैं: SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
मैक्स वर्नोन

धन्यवाद। नहीं, इसके एक भौतिक सर्वर, मुझे उस के रूप में अच्छी तरह से जोड़ने की कोशिश करते हैं
शुरुआत

11

एक सामान्य नियम के रूप में, OLAP सिस्टम के लिए उच्च DOP का उपयोग करें, और OLTP सिस्टम के लिए कम (या नहीं) DOP का उपयोग करें। कई प्रणालियाँ कहीं बीच में हैं, इसलिए एक खुशहाल माध्यम ढूंढें जो सामयिक बड़े कार्यभार को आपके ओएलटीपी वर्कलोड का गला घोंटने के बिना पर्याप्त सीपीयू को जल्दी से पूरा करने की अनुमति देता है।

इसके अलावा, cpu_countकोर गणना प्राप्त करने के लिए कॉलम का उपयोग करने के बारे में सावधान रहें । यदि हाइपरथ्रेडिंग सक्षम है, तो यह कॉलम उजागर किए गए तार्किक प्रोसेसर की संख्या को दर्शाता है। सामान्यतया, आप नहीं चाहते हैं कि डीओपी भौतिक कोर की संख्या से अधिक हो। तार्किक प्रोसेसर के पार एक भारी समानांतर कार्यभार फैलाने से सिर्फ असली लाभ के साथ ओवरहेड बढ़ेगा।

एक 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" और @HoNNNAA> 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 कोर को छोड़ देगा।
मैक्स वर्नोन

हाइपरथ्रेड_प्रत्यय वास्तव में एक मुद्दा है, हालांकि इसे बेहतर तरीके से हल नहीं किया जा सकता है - कम से कम मेरी जानकारी के लिए नहीं। इस ब्लॉग को कुछ और विवरणों के लिए देखें: sqlblog.com/blogs/kalen_delaney/archive/2007/12/08/… और अपनी दूसरी पोस्ट के बारे में - मुझे यह जानकर अच्छा लगेगा कि, "आपने जिस पदवी की अधिकतम डिग्री को चुना है, उसका क्या मूल्य है?" आपकी मशीन के लिए। :-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
हाइपरथ्रेडिंग अनुपात: 12
तार्किक cpus: 24
भौतिक cpus: 2
तार्किक cpus प्रति अंक: 12
NoOfNuma: 2
MaxDop सेटिंग होनी चाहिए: 6

सर्वर 2
HTEnabled: 2
हाइपरथ्रेडिंग अनुपात : 16
तार्किक cpus: 64 तार्किक cpus
: 4
तार्किक cpus
numa : 16 NoOfNuma: 4
MaxDop सेटिंग होनी चाहिए: 4

मुझे लगता है कि ये सिर्फ सुझाव हैं; लेकिन कुछ मुझे सही नहीं लगता है कि एक सर्वर (# 2) 2 के बजाय 4 प्रोसेसर के साथ, और 6 के बजाय 8 सीपीयू प्रति भौतिक सीपीयू; कम शक्तिशाली सर्वर के लिए अधिकतम 4 से अधिकतम 6 की सिफारिश करेगा।

ऊपर दिए गए kbb लेख से मेरे 8 परिदृश्य का पता चलता है। "उन सर्वरों के लिए जिनके पास NUMA कॉन्फ़िगर और हाइपरथ्रेडिंग सक्षम है, MAXDOP मान प्रति NUM नोड के भौतिक प्रोसेसर की संख्या से अधिक नहीं होना चाहिए।"


यदि आप कोर / संख्या नोड से अधिक MAXDOP सेट करते हैं, तो आप दूर की मेमोरी में कॉल के साथ समाप्त हो जाते हैं जो मेमोरी के पास कॉल करने की तुलना में कई गुना धीमी हैं। ऐसा इसलिए है क्योंकि प्रत्येक सुमा नोड की अपनी स्मृति है; क्वेरी का उपयोग करने से अधिक थ्रेड्स एक ही सुमा मोड में मौजूद होते हैं जो सीपीयू लोड को कई कोर पर फैलाएंगे, और इसलिए कई मेमोरी नोड्स।
मैक्स वर्नन 16

मैं MAXDOP को एक ऐसी सेटिंग पर सेट करने की सलाह देता हूं जो आपके सर्वर के लिए आपके लोड को चलाने के लिए समझ में आता है। केवल आप अपने विशेष भार के लिए सबसे अच्छी सेटिंग निर्धारित कर सकते हैं; यह पोस्ट केवल एक दिशानिर्देश है।
मैक्स वेरनॉन

2

SQL Server 2019 CTP 3.0 की स्थापना के दौरान एक नया टैब MaxDOP है। वास्तविक मूल्य पूर्वनिर्धारित है (पिछले संस्करणों में डिफ़ॉल्ट 0 था)।

SQL सर्वर 2019 सेटअप के दौरान MAXDOP सेट करना

यहाँ छवि विवरण दर्ज करें

छवि स्रोत: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png


हाँ, 2019 में सुविधाओं से प्यार करें। यह एक विशेष रूप से अच्छा बदलाव है।
मैक्स वर्नोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.