Beim Einrichten eines neuen SQL Servers verwende ich den folgenden Code, um einen guten Ausgangspunkt für die MAXDOP
Einstellung zu bestimmen :
/*
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
Mir ist klar, dass dies ein bisschen subjektiv ist und aufgrund vieler Dinge variieren kann. Ich versuche jedoch, einen vollständigen Code zu erstellen, der als Ausgangspunkt für einen neuen Server dient.
Hat jemand eine Eingabe zu diesem Code?
sql-server
configuration
maxdop
Max Vernon
quelle
quelle
Antworten:
Am besten verwenden Sie coreinfo (Dienstprogramm von sysinternals)
Basierend auf den obigen Informationen sollte nun die ideale MaxDop-Einstellung wie folgt berechnet werden
Die Antwort lautet also - " es hängt von Ihrem Prozessor-Footprint ab" und die NUMA-Konfiguration und die folgende Tabelle fassen zusammen, was ich oben erklärt habe:
Bearbeitet: Nachfolgend finden Sie ein schnelles und unsauberes TSQL-Skript zum Generieren der Empfehlung für die MAXDOP-Einstellung
BEARBEITEN: Für zukünftige Besucher können Sie sich die PowerShell-Funktion test-dbamaxdop (zusammen mit anderen äußerst hilfreichen DBA-Funktionen (ALLES KOSTENLOS !!) ansehen .
quelle
test-dbamaxdop
wie in meiner Antwort erwähnt?Wenn Sie MAXDOP einstellen, möchten Sie es normalerweise auf die Anzahl der Kerne in einem NUMA-Knoten beschränken. Auf diese Weise versuchen Zeitpläne nicht, über numa-Knoten auf Speicher zuzugreifen.
quelle
In einem Beitrag des MSDN-Teams habe ich mir eine Möglichkeit ausgedacht, die Anzahl der physischen Kerne eines Computers zuverlässig zu ermitteln und daraus eine gute MAXDOP-Einstellung zu ermitteln.
Mit "gut" meine ich konservativ. Das heißt, meine Anforderung besteht darin, maximal 75% der Kerne in einem NUMA-Knoten oder insgesamt maximal 8 Kerne zu verwenden.
SQL Server 2016 (13.x) SP2 und höher sowie alle Versionen von SQL Server 2017 und höher enthalten Informationen zur Anzahl der physischen Kerne pro Socket, zur Anzahl der Sockets und zur Anzahl der NUMA-Knoten MAXDOP-Einstellung für eine neue SQL Server-Installation.
Für die oben genannten Versionen empfiehlt dieser Code eine konservative MAXDOP-Einstellung von 75% der Anzahl der physischen Kerne in einem NUMA-Knoten:
Für Versionen von SQL Server vor SQL Server 2017 oder SQL Server 2016 SP2 können Sie den Core-Count-Per-Numa-Knoten nicht von beziehen
sys.dm_os_sys_info
. Stattdessen können wir PowerShell verwenden, um die Anzahl der physischen Kerne zu bestimmen:Sie können auch PowerShell verwenden, um die Anzahl der logischen Kerne zu bestimmen. Dies ist wahrscheinlich die doppelte Anzahl der physischen Kerne, wenn HyperThreading aktiviert ist:
Das T-SQL:
quelle
SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Verwenden Sie in der Regel einen höheren DOP für ein OLAP-System und einen niedrigeren (oder keinen) DOP für ein OLTP-System. Viele Systeme befinden sich irgendwo dazwischen. Suchen Sie sich also ein gutes Medium, mit dem bei gelegentlich hoher Auslastung schnell genug CPU zur Verfügung steht, ohne die OLTP-Auslastung zu beeinträchtigen.
Seien Sie auch vorsichtig, wenn Sie die
cpu_count
Spalte verwenden, um eine Kernzählung zu erhalten. Wenn Hyperthreading aktiviert ist, scheint diese Spalte die Anzahl der verfügbaren logischen Prozessoren wiederzugeben. Im Allgemeinen soll der DOP nicht höher sein als die Anzahl der physischen Kerne. Wenn Sie eine hohe parallele Auslastung auf mehrere logische Prozessoren verteilen, erhöht sich der Overhead, ohne dass ein wirklicher Nutzen entsteht.Es gibt auch eine
hyperthread_ratio
Kolumne, aber ich bin mir nicht sicher, was sie darstellt. Die Dokumentation ist auch nicht sehr klar. Die Zahl, die ich auf unserem System sehe, lässt vermuten, dass es sich entweder um die Anzahl der physischen Kerne im gesamten System oder um die Anzahl der logischen Prozessoren pro Chip handelt. Die Dokumentation besagt, dass ich eine völlig andere Figur sehen sollte.quelle
hyperthread_ratio
ist die Anzahl der logischen Kerne pro Prozessor. Ich bin vor einiger Zeit darauf gestoßen, und wenn ich mich richtig erinnere, bin ich zu diesem Schluss gekommen. Vielleicht hat @AaronBertrand mehr Infos dazu. Nehmen Sie das noch nicht als eine feste Tatsache, bevor Sie es bestätigen.Ich bin auch über den Artikel http://support.microsoft.com/kb/2806535 gestolpert und kann die Korrelation zu den obigen Skripten nicht finden.
Ich frage mich auch, warum es als Ergebnis eine Differenzierung für "@logicalCPUs> = 8 und @HTEnabled = 1 und @NoofNUMA = 1" und "@logicalCPUs> = 8 und @HTEnabled = 1 und @NoofNUMA> 1" gibt wird das gleiche.
Schließlich habe ich meinen eigenen Code geschrieben, der zu dem Artikel von oben passt, obwohl ich selbst dort eine genauere Definition und / oder Unterscheidung von "Prozessoren", "CPU" und "physischen Prozessoren" gewünscht hätte.
Fühlen Sie sich frei, Ihren Dreh mit ihm zu haben.
quelle
hyperthread_ratio
Spalte insys.dm_os_sys_info
irreführend ist. Auf meiner Workstation habe ich beispielsweise eine einzelne 4-Core-CPU mit aktiviertem Hyperthreading. Der Task-Manager erkennt 8 logische CPUs und Ihr Code gibt das Hyperthreading-Verhältnis an 1. seinDiese Version bietet eine schöne Einzelergebnismenge mit der vorhandenen MAXDOP-Einstellung und sollte die Versionen SQL 2008-2017 ohne die Verwendung von xp_cmdshell unterstützen.
quelle
Nettes Skript, aber der KB-Artikel: http://support.microsoft.com/kb/2806535 fügt sich nicht vollständig in Ihren Code ein. Was vermisse ich?
Server 1
HTEnabled: 1
HyperthreadingRatio: 12
logischer Prozessor: 24
physischer Prozessor: 2
logischer Prozessor pro Nummer: 12
NoOfNuma: 2
MaxDop-Einstellung sollte sein: 6
Server 2
HTEnabled: 2
HyperthreadingRatio: 16
logischer Prozessor: 64
physischer Prozessor: 4
logischer Prozessor pro Nummer numa: 16
NoOfNuma: 4
MaxDop-Einstellung sollte sein: 4
Mir ist klar, dass dies nur Vorschläge sind. aber etwas scheint mir nicht richtig, dass ein Server (# 2) oben mit 4 Prozessoren anstelle von 2 und 8 Kernen pro physischer CPU anstelle von 6; Ich würde den MAXDOP bei 4 empfehlen, gegenüber 6 für den weniger leistungsfähigen Server.
Der obige kbb-Artikel schlägt mein obiges Szenario vor. "Für Server, auf denen NUMA konfiguriert und Hyperthreading aktiviert ist, sollte der MAXDOP-Wert die Anzahl der physischen Prozessoren pro NUMA-Knoten nicht überschreiten."
quelle
Während der Installation von SQL Server 2019 CTP 3.0 gibt es eine neue Registerkarte MaxDOP. Der tatsächliche Wert ist vordefiniert (in früheren Versionen war der Standardwert 0).
Einstellen von MAXDOP während des Setups von SQL Server 2019
Bildquelle: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png
quelle