После установки SQL Server Enterprise 2012 с лицензионной моделью Server + Cal на компьютере с 2 процессорами, каждый с 16 ядрами (без использования гиперпоточности) и при очень большой нагрузке на сервер, 16 ядер на первом процессоре были очень недоиспользованы, первые 4 ядра на втором процессоре были сильно загружены, а последние 12 ядер вообще не использовались (из-за ограничения в 20 ядер для этой версии сервера sql). Общая загрузка ЦП составила около 25%. К сожалению, сервер страдал от чрезвычайно низкой производительности, хотя, если бы задачи были равномерно распределены по 20 ядрам, это было бы не так плохо.
Windows Server работал на виртуальном образе VMWare под ESX Server, но весь ЦП был выделен серверу Windows.
Мы попытались изменить настройки соответствия (например, выделить большинство ядер для ЦП, а остальные - для ввода-вывода), но это не помогло решить проблемы с производительностью.
Обновление версии продукта до SQL Server Enterprise Core 2012 не только позволило SQL Server использовать 12 ранее неиспользуемых ядер на втором процессоре, но также привело к гораздо более равномерному распределению задач между всеми процессорами. Чтобы справиться с накопившимися запросами, использование ЦП подскочило примерно до 90%, а затем упало примерно до 33% после того, как было догонено, но производительность резко улучшилась, так как мы перешли на недавно обновленную версию. И проблемы с производительностью исчезли.
Мне было интересно, знает ли кто-нибудь, что может привести к тому, что SQL Server может неравномерно распределять нагрузку, полагаясь почти исключительно на первые 4 ядра 2-го процессора, у которого 12 ядер простаивают, и выделяет только несколько задач каждому из 16 ядер на первом процессор. Кроме того, есть ли способ более равномерно распределить нагрузку между 20 ядрами, которые использовались без обновления версии продукта?
Обратной стороной этого вопроса является то, что в результате обновления продукта SQL Server начал равномерно распределять нагрузку по всем распознаваемым им ядрам?
Спасибо за любые ответы на эти вопросы и / или ссылки, которые могут помочь мне лучше понять, как разобраться в происходящем.
Неравномерная производительность, вероятно, была результатом комбинации ограничения в 20 ядер в сочетании со способом, которым sql-сервер планирует потоки на машинах NUMA. К сожалению, SQL Server 2012 не использует никакого интеллекта при выборе 20 ядер, что приводит к несбалансированному количеству ядер на узел NUMA. С 32 ядрами, распределенными по 2 узлам NUMA, вы, скорее всего, получите разделение 16/4. Это проблематично, потому что SQL будет пытаться равномерно сбалансировать активность между узлами NUMA в циклическом режиме (при условии, что вы не используете привязку к регулятору ресурсов).
В вашем случае 1/2 нагрузки назначена на 4 ядра, а от 1/2 до 16 ядер. Узкое место на 4-ядерном узле эффективно действует как дроссель, ограничивая емкость машины до 2x 4 ядра = 8 ядер = 25% использования ЦП.
После обновления до основной версии sql использовал все 32 ядра на 2 узлах numa (разделение 16/16). Повышена производительность и т. Д.
Один из вариантов, который мог бы улучшить вашу производительность, заключался бы в использовании регулятора ресурсов сервера sql для привязки большей части вашей рабочей нагрузки к одному узлу numa. Например, вы можете создать пул ресурсов WEB_APP и привязать его к работе только на 16-ядерном узле numa. Нагрузка, назначенная пулу WEB_APP, может использовать 50% емкости сервера плюс оставшиеся 12,5% емкости 4-ядерного узла.
Другой вариант - ограничить количество ядер, доступных серверу sql, до 10 от каждого узла numa.