এসএকিউএল সার্ভারের জন্য ম্যাক্সডোপ সেটিং অ্যালগরিদম


67

নতুন এসকিউএল সার্ভার স্থাপন করার সময়, আমি নীচের কোডটি 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 এটি সীমাহীনতে সেট করে। এবং যখন আপনি সেখানে ম্যাক্সডপ স্থাপন করছেন, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি প্যারালালিজম (ওরফে, সিটিএফপি) এর জন্য প্রান্তিকতার জন্য প্রান্তিককরণের পরিমাণ 40 এবং 75 এর মধ্যে কিছুতে সামঞ্জস্য করার বিষয়ে বিবেচনা করুন { recognize
ইওলডেডাটা স্মিমে জানুন

42 সর্বোপরি, সমস্ত কিছুর উত্তর। উদাহরণস্বরূপ, এই পোস্টে 42 হাজার বার দেখা হয়েছে।
ম্যাক্স ভার্নন

উত্তর:


49

করার সর্বোত্তম উপায় হ'ল কোরিনফো (সিসিনটার্নাল দ্বারা ইউটিলিটি) হিসাবে এটি আপনাকে দেবে use

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.

সম্পাদিত: ম্যাক্সডপ সেটিংয়ের জন্য প্রস্তাবনা তৈরি করার জন্য নীচে একটি দ্রুত এবং নোংরা টিএসকিউএল স্ক্রিপ্ট রয়েছে

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

সম্পাদনা: ভবিষ্যতের দর্শনার্থীদের জন্য, আপনি পরীক্ষা-ডাবাম্যাক্সডপ পাওয়ারশেল ফাংশনটি দেখতে পারেন ( অন্যান্য অত্যন্ত সহায়ক ডিবিএ ফাংশন সহ (সমস্ত নিখরচায় !!))।


কেসিপু_কাউন্ট> হাইপারথ্রেড_রেটিও এর পরে অন্য 1 টি শেষ হলে আপনি কি নিশ্চিত যে এটি সত্য? কারণ 8 লজিকাল প্রসেসরের ক্ষেত্রে 8 টি ফিজিক্যাল প্রসেসর এবং 1 হিসাবে হাইপারথ্রেড_রেটিও রয়েছে। এটি এখনও বলে হাইপারথ্রেড সক্ষম হয়েছে যা বিশ্বাস করা আমার পক্ষে কঠিন। এবং সেক্ষেত্রে আপনি ম্যাক্সডপও 1 হিসাবে পাবেন যা সত্য বলে মনে হয় না।
উদিত সোলঙ্কি

@ উডিটসোলানকি সঠিক উপায় হ'ল এইচটি সক্ষম আছে কিনা তা নির্ধারণ করার জন্য কোরিণফো ব্যবহার করা। টিএসকিউএল ব্যবহার করে এইচটি সক্ষম করা হয়েছে কিনা তা জানার কোনও সঠিক উপায় নেই। আপনি test-dbamaxdopআমার উত্তরে উল্লিখিত হিসাবে চেষ্টা করেছেন?
কিন শাহ

17

ম্যাক্সডপ সেট করার সময় আপনি সাধারণত এটি একটি NUMA নোডের কোর সংখ্যায় সীমাবদ্ধ করতে চান। সেভাবে সময়সূচিগুলি নুমা নোড জুড়ে মেমরি অ্যাক্সেস করার চেষ্টা করছে না।


13

এমএসডিএন টিমের একটি পোস্টের দিকে তাকিয়ে , আমি কোনও যন্ত্র থেকে নির্ভরযোগ্যভাবে শারীরিক কোর গণনা পাওয়ার একটি উপায় নিয়ে এসেছি এবং এটি একটি ভাল ম্যাক্সডপ সেটিংস নির্ধারণ করার জন্য ব্যবহার করেছি।

"ভাল" দ্বারা, আমি রক্ষণশীল বলতে চাইছি। এটি হ'ল, আমার আবশ্যকতাটি হ'ল একটি NUMA নোডে সর্বাধিক 75% কোর বা মোট সর্বোচ্চ 8 টি কোর ব্যবহার করা।

এসকিউএল সার্ভার 2016 (13.x) এসপি 2 এবং এর উপরে এবং এসকিউএল সার্ভার 2017 এর সমস্ত সংস্করণ এবং সকেট প্রতি শারীরিক মূল গণনা, সকেট গণনা এবং NUMA নোডের সংখ্যা সম্পর্কে পৃষ্ঠতল বিশদ বিবরণ, বেসলাইনটি নির্ধারণ করার জন্য একটি সুপরিচিত উপায় নতুন এসকিউএল সার্ভার ইনস্টলেশনের জন্য ম্যাক্সডপ সেটিংস।

উপরে বর্ণিত সংস্করণগুলির জন্য, এই কোডটি একটি 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;';

এসকিউএল সার্ভার 2017 বা এসকিউএল সার্ভার 2016 এসপি 2 এর পূর্বে এসকিউএল সার্ভারের সংস্করণগুলির জন্য, আপনি প্রতি-নুমা-নোড থেকে মূল-গণনা পেতে পারবেন না sys.dm_os_sys_info। পরিবর্তে, আমরা শারীরিক কোর গণনা নির্ধারণের জন্য পাওয়ারশেল ব্যবহার করতে পারি:

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

লজিক্যাল কোরগুলির সংখ্যা নির্ধারণ করতে কেউ পাওয়ারশেল ব্যবহার করতে পারে, যা হাইপারথ্রেডিং চালু থাকলে শারীরিক কোরের সংখ্যার দ্বিগুণ হতে পারে:

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 টি এসএএ নোড, এইচটি এনবিলেড, লজিকাল প্রসেসর = 20 প্রতি 4 কোরে বিশ্বাস করা শক্ত। কোন ধারণা কেন?
শিক্ষানবিস

@ বিগেনারডিবিএ - আপনি এসকিউএল সার্ভারের কোন সংস্করণ ব্যবহার করছেন?
ম্যাক্স ভার্নন

তার SQL সার্ভার 2012 এবং কেস যখন আমি SQL2014 পাশাপাশি পরীক্ষিত জন্য অনুরূপ
BeginnerDBA

এসকিউএল সার্ভারটি কি কোনও ভিএম-তে চলছে? দেখে মনে হচ্ছে যে প্রতি নুমা নোডের মূল গণনাটি 1 - সম্ভবত ভিএমটি অদ্ভুতভাবে কনফিগার করা আছে? আপনি এটি ডিবাগিং উদ্দেশ্যে স্ক্রিপ্টের শেষে যুক্ত করতে পারেন: SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
ম্যাক্স ভার্নন

ধন্যবাদ। নাহ, এটি একটি শারীরিক সার্ভার, আমাকেও এটি যুক্ত করার চেষ্টা করুন
শিক্ষাগত

11

সাধারণ নিয়ম হিসাবে, ওএলএপি সিস্টেমের জন্য উচ্চতর ডিওপি এবং ওএলটিপি সিস্টেমের জন্য নিম্ন (বা না) ডিওপি ব্যবহার করুন। অনেকগুলি সিস্টেমে কোথাও কোথাও না কোথাও রয়েছে, তাই একটি খুশির মাধ্যম সন্ধান করুন যা মাঝেমধ্যে বড় কাজের চাপ আপনার ওলটিপি কাজের চাপকে শ্বাসরোধ না করে দ্রুত সিপিইউ সম্পূর্ণ করার অনুমতি দেয়।

এছাড়াও, cpu_countএকটি মূল গণনা পেতে কলামটি ব্যবহার সম্পর্কে সতর্কতা অবলম্বন করুন । হাইপারথ্রেডিং সক্ষম করা থাকলে, এই কলামটি বহিরাগত লজিকাল প্রসেসরের সংখ্যা প্রতিফলিত করে বলে মনে হচ্ছে। সাধারণভাবে বলতে গেলে, আপনি চান না যে শারীরিক কোরের সংখ্যার চেয়ে ডিওপি বেশি হয়। লজিকাল প্রসেসরগুলিতে ভারী সমান্তরাল কাজের বোঝা ছড়িয়ে দেওয়া কোনও আসল সুবিধা ছাড়াই ওভারহেড বাড়িয়ে তুলবে।

এখানে একটি hyperthread_ratioকলামও রয়েছে তবে এটি কী প্রতিনিধিত্ব করে তা আমি নিশ্চিত নই। ডকুমেন্টেশন খুব পরিষ্কার হয় না। আমাদের সিস্টেমে আমি যে সংখ্যাটি দেখছি তা বোঝায় যে এটি হয় পুরো সিস্টেমে শারীরিক কোরের সংখ্যা বা চিপ প্রতি লজিকাল প্রসেসরের সংখ্যা হতে পারে। ডকুমেন্টেশন দাবি করে যে আমার পুরোপুরি একটি আলাদা চিত্র দেখা উচিত।


1
আমি বিশ্বাস করি এটি hyperthread_ratioহ'ল প্রসেসরের প্রতি লজিক্যাল কোরগুলির পরিমাণ। আমি কিছুক্ষণ আগে দৌড়ে এসেছি এবং যদি আমি সঠিকভাবে মনে করি তবে এটিই আমি পৌঁছলাম। সম্ভবত @ অ্যারোনবার্ট্র্যান্ডের আরও তথ্য আছে। যাচাইকরণের আগে এটিকে এখনও শক্ত এবং দ্রুত সত্য হিসাবে গ্রহণ করবেন না।
টমাস স্ট্রিংগার

@ থমাসস্ট্রিঞ্জার ডকুমেন্টেশনে বলা হয়েছে যে, এবং এটি একাধিক মেশিনে চালানো থেকে এটি দেখতে দেখতে এটিই পছন্দ করে। তবে হাইপারথ্রেডিং আসলে সক্ষমিত কিনা তা সেই কলামটি থেকে বলা বেশ কঠিন। উদাহরণস্বরূপ, আমার একটি সার্ভারে এটি 8 টির প্রতিবেদন করে - সার্ভারের 2 টি ফিজিকাল সিপিইউ রয়েছে, প্রতিটি সিপিইউতে 4 টি কোরের সাথে হাইপারথ্রেডিং সক্ষম করা রয়েছে। হাইপারথ্রেডিং ছাড়াই মেশিনগুলিতে একই পরিস্থিতিতে 4 টি প্রতিবেদন করে তবে রিবুট না করে (এবং হাইপারথ্রেডিং বন্ধ করে দেওয়া) আপনি কখনই সেই পরিবর্তনটি দেখতে পাবেন না!
ম্যাক্স ভার্নন

7

আমি http://support.mic Microsoft.com/kb/2806535 নিবন্ধটি সম্পর্কেও হোঁচট খেয়েছি এবং উপরের স্ক্রিপ্টগুলির সাথে সম্পর্ক খুঁজে পাচ্ছি না।

এছাড়াও আমি ভাবছি, ফলাফল হিসাবে কেন "@ লজিকালসিপিইউস> = 8 এবং @ এইচটিইএনএবলড = 1 এবং @ নূনুমা = 1" এবং "@ লোগালসিপিইউস> = 8 এবং @ এইচটিইএনএবলড = 1 এবং @ নুফনুমা> 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 টি কোর উপলব্ধ রাখবে।
ম্যাক্স ভার্নন

হাইপারথ্রেড_রেটিও আসলে একটি সমস্যা, যদিও এর থেকে আরও ভাল সমাধান করা যায় না - অন্তত আমার জ্ঞানের কাছে নয়। আরও বিস্তারিত তথ্যের জন্য এই ব্লগটি দেখুন: sqlblog.com/blogs/kalen_delaney/archive/2007/12/08/… এবং আপনার দ্বিতীয় পোস্ট সম্পর্কে - আমি জেনে খুশি হব, আপনি যে "প্যারালিজমের সর্বোচ্চ ডিগ্রি" বেছে নিয়েছেন তার জন্য কোন মান? আপনার যন্ত্রের জন্য :-D এছাড়াও আমি এই বিষয়টিতে বেশ নতুন - কেবল এই কারণেই আমি হোঁচট খেয়েছি কারণ আমি আগে জানতাম না এবং এই তথ্যের প্রয়োজন ছিল। সুতরাং আপনার উপসংহারটি কী হবে, 2 টি কোর এখনও একটি ভাল জিনিস উপলব্ধ বা খারাপ?
ডেনিস শীতকাল

4

এই সংস্করণটি আপনাকে বিদ্যমান ম্যাক্সডপ সেটিং সহ একটি দুর্দান্ত একক ফলাফল দেয় এবং এক্সপি_সিএমডিএসহেল ব্যবহার ছাড়াই এসকিউএল ২০০৮-২০১ versions সংস্করণগুলিকে ধরে রাখা উচিত।

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

দুর্দান্ত স্ক্রিপ্ট, তবে কেবি নিবন্ধ: http://support.microsoft.com/kb/2806535 আপনার কোড সহ পুরোপুরি প্রাণবন্ত নয়। আমি কী মিস করছি?

সার্ভার 1
HTEnabled: 1
hyperthreadingRatio: 12
লজিক্যাল সিপিইউ: 24
শারীরিক সিপিইউ: 2
12: NUMA প্রতি লজিক্যাল সিপিইউ
NoOfNuma: 2
MaxDop সেটিং হওয়া উচিত: 6

সার্ভার 2
HTEnabled: 2
hyperthreadingRatio: 16
লজিক্যাল সিপিইউ: 64
শারীরিক সিপিইউ: 4
প্রতি লজিক্যাল সিপিইউ
নুমা : 16 নং অফনুমা: 4
ম্যাক্সডপ সেটিংটি হওয়া উচিত: 4

আমি বুঝতে পারি এগুলি কেবল পরামর্শ; তবে কিছু আমার কাছে ঠিক বলে মনে হচ্ছে না যে উপরে একটি সার্ভার (# 2) 2 এর পরিবর্তে 4 টি প্রসেসর এবং 6 এর পরিবর্তে 8 টি প্রসেসর সহ ফিজিকাল সিপিইউ; কম শক্তিশালী সার্ভারের জন্য 6, বনাম 6 এ MAXDOP এ সুপারিশ করবে।

উপরের কেবিবি নিবন্ধটি উপরে আমার 8 টি দৃশ্যের পরামর্শ দেয়। "NUMA কনফিগার করা এবং হাইপারথ্রেডিং সক্ষম করা সার্ভারগুলির জন্য, MAXDOP মানটি NUMA নোডের প্রতি শারীরিক প্রসেসরের সংখ্যার বেশি হওয়া উচিত নয়" "


আপনি যদি কর / নুমা নোডের সংখ্যার চেয়ে ম্যাক্সডপ উচ্চতর সেট করেন তবে আপনি কল মেমরির কাছে পৌঁছে যা মেমোরির কাছে কল করার চেয়ে অনেকগুণ ধীর। এটি কারণ প্রতিটি নুমা নোডের নিজস্ব স্মৃতি থাকে; একক নুমা মোডে উপস্থিত থাকা অপেক্ষা আরও বেশি থ্রেড ব্যবহার করা সিপিইউ লোডকে একাধিক কোরের উপরে ছড়িয়ে দেবে, এবং একাধিক মেমরি নোডের জন্য।
ম্যাক্স ভার্নন

আমি ম্যাক্সডপকে এমন একটি সেটিংয়ে সেট করার পরামর্শ দিচ্ছি যা আপনার সার্ভারকে বোঝা চালিয়ে বোঝায়। কেবলমাত্র আপনিই আপনার নির্দিষ্ট লোডের জন্য সেরা সেটিংস নির্ধারণ করতে পারেন; এই পোস্টটি শুধুমাত্র একটি গাইডলাইন।
ম্যাক্স ভার্নন

2

এসকিউএল সার্ভার 2019 সিটিপি 3.0 স্থাপনের সময় একটি নতুন ট্যাব রয়েছে ম্যাক্সডপ OP আসল মান পূর্বনির্ধারিত (পূর্ববর্তী সংস্করণগুলিতে ডিফল্ট 0 ছিল)।

এসকিউএল সার্ভার 2019 সেটআপের সময় ম্যাক্সডপ সেট করা হচ্ছে

এখানে চিত্র বর্ণনা লিখুন

চিত্রের উত্স: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png


হ্যাঁ, 2019 এর বৈশিষ্ট্যগুলি পছন্দ করুন That's এটি একটি বিশেষ পরিবর্তন।
ম্যাক্স ভার্নন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.