Thuật toán cài đặt MAXDOP cho SQL Server


67

Khi thiết lập Máy chủ SQL mới, tôi sử dụng đoạn mã sau để xác định điểm khởi đầu tốt cho MAXDOPcài đặt:

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

Tôi nhận ra điều này là một chút chủ quan, và có thể thay đổi dựa trên nhiều thứ; tuy nhiên tôi đang cố gắng tạo ra một đoạn mã chặt chẽ để sử dụng làm điểm khởi đầu cho một máy chủ mới.

Có ai có bất kỳ đầu vào trên mã này?


1
Đề xuất của tôi cho mặc định với 4 bộ xử lý là 2. 0 đặt nó thành không giới hạn. Và trong khi bạn đang cài đặt MAXDOP, tôi khuyên bạn nên cân nhắc điều chỉnh Ngưỡng chi phí cho Song song (hay còn gọi là CTFP) thành thứ gì đó trong khoảng từ 40 đến 75. {Cài đặt ban đầu yêu thích của tôi là 42 ... vì nhiều lý do người hâm mộ Sci-Fi sẽ nhận ra}
yeOldeDataSmythe

42 là, sau tất cả, câu trả lời cho tất cả mọi thứ. Bài đăng này có 42 nghìn lượt xem, ví dụ.
Max Vernon

Câu trả lời:


49

Cách tốt nhất để làm là - sử dụng coreinfo (tiện ích của sysiternals) vì điều này sẽ cung cấp cho bạn

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

Bây giờ, dựa trên thông tin trên, cài đặt Lý tưởng MaxDop phải được tính như

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.

Vì vậy, câu trả lời là - " nó phụ thuộc " vào dấu chân bộ xử lý của bạn và cấu hình NUMA và bảng bên dưới sẽ tóm tắt những gì tôi đã giải thích ở trên:

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.

Đã chỉnh sửa: Dưới đây là tập lệnh TSQL nhanh và bẩn để tạo Đề xuất cho cài đặt 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

