Ao configurar um novo SQL Server, uso o código a seguir 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
Sei que isso é um pouco subjetivo e pode variar com base em muitas coisas; no entanto, estou tentando criar um pedaço de código abrangente para usar como ponto de partida para um novo servidor.
Alguém tem alguma entrada nesse código?
sql-server
configuration
maxdop
Max Vernon
fonte
fonte
Respostas:
A melhor maneira de fazer é - use coreinfo (utilitário pela 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 espaço ocupado no processador e a configuração NUMA e a tabela abaixo resumirão o que expliquei acima:
Editado: Abaixo está um script TSQL rápido e sujo para gerar a Recomendação para a configuração MAXDOP
EDIT: Para futuros visitantes, você pode olhar para a função test-dbamaxdop powershell (junto com outras funções extremamente úteis do DBA (ALL FREE !!).
fonte
test-dbamaxdop
como mencionado na minha resposta?Ao configurar o 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 de uma.
fonte
Olhando para uma postagem da equipe do MSDN , criei uma maneira de obter com segurança a contagem de núcleos físicos de uma máquina e usá-la para determinar uma boa configuração do MAXDOP.
Por "bom", quero dizer conservador. Ou seja, meu requisito é usar no máximo 75% dos núcleos em um nó NUMA ou no máximo 8 núcleos.
O SQL Server 2016 (13.x) SP2 e superior e todas as versões do SQL Server 2017 e acima da superfície detalham 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, esse código recomendará uma configuração conservadora 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, não é possível obter o nó da contagem de núcleos por numa
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, o que provavelmente seria o dobro do número de núcleos físicos se o HyperThreading estiver ativado:
O T-SQL:
fonte
SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Como regra geral, use DOP mais alto para um sistema OLAP e DOP mais baixo (ou nenhum) para um sistema OLTP. Muitos sistemas estão em algum lugar no meio; portanto, encontre um meio feliz que permita que uma carga de trabalho grande 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 principal. Se o hyperthreading estiver ativado, esta coluna parecerá 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. A disseminação de uma carga de trabalho paralela pesada em processadores lógicos 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 completamente diferente.fonte
hyperthread_ratio
seja a quantidade de núcleos lógicos por processador. Descobri isso há pouco tempo e, se bem me lembro, é a conclusão que cheguei. Talvez o @AaronBertrand tenha mais informações sobre isso. Não tome isso como um fato difícil e rápido ainda antes da verificação.Também tropecei no artigo http://support.microsoft.com/kb/2806535 e não consigo encontrar a correlação com os scripts acima.
Também estou me perguntando, 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 pedaço de código correspondente ao artigo acima, embora mesmo lá eu tivesse adorado 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.
fonte
hyperthread_ratio
colunasys.dm_os_sys_info
é enganosa ... na minha estação de trabalho, por exemplo, tenho uma única CPU de 4 núcleos com o hyperthreading ativado - o Gerenciador de Tarefas vê 8 CPUs lógicas e seu código relata a taxa de hyperthreading para ser 1.Esta versão fornece um bom conjunto de resultados com a configuração existente do MAXDOP e deve manter as versões do SQL 2008-2017 sem a necessidade de usar xp_cmdshell.
fonte
Bom script, mas o artigo da kb: http://support.microsoft.com/kb/2806535 não combina completamente com o seu código. o que estou perdendo?
Servidor 1
HTEnabled: 1
hyperthreadingRatio: 12
cpus lógicos: 24
cpus físicos: 2
cpus lógicos por numa: 12
NoOfNuma: 2
A configuração MaxDop deve ser: 6
Servidor 2
HTEnabled: 2
hyperthreadingRatio: 16
cpus lógicos: 64
cpus físicos: 4
cpus lógicos por numa: 16
NoOfNuma: 4
A configuração MaxDop deve ser: 4
Eu percebo que estas são apenas sugestões; mas algo não me parece correto: um servidor (nº 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 da kbb acima sugere 8 meu cenário acima. "Para servidores com o NUMA configurado e o hyperthreading ativado, o valor MAXDOP não deve exceder o número de processadores físicos por nó do NUMA."
fonte
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).
Definindo o 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
fonte