Cuando configuro un nuevo SQL Server, utilizo el siguiente código para determinar un buen punto de partida para la MAXDOP
configuración:
/*
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
Me doy cuenta de que esto es un poco subjetivo y puede variar según muchas cosas; Sin embargo, estoy tratando de crear un fragmento de código apretado para usar como punto de partida para un nuevo servidor.
¿Alguien tiene alguna entrada en este código?
sql-server
configuration
maxdop
Max Vernon
fuente
fuente
Respuestas:
La mejor manera de hacerlo es usar coreinfo (utilidad de sysinternals) ya que esto le dará
Ahora, según la información anterior, la configuración Ideal MaxDop debe calcularse como
Entonces la respuesta es: " depende " de la huella de su procesador y la configuración de NUMA y la tabla a continuación resumirán lo que expliqué anteriormente:
Editado: a continuación se muestra un script TSQL rápido y sucio para generar recomendaciones para la configuración MAXDOP
EDITAR: Para futuros visitantes, puede consultar la función test-dbamaxdop powershell (junto con otras funciones DBA extremadamente útiles (¡TODO GRATIS!).
fuente
test-dbamaxdop
como se menciona en mi respuesta?Al configurar MAXDOP, normalmente desea limitarlo a la cantidad de núcleos en un nodo NUMA. De esa manera, los horarios no intentan acceder a la memoria a través de los nodos numa.
fuente
Mirando una publicación del equipo de MSDN , he encontrado una forma de obtener de forma confiable el recuento de núcleos físicos de una máquina, y usarlo para determinar una buena configuración de MAXDOP.
Por "bueno", quiero decir conservador. Es decir, mi requisito es utilizar un máximo del 75% de los núcleos en un nodo NUMA, o un máximo total de 8 núcleos.
SQL Server 2016 (13.x) SP2 y superior, y todas las versiones de SQL Server 2017 y superior muestran detalles sobre el recuento de núcleos físicos por socket, el recuento de socket y la cantidad de nodos NUMA, lo que permite una forma ordenada de determinar la línea base Configuración de MAXDOP para una nueva instalación de SQL Server.
Para las versiones mencionadas anteriormente, este código recomendará una configuración conservadora de MAXDOP del 75% del número de núcleos físicos en un nodo NUMA:
Para las versiones de SQL Server anteriores a SQL Server 2017 o SQL Server 2016 SP2, no puede obtener el núcleo-count-per-numa-node de
sys.dm_os_sys_info
. En cambio, podemos usar PowerShell para determinar el recuento de núcleos físicos:También se puede usar PowerShell para determinar la cantidad de núcleos lógicos, que probablemente sea el doble de la cantidad de núcleos físicos si HyperThreading está activado:
El T-SQL:
fuente
SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Como regla general, use una DOP más alta para un sistema OLAP y una DOP más baja (o nula) para un sistema OLTP. Muchos sistemas están en algún punto intermedio, así que encuentre un medio feliz que permita que la carga de trabajo grande y ocasional obtenga suficiente CPU para completar rápidamente, sin estrangular sus cargas de trabajo OLTP.
Además, tenga cuidado al usar la
cpu_count
columna para obtener un recuento de núcleos. Si se habilita hyperthreading, esta columna parece reflejar el número de procesadores lógicos expuestos. En términos generales, no desea que el DOP sea mayor que la cantidad de núcleos físicos. Distribuir una gran carga de trabajo en paralelo a través de procesadores lógicos solo aumentará la sobrecarga sin ningún beneficio real.También hay una
hyperthread_ratio
columna, pero no estoy seguro de lo que representa. La documentación tampoco es muy clara. El número que veo en nuestro sistema sugiere que podría ser la cantidad de núcleos físicos en todo el sistema o la cantidad de procesadores lógicos por chip. La documentación afirma que debería ver una figura completamente diferente.fuente
hyperthread_ratio
es la cantidad de núcleos lógicos por procesador. Me encontré con eso hace un tiempo y si no recuerdo mal, esa es la conclusión a la que llegué. Quizás @AaronBertrand tiene más información sobre eso. No tome eso como un hecho duro y rápido aún antes de la verificación.También me he tropezado con el artículo http://support.microsoft.com/kb/2806535 y no puedo encontrar la correlación con los scripts anteriores.
También me pregunto, por qué existe una diferenciación para "@logicalCPUs> = 8 y @HTEnabled = 1 y @NoofNUMA = 1" y "@logicalCPUs> = 8 y @HTEnabled = 1 y @NoofNUMA> 1" como resultado se convierte en lo mismo.
Después de todo, terminé escribiendo mi propio código que coincidía con el artículo de arriba, aunque incluso allí me hubiera encantado una definición y / o diferenciación más precisa sobre "procesadores", "CPU" y "procesadores físicos".
Siéntase libre de tener su giro con él.
fuente
hyperthread_ratio
columnasys.dm_os_sys_info
es engañosa ... en mi estación de trabajo, por ejemplo, tengo una sola CPU de 4 núcleos con hyperthreading habilitado: el Administrador de tareas ve 8 CPU lógicas y su código informa la relación de hyperthreading a ser 1.Esta versión le ofrece un buen conjunto de resultados individuales con la configuración MAXDOP existente y debería mantenerse en las versiones SQL 2008-2017 sin la necesidad de usar xp_cmdshell.
fuente
Buen script, pero el artículo de kb: http://support.microsoft.com/kb/2806535 no coincide completamente con su código. ¿Qué me estoy perdiendo?
Servidor 1
HTEnabled: 1
hyperthreadingRatio: 12
cpus lógicos: 24
cpus físicos: 2
cpus lógicos por numa: 12
NoOfNuma: 2
La configuración MaxDop debe ser: 6
Server 2
HTEnabled: 2
hyperthreadingRatio: 16
cpus lógicos: 64
cpus físicos: 4
cpus lógicos por numa: 16
NoOfNuma: 4
La configuración de MaxDop debe ser: 4
Me doy cuenta de que estas son solo sugerencias; pero algo no me parece correcto que un servidor (# 2) anterior con 4 procesadores en lugar de 2 y 8 núcleos por CPU física en lugar de 6; recomendaría el MAXDOP en 4, frente a 6 para el servidor menos potente.
El artículo de kbb anterior sugiere 8 mi escenario anterior. "Para los servidores que tienen NUMA configurado y hyperthreading habilitado, el valor MAXDOP no debe exceder el número de procesadores físicos por nodo NUMA".
fuente
Durante la instalación de SQL Server 2019 CTP 3.0 hay una nueva pestaña MaxDOP. El valor real está predefinido (en versiones anteriores el valor predeterminado era 0).
Configuración de MAXDOP durante la instalación de SQL Server 2019
Fuente de la imagen: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png
fuente