EDIT: Đối với khách truy cập trong tương lai, bạn có thể xem chức năng powershell test-dbamaxdop (cùng với các chức năng DBA cực kỳ hữu ích khác (TẤT CẢ MIỄN PHÍ !!).


trường hợp khi cpu_count> hyperthread_ratio sau đó 1 kết thúc 0 khác, bạn có chắc điều này là đúng không? bởi vì trong trường hợp 8 bộ xử lý logic, 8 bộ xử lý vật lý và 1 là hyperthread_ratio. nó vẫn nói hyperthread được kích hoạt mà tôi thấy khó tin. Và trong trường hợp đó, bạn cũng nhận được MAXDOP là 1, điều này cũng không đúng.
UdIt Solanki

@UdItSolanki Cách chính xác là sử dụng coreinfo để xác định xem HT có được bật hay không. Không có cách nào dứt khoát để biết HT có được bật bằng TSQL không. Bạn đã thử test-dbamaxdopnhư đã đề cập trong câu trả lời của tôi?
Kin Shah

17

Khi đặt MAXDOP, bạn thường muốn giới hạn số lượng lõi trong một nút NUMA. Bằng cách đó, lịch trình không cố gắng truy cập bộ nhớ qua các nút numa.


13

Nhìn vào một bài đăng từ nhóm MSDN , tôi đã nghĩ ra một cách đáng tin cậy để lấy số lượng lõi vật lý từ một máy và sử dụng nó để xác định cài đặt MAXDOP tốt.

"Tốt", ý tôi là bảo thủ. Đó là, yêu cầu của tôi là sử dụng tối đa 75% số lõi trong một nút NUMA hoặc tối đa là 8 lõi.

SQL Server 2016 (13.x) SP2 trở lên và tất cả các phiên bản SQL Server 2017 trở lên chi tiết về số lượng lõi vật lý trên mỗi ổ cắm, số lượng ổ cắm và số nút NUMA, cho phép cách xác định đường cơ sở gọn gàng Cài đặt MAXDOP cho cài đặt SQL Server mới.

Đối với các phiên bản được đề cập ở trên, mã này sẽ đề xuất cài đặt MAXDOP bảo thủ với 75% số lượng lõi vật lý trong một nút 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;';

Đối với các phiên bản SQL Server trước SQL Server 2017 hoặc SQL Server 2016 SP2, bạn không thể lấy nút lõi-Count-per-numa từ sys.dm_os_sys_info. Thay vào đó, chúng ta có thể sử dụng PowerShell để xác định số lượng lõi vật lý:

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

Người ta cũng có thể sử dụng PowerShell để xác định số lượng lõi logic, có thể sẽ gấp đôi số lượng lõi vật lý nếu HyperThreading được bật:

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

Tôi đã chạy tập lệnh và nó khuyến nghị tôi MAXDOP = 0. khó tin cho nút 4 NUMA, HT enbaled, bộ xử lý logic = 20 trên 4 lõi. Bất cứ ý tưởng tại sao?
Sơ cấpDBA

@BeginnerDBA - bạn đang sử dụng phiên bản SQL Server nào?
Max Vernon

máy chủ SQL của nó năm 2012 và tương tự như đối với trường hợp khi tôi thử nghiệm trên SQL2014 cũng
BeginnerDBA

SQL Server có chạy trong VM không? Có vẻ như số lõi trên mỗi nút numa là 1 - có lẽ VM được cấu hình kỳ lạ? Bạn có thể thêm phần này vào cuối tập lệnh cho mục đích gỡ lỗi: SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Max Vernon

cảm ơn. Không, đó là một máy chủ vật lý, hãy để tôi thử thêm nó
Người mới bắt đầu

11

Theo nguyên tắc chung, sử dụng DOP cao hơn cho hệ thống OLAP và DOP thấp hơn (hoặc không) cho hệ thống OLTP. Nhiều hệ thống nằm ở đâu đó ở giữa, vì vậy hãy tìm một phương tiện hạnh phúc cho phép khối lượng công việc lớn thỉnh thoảng có đủ CPU để hoàn thành nhanh chóng, mà không bóp nghẹt khối lượng công việc OLTP của bạn.

Ngoài ra, hãy cẩn thận về việc sử dụng cpu_countcột để có được số lượng cốt lõi. Nếu siêu phân luồng được bật, cột này dường như phản ánh số lượng bộ xử lý logic được hiển thị. Nói chung, bạn không muốn DOP cao hơn số lượng lõi vật lý. Truyền tải một khối lượng công việc song song nặng nề trên các bộ xử lý logic sẽ chỉ tăng chi phí mà không có lợi ích thực sự.

Cũng có một hyperthread_ratiocột, nhưng tôi không chắc nó đại diện cho cái gì. Các tài liệu cũng không rõ ràng. Số lượng tôi thấy trên hệ thống của chúng tôi cho thấy nó có thể là số lõi vật lý trong toàn bộ hệ thống hoặc số lượng bộ xử lý logic trên mỗi chip. Các tài liệu tuyên bố tôi sẽ được nhìn thấy một con số hoàn toàn khác.


1
Tôi tin rằng hyperthread_ratiosố lượng lõi logic trên mỗi bộ xử lý. Tôi đã gặp lại điều đó một lúc và nếu tôi nhớ chính xác thì đó là kết luận mà tôi đã đưa ra. Có lẽ @AaronBertrand có thêm thông tin về điều đó. Đừng coi đó là một thực tế khó khăn và nhanh chóng trước khi xác minh.
Thomas Stringer

@ThomasStringer tài liệu nói rằng, và từ việc chạy nó trên nhiều máy, đó là giao diện của nó. Tuy nhiên, thật khó để nói từ cột đó liệu siêu phân luồng có thực sự được kích hoạt hay không. Chẳng hạn, trên một trong các máy chủ của tôi, nó báo cáo 8 - máy chủ có 2 CPU vật lý, với 4 lõi trên mỗi CPU, với chức năng siêu phân luồng được kích hoạt. Trên các máy không siêu phân luồng, nó báo cáo 4 trong cùng một trường hợp, nhưng không khởi động lại (và tắt siêu phân luồng), bạn sẽ không bao giờ thấy sự thay đổi đó!
Max Vernon

7

Tôi cũng đã vấp ngã về bài viết http://support.microsoft.com/kb/2806535 và không thể tìm thấy mối tương quan với các tập lệnh ở trên.

Ngoài ra, tôi tự hỏi, tại sao lại tồn tại sự khác biệt cho "@logicalCPUs> = 8 và @HTEnables = 1 và @NoustNUMA = 1" và "@logicalCPUs> = 8 và @HTEnables = 1 và @NoustNUMA> 1" là kết quả trở nên giống nhau

Sau tất cả, tôi đã kết thúc việc viết đoạn mã của riêng mình phù hợp với bài viết từ phía trên, mặc dù ở đó tôi sẽ thích một định nghĩa và / hoặc sự khác biệt chính xác hơn về "bộ xử lý" "CPU" và "bộ xử lý vật lý".

Hãy thoải mái để có spin của bạn với nó.

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

Đoạn mã đẹp. Tôi không chắc liệu bạn có nhận ra hyperthread_ratiocột trong đó sys.dm_os_sys_infolà sai lệch không ... trên máy trạm của tôi, chẳng hạn, tôi có một CPU 4 lõi duy nhất được kích hoạt siêu phân luồng - Trình quản lý tác vụ nhìn thấy 8 CPU logic và mã của bạn báo cáo tỷ lệ siêu phân luồng thành được 1.
Max Vernon

Là một FYI, mã của tôi đưa ra khuyến nghị 6 cho máy này, sẽ có 2 lõi khả dụng ngay cả trong các truy vấn song song căng thẳng nhất.
Max Vernon

Hyperthread_ratio thực sự là một vấn đề, mặc dù không thể giải quyết tốt hơn - ít nhất là theo hiểu biết của tôi. Xem Blog này để biết thêm một số chi tiết: sqlblog.com/blogs/kalen_delaney/archive/2007/12/08/... Và về bài thứ hai của bạn - tôi sẽ được tốt đẹp để biết, mà giá trị cho "độ tối đa của parallism" mà bạn đã chọn cho máy của bạn. :-D Ngoài ra tôi khá mới trong chủ đề này - chỉ vấp phải điều này chỉ vì tôi không biết trước đây và cần thông tin này. Vì vậy, kết luận của bạn là gì, 2 lõi vẫn có sẵn là điều tốt hay xấu?
Dennis Winter

4

Phiên bản này cung cấp cho bạn một tập kết quả duy nhất với cài đặt MAXDOP hiện có và sẽ giữ các phiên bản SQL 2008-2017 mà không cần sử dụng 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

Kịch bản hay, nhưng bài viết kb: http://support.microsoft.com/kb/2806535 hoàn toàn không có ý nghĩa với mã của bạn. Tôi đang thiếu gì?

Server 1
HTEnabled: 1
hyperthreadingRatio: 12
cpu hợp lý: 24
cpu vật lý: 2
cpu logic mỗi NUMA: 12
NoOfNuma: 2
thiết lập MaxDop nên là: 6

máy chủ 2
HTEnabled: 2
hyperthreadingRatio: 16
cpu hợp lý: 64
cpu vật lý: 4
cpu logic mỗi numa: 16
NoOfNuma: 4
Cài đặt MaxDop phải là: 4

Tôi nhận ra đây chỉ là những gợi ý; nhưng một cái gì đó dường như không đúng với tôi rằng một máy chủ (# 2) ở trên với 4 bộ xử lý thay vì 2 và 8 lõi cho mỗi CPU vật lý thay vì 6; sẽ đề xuất MAXDOP ở mức 4, so với 6 cho máy chủ ít mạnh hơn.

Bài viết kbb ở trên gợi ý 8 kịch bản của tôi ở trên. "Đối với các máy chủ đã bật cấu hình NUMA và siêu phân luồng, giá trị MAXDOP không được vượt quá số lượng bộ xử lý vật lý trên mỗi nút NUMA."


Nếu bạn đặt MAXDOP cao hơn số lượng nút lõi / numa, bạn sẽ kết thúc các cuộc gọi vào bộ nhớ xa, chậm hơn nhiều lần so với gọi gần bộ nhớ. Điều này là do mỗi nút numa có bộ nhớ riêng; có một truy vấn sử dụng nhiều luồng hơn mức có trong một chế độ numa duy nhất sẽ trải tải CPU trên nhiều lõi và do đó nhiều nút bộ nhớ.
Max Vernon

Tôi khuyên bạn nên đặt MAXDOP thành cài đặt hợp lý cho máy chủ của bạn đang chạy tải. Chỉ bạn mới có thể xác định cài đặt tốt nhất cho tải cụ thể của mình; bài này chỉ là một hướng dẫn.
Max Vernon

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.