Lors de la configuration d'un nouveau serveur SQL, j'utilise le code suivant pour déterminer un bon point de départ pour le MAXDOP
paramètre:
/*
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
Je réalise que ceci est un peu subjectif et peut varier en fonction de nombreux facteurs. Cependant, j'essaie de créer un code fourre-tout à utiliser comme point de départ pour un nouveau serveur.
Quelqu'un at-il une entrée sur ce code?
sql-server
configuration
maxdop
Max Vernon
la source
la source
Réponses:
La meilleure façon de le faire est de - utiliser coreinfo (utilitaire de sysinternals) car cela vous donnera
Maintenant, en fonction des informations ci-dessus, le paramètre Ideal MaxDop doit être calculé comme suit:
Donc, la réponse est: " Cela dépend " de l'encombrement de votre processeur et de la configuration NUMA. Le tableau ci-dessous résumera ce que j'ai expliqué ci-dessus:
Modifié: Voici un script TSQL rapide et sale pour générer le paramètre Recommandation pour MAXDOP.
EDIT: Pour les futurs visiteurs, vous pouvez regarder la fonction test-dbamaxdop powershell (ainsi que d’ autres fonctions DBA extrêmement utiles (TOUT GRATUIT !!).
la source
test-dbamaxdop
comme mentionné dans ma réponse?Lorsque vous définissez MAXDOP, vous souhaitez généralement le limiter au nombre de cœurs dans un nœud NUMA. De cette façon, les planifications n'essayent pas d'accéder à la mémoire sur les nœuds numa.
la source
En examinant un article de l'équipe MSDN , j'ai trouvé un moyen d'obtenir de manière fiable le nombre de cœurs physique à partir d'une machine et de l'utiliser pour déterminer un bon paramètre MAXDOP.
Par "bon", je veux dire conservateur. C'est-à-dire que mon exigence est d'utiliser au maximum 75% des cœurs d'un noeud NUMA, ou un maximum global de 8 cœurs.
SQL Server 2016 (13.x) SP2 et versions ultérieures, ainsi que toutes les versions de SQL Server 2017 et versions ultérieures, donnent des informations détaillées sur le nombre de cœurs physique par socket, le nombre de sockets et le nombre de nœuds NUMA, ce qui permet de déterminer avec précision la ligne de base. Paramètre MAXDOP pour une nouvelle installation SQL Server.
Pour les versions mentionnées ci-dessus, ce code recommandera un paramètre MAXDOP conservateur de 75% du nombre de cœurs physiques dans un nœud NUMA:
Pour les versions de SQL Server antérieures à SQL Server 2017 ou SQL Server 2016 SP2, vous ne pouvez pas obtenir le nombre de nœuds par nombre de nœuds
sys.dm_os_sys_info
. À la place, nous pouvons utiliser PowerShell pour déterminer le nombre de cœurs physiques:Vous pouvez également utiliser PowerShell pour déterminer le nombre de cœurs logiques, ce qui correspondrait probablement au double du nombre de cœurs physiques si HyperThreading est activé:
Le T-SQL:
la source
SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
En règle générale, utilisez une valeur DOP plus élevée pour un système OLAP et une valeur DOP inférieure (ou nulle) pour un système OLTP. De nombreux systèmes se situent quelque part entre les deux. Trouvez donc un moyen qui permet à une charge de travail occasionnellement volumineuse de disposer de suffisamment de temps CPU pour se terminer rapidement, sans étrangler vos charges de travail OLTP.
Veillez également à utiliser la
cpu_count
colonne pour obtenir un nombre de cœurs. Si l'hyperthreading est activé, cette colonne semble refléter le nombre de processeurs logiques exposés. De manière générale, vous ne voulez pas que le DOP soit supérieur au nombre de cœurs physiques. Répartir une lourde charge de travail parallèle sur les processeurs logiques ne fera qu'accroître les frais généraux sans réel bénéfice.Il y a aussi une
hyperthread_ratio
colonne, mais je ne suis pas certaine de ce qu'elle représente. La documentation n'est pas très claire non plus. Le nombre que je vois sur notre système suggère qu'il pourrait s'agir soit du nombre de cœurs physiques dans l'ensemble du système, soit du nombre de processeurs logiques par puce. La documentation prétend que je devrais voir un chiffre complètement différent.la source
hyperthread_ratio
c’est la quantité de cœurs logiques par processeur. Je me suis heurté à cela il y a quelque temps et si je me souviens bien, c'est la conclusion à laquelle je suis arrivé. Peut-être que @AaronBertrand a plus d'informations à ce sujet. Ne le prenez pas comme un fait absolu avant la vérification.Je suis également tombé sur l'article http://support.microsoft.com/kb/2806535 et ne trouve pas la corrélation avec les scripts ci-dessus.
Aussi, je me demande pourquoi il existe une différenciation pour "@logicalCPUs> = 8 et @HTEnabled = 1 et @NoofNUMA = 1" et "@logicalCPUs> = 8 et @HTEnabled = 1 et @NoofNUMA> 1" comme résultat devient le même.
Après tout, j'ai fini par écrire mon propre morceau de code correspondant à l'article d'en haut, même si j'aurais aimé une définition et / ou une différenciation plus précise concernant les "processeurs" "CPU" et les "processeurs physiques".
N'hésitez pas à avoir votre tour avec elle.
la source
hyperthread_ratio
colonnesys.dm_os_sys_info
est trompeuse ... sur mon poste de travail, par exemple, je dispose d'un seul processeur 4 cœurs avec l'hyperthreading activé - Task Manager voit 8 processeurs logiques, et votre code indique le rapport d'hyperthreading à être 1.Cette version vous donne un ensemble de résultats unique avec le paramètre MAXDOP existant et devrait tenir sur les versions SQL 2008-2017 sans qu'il soit nécessaire d'utiliser xp_cmdshell.
la source
Beau script, mais l'article de ko: http://support.microsoft.com/kb/2806535 ne fonctionne pas complètement avec votre code. Qu'est-ce que je rate?
Serveur 1
HTEnabled: 1
hyperthreadingRatio: 12
cpus logiques: 24
cpus physiques: 2
cpus logiques par numéro: 12
NoOfNuma: 2
Le paramétrage MaxDop doit être: 6
Serveur 2
HTEconnecté: 2
hyperthreadingRatio: 16
cpus logique: 64
cpus physique : 64 cpus
logique: numa: 16
NoOfNuma: 4
Le réglage MaxDop doit être: 4.
Je me rends compte que ce ne sont que des suggestions; mais quelque chose ne me semble pas correct qu'un serveur (n ° 2) ci-dessus avec 4 processeurs au lieu de 2 et 8 cœurs par CPU physique au lieu de 6; recommande le MAXDOP à 4, contre 6 pour le serveur moins puissant.
L'article de kbb ci-dessus suggère 8 mon scénario ci-dessus. "Pour les serveurs sur lesquels NUMA est configuré et où l'hyperthreading est activé, la valeur MAXDOP ne doit pas dépasser le nombre de processeurs physiques par nœud NUMA."
la source
Lors de l'installation de SQL Server 2019 CTP 3.0, un nouvel onglet MaxDOP a été créé. La valeur réelle est prédéfinie (dans les versions précédentes, la valeur par défaut était 0).
Définition de MAXDOP lors de l'installation de SQL Server 2019
Source de l'image: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png
la source