Ao configurar um novo SQL Server, uso o seguinte código para determinar um bom ponto de partida para a MAXDOP
configuração:
/*
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
Percebo que isso é um pouco subjetivo e pode variar com base em muitas coisas; no entanto, estou tentando criar um código abrangente para usar como ponto de partida para um novo servidor.
Alguém tem alguma entrada sobre este código?
A melhor maneira de fazer é -- use coreinfo (utilitário de sysinternals), pois isso lhe dará
Agora, com base nas informações acima, a configuração Ideal MaxDop deve ser calculada como
Portanto, a resposta é - " depende " do tamanho do seu processador e da configuração do NUMA e a tabela abaixo resumirá o que expliquei acima:
Editado: Abaixo está um script TSQL rápido e sujo para gerar a configuração de recomendação para MAXDOP
EDIT: Para futuros visitantes, você pode ver a função powershell test-dbamaxdop (juntamente com outras funções DBA extremamente úteis (TODAS GRATUITAS !!).
Ao definir MAXDOP, você normalmente deseja limitá-lo ao número de núcleos em um nó NUMA. Dessa forma, os agendamentos não estão tentando acessar a memória nos nós do numa.
Olhando para uma postagem da equipe do MSDN , encontrei uma maneira confiável de obter a contagem de núcleos físicos de uma máquina e usá-la para determinar uma boa configuração de MAXDOP.
Por "bom", quero dizer conservador. Ou seja, meu requisito é usar no máximo 75% dos núcleos em um nó NUMA ou um máximo geral de 8 núcleos.
SQL Server 2016 (13.x) SP2 e superior e todas as versões do SQL Server 2017 e superior apresentam detalhes sobre a contagem de núcleos físicos por soquete, a contagem de soquetes e o número de nós NUMA, permitindo uma maneira organizada de determinar a linha de base Configuração MAXDOP para uma nova instalação do SQL Server.
Para as versões mencionadas acima, este código recomendará uma configuração conservadora de MAXDOP de 75% do número de núcleos físicos em um nó NUMA:
Para versões do SQL Server anteriores ao SQL Server 2017 ou SQL Server 2016 SP2, você não pode obter o core-count-per-numa-node do
sys.dm_os_sys_info
. Em vez disso, podemos usar o PowerShell para determinar a contagem de núcleos físicos:Também é possível usar o PowerShell para determinar o número de núcleos lógicos, que provavelmente seria o dobro do número de núcleos físicos se o HyperThreading estiver ativado:
O T-SQL:
Como regra geral, use um DOP mais alto para um sistema OLAP e um DOP mais baixo (ou nenhum) para um sistema OLTP. Muitos sistemas estão em algum lugar no meio, portanto, encontre um meio-termo que permita que a grande carga de trabalho ocasional obtenha CPU suficiente para concluir rapidamente, sem estrangular suas cargas de trabalho OLTP.
Além disso, tenha cuidado ao usar a
cpu_count
coluna para obter uma contagem de núcleos. Se o hyperthreading estiver habilitado, esta coluna parece refletir o número de processadores lógicos expostos. De um modo geral, você não deseja que o DOP seja maior que o número de núcleos físicos. Espalhar uma carga de trabalho paralela pesada entre processadores lógicos apenas aumentará a sobrecarga sem nenhum benefício real.Há também uma
hyperthread_ratio
coluna, mas não tenho certeza do que ela representa. A documentação também não é muito clara. O número que vejo em nosso sistema sugere que pode ser o número de núcleos físicos em todo o sistema ou o número de processadores lógicos por chip. A documentação afirma que eu deveria estar vendo uma figura totalmente diferente.Eu também tropecei no artigo http://support.microsoft.com/kb/2806535 e não consegui encontrar a correlação com os scripts acima.
Também estou querendo saber, por que existe uma diferenciação para "@logicalCPUs >= 8 e @HTEnabled = 1 e @NoofNUMA = 1" e "@logicalCPUs >= 8 e @HTEnabled = 1 e @NoofNUMA > 1" como resultado torna-se o mesmo.
Afinal, acabei escrevendo meu próprio código combinando com o artigo acima, embora mesmo lá eu adoraria uma definição e/ou diferenciação mais precisa sobre "processadores", "CPU" e "processadores físicos".
Sinta-se livre para dar sua volta com ele.
Esta versão oferece um bom conjunto de resultados único com a configuração MAXDOP existente e deve se manter nas versões SQL 2008-2017 sem a necessidade de usar xp_cmdshell.
Bom script, mas o artigo kb: http://support.microsoft.com/kb/2806535 não combina completamente com seu código. o que estou perdendo?
Servidor 1
HTEnabled: 1
hyperthreadingRatio: 12
cpus lógico: 24
cpus físico: 2
cpus lógicos por numa: 12
NoOfNuma: 2
configuração MaxDop deve ser: 6
Server 2
HTEnabled: 2
hyperthreadingRatio: 16
cpus lógico: 64
cpus físico: 4
cpus lógicos por numa: 16
NoOfNuma: 4
A configuração de MaxDop deve ser: 4
Eu percebo que estas são apenas sugestões; mas algo não me parece certo que um servidor (#2) acima com 4 processadores em vez de 2 e 8 núcleos por CPU física em vez de 6; recomendaria o MAXDOP em 4, contra 6 para o servidor menos poderoso.
O artigo kbb acima sugere 8 meu cenário acima. "Para servidores que têm NUMA configurado e hyperthreading habilitado, o valor MAXDOP não deve exceder o número de processadores físicos por nó NUMA."
Durante a instalação do SQL Server 2019 CTP 3.0, há uma nova guia MaxDOP. O valor real é predefinido (nas versões anteriores o padrão era 0).
Configurando MAXDOP durante a instalação do SQL Server 2019
Fonte da imagem: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png