При настройке нового SQL Server я использую следующий код, чтобы определить хорошую отправную точку для MAXDOP
настройки:
/*
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
Я понимаю, что это немного субъективно и может варьироваться в зависимости от многих вещей; однако я пытаюсь создать жесткий фрагмент кода для использования в качестве отправной точки для нового сервера.
У кого-нибудь есть вход по этому коду?
sql-server
configuration
maxdop
Макс Вернон
источник
источник
Ответы:
Лучший способ сделать это - использовать coreinfo (утилита sysinternals), так как это даст вам
Теперь, основываясь на приведенной выше информации, параметр Ideal MaxDop должен быть рассчитан как
Таким образом, ответ таков: « это зависит » от вашего процессора и конфигурации NUMA, а в приведенной ниже таблице будет обобщено то, что я объяснил выше:
Отредактировано: ниже приведен быстрый и грязный скрипт TSQL для генерации Рекомендации для настройки MAXDOP
РЕДАКТИРОВАТЬ: Для будущих посетителей, вы можете посмотреть на функцию PowerShell-test-dbamaxdop (наряду с другими чрезвычайно полезными функциями DBA (ВСЕ БЕСПЛАТНО!).
источник
test-dbamaxdop
как указано в моем ответе?При настройке MAXDOP вы обычно хотите ограничить его количеством ядер в узле NUMA. Таким образом, расписания не пытаются получить доступ к памяти через узлы numa.
источник
Взглянув на сообщение от команды MSDN , я нашел способ надежного получения количества физических ядер от компьютера и использования его для определения правильной настройки MAXDOP.
Под «хорошим» я имею в виду консервативный. То есть мое требование состоит в том, чтобы использовать максимум 75% ядер в узле NUMA или в целом максимум 8 ядер.
SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и выше, а также все версии SQL Server 2017 и выше содержат подробные сведения о количестве физических ядер на сокет, количестве сокетов и количестве узлов NUMA, что позволяет аккуратно определять базовый уровень Параметр MAXDOP для новой установки SQL Server.
Для версий, упомянутых выше, этот код будет рекомендовать консервативный параметр MAXDOP, равный 75% от числа физических ядер в узле NUMA:
Для версий SQL Server, предшествующих SQL Server 2017 или SQL Server 2016 с пакетом обновления 2 (SP2), невозможно получить узел core-count-per-numa-node
sys.dm_os_sys_info
. Вместо этого мы можем использовать PowerShell для определения количества физических ядер:Можно также использовать PowerShell для определения количества логических ядер, которое, вероятно, удвоит количество физических ядер, если включен HyperThreading:
T-SQL:
источник
SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Как правило, используйте более высокое значение DOP для системы OLAP и более низкое (или нет) значение DOP для системы OLTP. Многие системы находятся где-то посередине, поэтому найдите удачную среду, которая позволяет случайной большой рабочей нагрузке получать достаточное количество процессоров для быстрого завершения работы без удушения рабочих нагрузок OLTP.
Кроме того, будьте осторожны с использованием
cpu_count
столбца, чтобы получить количество ядер. Если включена гиперпоточность, в этом столбце отражается количество открытых логических процессоров. Вообще говоря, вы не хотите, чтобы DOP был выше, чем количество физических ядер. Распределение тяжелой параллельной рабочей нагрузки между логическими процессорами только увеличит издержки без реальной выгоды.Также есть
hyperthread_ratio
колонка, но я не уверен, что она представляет. Документация тоже не очень понятна. Число, которое я вижу в нашей системе, предполагает, что это может быть либо количество физических ядер во всей системе, либо число логических процессоров на чип. В документации утверждается, что я должен видеть другую фигуру полностью.источник
hyperthread_ratio
это количество логических ядер на процессор. Я столкнулся с этим некоторое время назад, и если я правильно помню, я пришел к такому выводу. Может быть, @AaronBertrand имеет больше информации об этом. Не принимайте это как жесткий и быстрый факт еще до проверки.Я также наткнулся на статью http://support.microsoft.com/kb/2806535 и не могу найти корреляцию со сценариями выше.
Также мне интересно, почему существует различие для "@logicalCPUs> = 8 и @HTEnabled = 1 и @NoofNUMA = 1" и "@logicalCPUs> = 8 и @HTEnabled = 1 и @NoofNUMA> 1" в результате становится таким же.
В конце концов я написал свой собственный кусок кода, соответствующий статье сверху, хотя даже там мне бы хотелось более точное определение и / или различие между «процессорами», «процессорами» и «физическими процессорами».
Не стесняйтесь иметь свое вращение с этим.
источник
hyperthread_ratio
столбецsys.dm_os_sys_info
вводит в заблуждение ... на моей рабочей станции, например, у меня один 4-ядерный ЦП с включенной гиперпоточностью - диспетчер задач видит 8 логических ЦП, а ваш код сообщает, что отношение гиперпоточности быть 1.Эта версия дает вам хороший набор результатов с существующим параметром MAXDOP и должна поддерживаться в версиях SQL 2008-2017 без использования xp_cmdshell.
источник
Хороший сценарий, но статья kb: http://support.microsoft.com/kb/2806535 не полностью соответствует вашему коду. Что мне не хватает?
Сервер 1
HTEnabled: 1
hyperthreadingRatio: 12
логических процессоров: 24
физических процессора: 2
логических процессора на numa: 12
NoOfNuma: 2
Параметр MaxDop должен быть: 6
Сервер 2
HTEnabled: 2
hyperthreadingRatio: 16 операций
логического процессора: 64
физический процессор: 4
логических процессора на 1 numa: 16
NoOfNuma: 4
Значение MaxDop должно быть: 4
Я понимаю, что это просто предложения; но что-то мне кажется неправильным, что сервер (# 2) выше с 4 процессорами вместо 2 и 8 ядрами на физический процессор вместо 6; рекомендовал бы MAXDOP на 4, против 6 для менее мощного сервера.
Статья kbb выше предлагает 8 моих сценариев выше. «Для серверов с настроенной NUMA и включенной гиперпоточностью значение MAXDOP не должно превышать количество физических процессоров на узел NUMA».
источник
Во время установки SQL Server 2019 CTP 3.0 появляется новая вкладка MaxDOP. Фактическое значение предопределено (в предыдущих версиях по умолчанию было 0).
Настройка MAXDOP во время установки SQL Server 2019
Источник изображения: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png
источник