Podczas konfigurowania nowego programu SQL Server używam następującego kodu, aby określić dobry punkt wyjścia dla MAXDOP
ustawienia:
/*
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
Zdaję sobie sprawę, że jest to nieco subiektywne i może się różnić w zależności od wielu rzeczy; jednak próbuję stworzyć ciasny fragment kodu, który posłuży jako punkt wyjścia dla nowego serwera.
Czy ktoś ma jakieś dane wejściowe do tego kodu?
sql-server
configuration
maxdop
Max Vernon
źródło
źródło
Odpowiedzi:
Najlepszym sposobem jest skorzystanie z Coreinfo (narzędzie od sysinternals), ponieważ da ci to
Teraz, w oparciu o powyższe informacje, ustawienie Ideal MaxDop należy obliczyć jako
Więc odpowiedź brzmi - „ to zależy ” od twojego procesora, a konfiguracja NUMA i poniższa tabela podsumują to, co wyjaśniłem powyżej:
Edytowano: Poniżej znajduje się szybki i brudny skrypt TSQL do generowania zalecenia dla ustawienia MAXDOP
EDYCJA: Dla przyszłych gości, możesz spojrzeć na testową funkcję dbamaxdop PowerShell (wraz z innymi niezwykle pomocnymi funkcjami DBA (WSZYSTKO ZA DARMO !!).
źródło
test-dbamaxdop
jak wspomniano w mojej odpowiedzi?Podczas ustawiania MAXDOP zwykle chcesz ograniczyć go do liczby rdzeni w węźle NUMA. W ten sposób harmonogramy nie próbują uzyskać dostępu do pamięci między liczbami węzłów.
źródło
Patrząc na post z zespołu MSDN , wymyśliłem sposób, aby wiarygodnie uzyskać fizyczną liczbę rdzeni z maszyny i użyć go do określenia dobrego ustawienia MAXDOP.
Przez „dobry” mam na myśli konserwatystów. To znaczy, moim wymaganiem jest użycie maksymalnie 75% rdzeni w węźle NUMA lub ogólnie maksimum 8 rdzeni.
SQL Server 2016 (13.x) z dodatkiem SP2 i nowszym oraz wszystkie wersje SQL Server 2017 i powyżej zawierają szczegółowe informacje na temat liczby rdzeni fizycznych na gniazdo, liczby gniazd i liczby węzłów NUMA, co pozwala na uporządkowanie sposobu wyznaczania linii bazowej Ustawienie MAXDOP dla nowej instalacji SQL Server.
W przypadku wyżej wymienionych wersji ten kod zaleci konserwatywne ustawienie MAXDOP na poziomie 75% liczby fizycznych rdzeni w węźle NUMA:
W przypadku wersji programu SQL Server wcześniejszych niż SQL Server 2017 lub SQL Server 2016 SP2 nie można uzyskać liczby węzłów liczby rdzeni na liczbę
sys.dm_os_sys_info
. Zamiast tego możemy użyć programu PowerShell do ustalenia liczby fizycznych rdzeni:Można również użyć programu PowerShell do określenia liczby rdzeni logicznych, która prawdopodobnie byłaby dwa razy większa niż liczba rdzeni fizycznych, jeśli HyperThreading jest włączony:
T-SQL:
źródło
SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Zasadniczo należy stosować wyższy DOP dla systemu OLAP i niższy (lub nie) DOP dla systemu OLTP. Wiele systemów znajduje się gdzieś pośrodku, więc znajdź szczęśliwy nośnik, który pozwala sporadycznie dużemu obciążeniu na uzyskanie wystarczającej ilości procesora do szybkiego ukończenia, bez duszenia obciążeń OLTP.
Uważaj także na użycie
cpu_count
kolumny, aby uzyskać liczbę rdzeni. Jeśli włączona jest funkcja hyperthreading, ta kolumna wydaje się odzwierciedlać liczbę ujawnionych procesorów logicznych. Ogólnie rzecz biorąc, nie chcesz, aby DOP był wyższy niż liczba rdzeni fizycznych. Rozłożenie dużego obciążenia równoległego na procesory logiczne po prostu zwiększy narzut bez rzeczywistych korzyści.Jest też
hyperthread_ratio
kolumna, ale nie jestem pewien, co ona reprezentuje. Dokumentacja też nie jest zbyt jasna. Liczba, którą widzę w naszym systemie, sugeruje, że może to być albo liczba fizycznych rdzeni w całym systemie, albo liczba logicznych procesorów na układ. Dokumentacja twierdzi, że powinienem widzieć zupełnie inną postać.źródło
hyperthread_ratio
jest to liczba rdzeni logicznych na procesor. Natknąłem się na to jakiś czas temu i jeśli dobrze pamiętam, do tego doszedłem. Może @AaronBertrand ma na ten temat więcej informacji. Nie bierz tego jednak za twardy i szybki fakt przed weryfikacją.Natknąłem się również na artykuł http://support.microsoft.com/kb/2806535 i nie mogę znaleźć korelacji z powyższymi skryptami.
Zastanawiam się również, dlaczego istnieje rozróżnienie dla „@logicalCPUs> = 8 i @HTEnabled = 1 i @NoofNUMA = 1” oraz „@logicalCPUs> = 8 i @HTEnabled = 1 i @NoofNUMA> 1” w wyniku staje się taki sam.
W końcu napisałem własny fragment kodu pasujący do powyższego artykułu, chociaż nawet tam chciałbym bardziej precyzyjną definicję i / lub różnicę dotyczącą „procesorów”, „procesorów” i „procesorów fizycznych”.
Nie krępuj się.
źródło
hyperthread_ratio
kolumnasys.dm_os_sys_info
jest myląca ... na przykład na mojej stacji roboczej mam na przykład pojedynczy 4-rdzeniowy procesor z włączonym hyperthreadingiem - Menedżer zadań widzi 8 logicznych procesorów, a Twój kod zgłasza stosunek hipertekstu do być 1.Ta wersja daje ładny pojedynczy zestaw wyników z istniejącym ustawieniem MAXDOP i powinna wytrzymać wersje SQL 2008-2017 bez potrzeby używania xp_cmdshell.
źródło
Fajny skrypt, ale artykuł KB: http://support.microsoft.com/kb/2806535 nie jiwuje całkowicie z twoim kodem. czego mi brakuje?
Server 1
HTEnabled: 1
hyperthreading Relation: 12
logical cpus: 24
physical cpus: 2
logical cpus per numa: 12
NoOfNuma: 2
MaxDop powinno być: 6
Server 2
HTEnabled: 2
hyperthreadingRatio: 16
logical cpus: 64
fizyczny cpus: 4
logiczny cpus na liczba: 16
NoOfNuma: 4
Ustawienie MaxDop powinno wynosić: 4
Zdaję sobie sprawę, że to tylko sugestie; ale coś mi się nie wydaje, że serwer (# 2) powyżej z 4 procesorami zamiast 2 i 8 rdzeniami na fizyczny procesor zamiast 6; poleciłby MAXDOP na 4, w porównaniu do 6 dla słabszego serwera.
Powyższy artykuł kbb sugeruje 8 mój scenariusz powyżej. „W przypadku serwerów, które mają skonfigurowaną NUMA i włączoną funkcję Hyperthreading, wartość MAXDOP nie powinna przekraczać liczby fizycznych procesorów na węzeł NUMA.”
źródło
Podczas instalacji SQL Server 2019 CTP 3.0 pojawiła się nowa karta MaxDOP. Rzeczywista wartość jest predefiniowana (w poprzednich wersjach domyślną wartością było 0).
Ustawienie MAXDOP podczas instalacji SQL Server 2019
Źródło obrazu: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png
źródło