Повлияет ли отключение гиперпоточности на производительность при установке SQL Server?

28

Связанный с: текущая мудрость на SQL Server и Hyperthreading

Недавно мы обновили наш сервер баз данных Windows 2008 R2 с X5470 до X5560 . Теория заключается в том, что оба процессора имеют очень схожую производительность, во всяком случае, X5560 немного быстрее.

Тем не менее, производительность SQL Server 2008 R2 в последние дни была довольно плохой, а загрузка ЦП была довольно высокой.

Ожидаемая продолжительность жизни страниц огромна, мы получаем почти 100% -ное попадание в кеш страниц, поэтому память не является проблемой.

Когда я побежал:

SELECT * FROM sys.dm_os_wait_stats 
order by signal_wait_time_ms desc

Я получил:

wait_type wait_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms
-------------------------------------------------- ---------- -------------------- -------------------- -------------------- --------------------
XE_TIMER_EVENT 115166 2799125790 30165 2799125065
REQUEST_FOR_DEADLOCK_SEARCH 559393 2799053973 5180 2799053973
SOS_SCHEDULER_YIELD 152289883 189948844 960 189756877
CXPACKET 234638389 2383701040 141334 118796827
SLEEP_TASK 170743505 1525669557 1406 76485386
LATCH_EX 97301008 810738519 1107 55093884
LOGMGR_QUEUE 16525384 2798527632 20751319 4083713
ПИСЬМО 16850119 18328365 1193 2367880
PAGELATCH_EX 13254618 8524515 11263 1670113
ASYNC_NETWORK_IO 23954146 6981220 7110 1475699

(Затронуто 10 строк)

Я тоже побежал

-- Isolate top waits for server instance since last restart or statistics clear
WITH Waits AS (
   SELECT 
        wait_type, 
        wait_time_ms / 1000. AS [wait_time_s],
        100. * wait_time_ms / SUM(wait_time_ms) OVER() AS [pct],
        ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS [rn]
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE',
    'SLEEP_TASK','SLEEP_SYSTEMTASK','SQLTRACE_BUFFER_FLUSH','WAITFOR','LOGMGR_QUEUE',
    'CHECKPOINT_QUEUE','REQUEST_FOR_DEADLOCK_SEARCH','XE_TIMER_EVENT','BROKER_TO_FLUSH',
    'BROKER_TASK_STOP','CLR_MANUAL_EVENT','CLR_AUTO_EVENT','DISPATCHER_QUEUE_SEMAPHORE',
    'FT_IFTS_SCHEDULER_IDLE_WAIT','XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN'))

SELECT W1.wait_type, 
    CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
    CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
    CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct
FROM Waits AS W1
INNER JOIN Waits AS W2 ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct) - W1.pct < 95; -- percentage threshold

И получил

wait_type wait_time_s pct running_pct
CXPACKET 554821.66 65.82 65.82
LATCH_EX 184123,16 21,84 87,66
SOS_SCHEDULER_YIELD 37541,17 4,45 92,11
PAGEIOLATCH_SH 19018,53 2,26 94,37
FT_IFTSHC_MUTEX 14306.05 1,70 96,07

Это показывает огромное количество синхронизирующих запросы времени с параллелизмом (высокий CXPACKET). Кроме того, по многим причинам многие из этих проблемных запросов выполняются на нескольких ядрах (в нашем коде нет подсказок MAXDOP)

Сервер не находился под нагрузкой более суток. Мы наблюдаем значительные расхождения с выполнением запросов, обычно многие запросы выполняются медленнее, чем на нашем предыдущем сервере БД, а ЦП действительно высок.

Поможет ли отключение Hyperthreading снизить нагрузку на процессор и увеличить пропускную способность?

Сэм Шафран
источник
Имейте в виду, что CXPACKET не означает, что есть много времени, ожидающего объединения процессов вместе. CXPACKET означает, что поток ожидает, пока другой поток завершит свою обработку. Вам нужно посмотреть на конкретный запрос, имеющий поток в CXPACKET, и посмотреть, что ожидают другие потоки, кроме CXPACKET. Обычно это IO или сеть. В выводе выше вы ожидаете защелки и увольнения. Некоторый запрос должен быть настроен, или вы должны увидеть, почему защелки принимаются.
Мрденный
В нашем случае CXPACKET был высоким, так как другие потоки просто чрезмерно считывали из кэша (20 миллионов логических чтений на запрос). В нашем случае, опять же, было плохое анти-полусоединение с секционированной таблицей, в которой было только 700К строк.
Озамора
@ mrdenny, да, время ожидания высокой защелки касается того, что мы сейчас его расследуем.
Сэм Шафран

Ответы:

10

Я все еще чувствую, что тестирование вашей конкретной рабочей нагрузки , согласно первоначальному ответу, является единственным способом быть уверенным. Это не идеальный ответ, когда вы пытаетесь настроить производственную систему (поэтому я бы спросил, можно ли получить идентичный испытательный стенд в системах, где важны как производительность, так и доступность), но это единственное, что мне действительно удобно с.

Мы можем говорить о теории того, должен ли Hyperthreading навредить или улучшить ситуацию в целом (я считаю, что это скорее повредит, чем помощь на серверах, поэтому для «общего» развертывания я бы, вероятно, отключил его), но есть Есть только один способ убедиться, что в вашем конкретном случае что-то изменится, - попробуйте и посмотрите.

Роб Моир
источник
3
Заметьте, я не понизил голос, нам нужна вся помощь, которую мы можем получить, однако мы бы хотели избежать уколов в темноте в производственной системе. Я хочу убедиться, что мы собрали достаточно диагностики, прежде чем позвонить по поводу игры с этой настройкой.
Сэм Шафран
3
Я уверен, что вы действительно хотите избежать «игры» с производственной системой, в идеальном мире у всех нас были бы тестовые среды, идентичные производственной по этой причине. Я согласен с тем, что не хочу менять производство на спекуляции. Тем не менее, я поддерживаю свой ответ: тестирование определенных рабочих нагрузок является важной частью любого развертывания, и любой, кто говорит вам другое, является шарлатаном. Для меня все признаки указывают на то, что гиперпоточность является проблемой здесь, но мы можем говорить о вещах весь день и всю ночь, и все еще будет только один способ узнать наверняка.
Роб Мойр
5
Возврат здесь - согласен с ответом. Общий ответ: выключите Hyperthreading. Более конкретный ответ: это зависит от специфики и ДОЛЖНО БЫТЬ ПРОВЕРЕНО.
TomTom
1
Как ни странно, я думаю, что это лучший ответ для принятия, перебор с настройками maxdop может привести к большим проблемам, процессоры Nehalem намного быстрее, чем ядра на основе ядра, даже на слегка более медленных тактовых частотах, я нахожу аргументы кэширования l2 немного красной сельди, потому что кэш l3 намного больше. В качестве дополнения смотрите: blog.stackoverflow.com/2010/10/database-upgrade , если кто-то видит более 20% процентов прироста / увеличения ... это, вероятно, не из-за HT.
Сэм Шафран
У меня был опыт, противоположный @TomTom и @Robert. Я обнаружил, что HT на 10-15% лучше, чем выключен. Случай, когда его отключение улучшает производительность, был действительно редким.
Брайан Кноблаух
12

я согласна с тем что

  • в лучшем случае рекомендуется «попробовать HyperThreading на своей рабочей нагрузке и посмотреть, что произойдет». Мы делаем это прямо сейчас, когда я печатаю, и ... это не хорошо!
  • Вы, вероятно, должны всегда начинать с отключенной HyperThreading, так как это наиболее безопасно

Похоже, мы должны настроить две вещи:

  1. MAXDOP (максимальные степени параллелизма). Все, что я читаю, указывает на то, что иметь это неограниченное, вероятно, плохая идея, а документация Microsoft гласит:

    Установка для этого параметра [MAXDOP] большего значения [чем 8] часто приводит к нежелательному потреблению ресурсов и снижению производительности.

    что-либо выше, чем 8обычно не рекомендуется .. поэтому я установил его 4на данный момент. Первоначально он был нулевым (неограниченным).

  2. Порог стоимости для параллелизма. По-видимому, значение по умолчанию 5здесь считается довольно низким по умолчанию в соответствии с несколькими сообщениями SQL MVP, которые я нашел - мы можем настроить его, чтобы уменьшить количество параллелизма, даже планировщика.

Но, честно говоря, это похоже на обходные пути; Я думаю, что истинное решение для нашей рабочей нагрузки (полнотекстового индекса) состоит в отключении HT.

Джефф Этвуд
источник
4
MAXDOP также вызывает проблемы с HT, так как он может попытаться выполнить два потока на одном и том же процессоре, если вы говорите, 8 ядер и 16 потоков, и ваш maxdop установлен на 10. Как правило, 1 MAXDOP на логический процессор должен быть макс. И выполнять два потока на одном и том же процессоре для одного и того же процесса бессмысленно.
Марк Хендерсон
2
@Farseeker, который происходит только в том случае, если у вас нет операционной системы с поддержкой HyperThreading. Windows более новая, чем 2000, знает об этом.
Мирча Chirea
Стоит отметить, что эти переопределения maxdop вызывали только проблемы. Дефолт для нас был просто идеальным
Сэм Шафран
2
Стандартная версия SQL Server в любом случае достигает максимума в MAXDOP, равном 4, если она не ограничена. Нужно, чтобы предприятие поднялось выше. У нас были некоторые рабочие нагрузки, которые были самыми быстрыми с MAXDOP, равным 1 (без HT, с несколькими 8-ядерными процессорами AMD) ...
Брайан Кноблаух,
1
@Brian Knoblauch - я знаю это более года спустя, но я наткнулся на эту «Стандартную версию SQL Server, которая максимально достигает MAXDOP 4 в любом случае, когда ее не ограничивают», при любой возможности, которую вы можете указать мне на какую-то документацию. В настоящее время мы говорим об использовании MAXDOP на работе, но не уверены, на что его установить. Это в основном означает, что 4 - это то же самое, что и несвязанное, верно?
Джереми А. Вест
9

Anandtech обнаружил, что при чистой нагрузке чтения это немного больно, а при большой нагрузке при записи это было чем-то вроде победы. Я не видел ничего, что могло бы заставить меня думать, что это даст вам удар намного хуже, чем -5%, или выигрыш, намного лучше, чем 15%. Обратите внимание, что с Atom это огромная победа, но это очень странный процессор.

Все, что вы изменили, был процессор? Вы перешли от 12 МБ кеша и 4 потоков, то есть 3 МБ кеша на поток, до 8 МБ кеша и 8 потоков, то есть 1 МБ на поток. Это упрощает, но я уверен, что именно это вас и убивает, вы раньше запускали запросы в кеше, а теперь запускаете их из оперативной памяти, потому что им требуется больше 1 МБ, но меньше 3 МБ. Отключение HT, вероятно, поможет, но я бы вернулся к старому процессору. Выключите HT, и вы получите 2 МБ на поток, но если ваша рабочая нагрузка сильно возрастает, это не поможет. Вполне может быть, что старый 12-Мбайт кэш-процессор значительно быстрее для вашей рабочей нагрузки.

Я бы попробовал выключить HT и посмотреть, не улучшится ли это, но я подозреваю, что кеш является королем для вашей рабочей нагрузки, и вам, возможно, придется вернуться к чипу 12 МБ.

Рональд Поттол
источник
3
Кэш L2 на ядро наблюдения является массивным упрощением, так как процессор один полные поколения вперед (Nehalem / Core i7 против класса Core 2 Quad).
Джефф Этвуд
У @Jess, @Ronald и Nehalem мало кеша второго уровня. Основная масса - L3, которая распределяется между ядрами.
Мирча Chirea
7

Гиперпоточность - это, в лучшем случае, просто способ абстрагирования задачи от переключения с операционной системы и помещения ее в состояние готовности с прямым доступом к кэшу L1 и L2, что ускоряет переключение задач.

Тестирование с VMWare показало, что отключение HT не оказало заметного различия при стандартной нагрузке и на 5% увеличилось при большой нагрузке, потому что ESXi достаточно умен, чтобы знать разницу между «реальным» потоком и «поддельным» потоком (это намного больше, чем это, но это с точки зрения непрофессионалов). SQL Server 2005 не так уж и умен, но в сочетании с современной операционной системой отключение HT не должно иметь особых преимуществ.

Все, что сказал, я согласен с Рональдом, что это, скорее всего, будет ваш кэш второго уровня. Уменьшение размера кэша на 33% является существенным, и когда мы задаем наши SQL-серверы, мы всегда обращаемся к кэшу с более высокой тактовой частотой каждый раз

Марк Хендерсон
источник
Можете ли вы установить внешнее сходство так, чтобы правильные 4 ядра игнорировались SQL?
Сэм Шафран
3
Обычно вы устанавливаете привязку к каждому другому потоку ЦП, но до тех пор, пока MAXDOP настроен правильно, я не вижу причин устанавливать привязку вообще. С HT, хотя первый поток, который попадет в ЦП, становится "основным" потоком, а 2-й поток является потоком "HT". Тем не менее, нет никаких реальных «главных» и «ht» -потоков, потому что это происходит в зависимости от того, что было первым, а затем, когда они переключаются, порядок меняется.
Марк Хендерсон
Процессоры на базе Nehalem имеют ОЧЕНЬ, ОЧЕНЬ МАЛЕНЬКИЙ кеш L2, большая часть которого совместно используется L3.
Мирча Chirea
7

Исходя из моего опыта, HT заставляла операции ввода-вывода бесконечно выполняться на моих активных узлах в кластере Windows 2008 R2 (под управлением SQL Server 2008 R2). Интересным фактом было то, что это не было отражено ни в статистике ожидания, ни в pssdiag, который я использовал для поддержки Microsoft.

То, как я заметил низкое число операций ввода-вывода, было просто путем наблюдения за счетчиками ОС для физического диска. Как отметил Сэм, я писал об этом здесь и здесь

Если вы не испытываете проблемы с вводом / выводом и связаны с процессором, я предлагаю вам начать следующим образом:

Определите, какие процессы и блоки T-SQL вызывают наибольшую загрузку ЦП. По нашему опыту, после того, как мы исправили проблему с вводом / выводом (отключив HT), мы определили код, который работал ужасно в 2008 R2 и работал хорошо в 2005. Я написал об этом здесь .

Находясь под большой нагрузкой, запустите Адам Мачаник sp_whoisactive. Вы можете скачать его здесь . Мы испытывали очень высокую загрузку ЦП из-за чрезмерного количества логических операций чтения (20 миллионов на запрос) из-за очень плохого плана. Наши процессы выполняли анти-полусоединения с разделенными таблицами.

Моя следующая рекомендация - запустить профилировщик, чтобы идентифицировать набор кода T-SQL, который имеет высокий уровень загрузки ЦП и логического чтения ввода-вывода.

Благодаря вышеперечисленным шагам мы смогли настроить нарушающие процессы и перейти с 85% устойчивого использования ЦП почти до нуля.

Удачи и, пожалуйста, не стесняйтесь, напишите мне, если вы найдете решение, так как я хотел бы добавить дело в мой блог.

Благодарность

Оскар

ozamora
источник
1
+1 для профилировщика, спасли меня много раз, когда была обнаружена проблемная точка
Марк Хендерсон
+1 спасибо за все ваши предложения, настройка нашего SQL на разумный уровень - это настоящий кошмар, мы очень сильно зависим от полнотекста для наших операций с тегами, довольно часто мы ищем списки элементов в определенных тегах, поэтому мы собираем все установить и отфильтровать. Например, получение списка вопросов с тегами [x] и [y], упорядоченными по дате, включает извлечение огромных объемов данных из полного текста, а затем массивное объединение.
Сэм Шафран
Понял. Возьмите один пример и запустите его со статистикой IO ON и посмотрите, сможете ли вы точно определить любую таблицу с наиболее логичным чтением. Опять же, у нас все было хорошо в 2005 году и очень плохо в 2008 R2. Если вы просто обнаружите высокую загрузку ЦП и ожидаете высокой загрузки CXPACKET, попробуйте сначала увеличить порог стоимости для параллелизма до 10, 15 или даже до 20.
ozamora
Если больше ничего не помогает, отключите базу данных, выключите HT и идите оттуда. Удачи
Озамора
sp_whoisactive - довольно замечательный инструмент, и мне нравится, что запросы кликабельны
Сэм Саффрон,
2

Хороший или плохой ХТ сложно определить.

Это действительно зависит от схемы загрузки сервера, основанной на опыте и чтении. То есть, когда это влияет на производительность, это так плохо, иначе вы этого не замечаете.

Теория, которую я прочитал, состояла в том, что потоки совместно используют кэш, что означает, что в неблагоприятных условиях каждый поток может перезаписывать кэш другого потока. Если у вас нет большого параллелизма, или у вас много коротких запросов, то это может не повлиять на вас.

Я пробовал с MAXDOP и привязкой к процессору (вернувшись к моей последней реальной роли администратора баз данных на SQL Server 2000), но так и не смог найти ничего убедительного: но только для моего магазина в то время.

В качестве быстрого теста вы можете установить привязку процессора к использованию только физических ядер (младшие цифры) и посмотреть, что произойдет.

Однако самое большее вы теряете половину своих ядер. В настоящее время это может не иметь значения по сравнению с тем, с чем я играл несколько лет назад, когда было 2 против 4 или 4 против 8. Теперь это 8 против 16 или 16 против 32.

Изменить: тест Слава Окс

ГБН
источник
ядра 0-3 физические и 4-7 логические? Это так работает? Мы не могли сказать, и я не мог найти какой-либо инструмент, чтобы дать мне знать ..
Джефф Этвуд
2
@Джефф Этвуд: я найду больше позже. Я уже читал где - то .... Сейчас: support.microsoft.com/kb/322385
ГБН
Эта статья в КБ в значительной степени подводит итог.
Пауска
Хотя эта статья KB содержит некоторую полезную информацию, похоже, она не дает прямого ответа на вопрос Джеффа о том, как именно логические процессоры отображаются на физические. Мой мозг зажегся примерно на полпути, но, надеюсь, эта статья INTEL даст вам то, что вам нужно, чтобы выяснить карту: software.intel.com/en-us/articles/… также см. Software.intel.com/en-us/ blogs / 2009/12/21 /… со связанными ссылками.
BradC
@Джефф Этвуд, @BradC: Леди, трудно найти. Смотрите это: он опирается на рекомендации Intel. SQL Server будет использовать базовое перечисление Windows download.microsoft.com/download/5/7/7/… .
ГБН
2

К сожалению, я не думаю, что вы получите более определенный ответ, чем «попытайтесь отключить гиперпоточность и посмотрите, поможет ли это».

Несмотря на полезный ответ Джонатана в моей первоначальной ветке (которую вы связали в своем вопросе), мне так и не удалось получить каких-либо убедительных доказательств влияния HT на конкретные серверы, которые я исследовал. В моем случае серверы уже были запланированы для замены, поэтому мы просто позволяем этим заменам, так сказать, «позаботиться о проблеме».

Мой совет:

Попробуйте установить параметр МАКСИМАЛЬНАЯ степень параллелизма на уровне сервера, равный 1 . Параллелизм в SQL в любом случае наиболее полезен для больших и более длинных запросов, и ваша нагрузка (я полагаю) в любом случае состоит из огромного числа меньших запросов. Это должно полностью исключить ожидания CXPACKET. Это может привести к тому, что некоторые отдельные запросы будут выполняться немного дольше, но должны обеспечивать большую «пропускную способность» общих запросов на сервере.

Я добился хороших результатов, делая это на серверах OLTP. Другие типы серверов (серверы отчетов, серверы обработки, хранилища данных), безусловно, нуждаются в установке MAXDOP выше.

И, чтобы быть ясным, этот параметр все еще позволяет SQL использовать несколько потоков для каждой отдельной таблицы в JOIN, так что вы на самом деле не устраняете параллелизм полностью.

По крайней мере, стоит попробовать, поскольку это изменение настроек вступает в силу немедленно и даже не требует перезапуска службы SQL: http://msdn.microsoft.com/en-us/library/ms181007.aspx
Это означает, что вы можете переключиться немедленно, если дела пойдут в ад.

Отключение гиперпоточности в BIOS потребует полной перезагрузки сервера, так что это немного более рискованно.

BradC
источник
0

Для справки, у нас также была неожиданно плохая производительность после обновления сервера. Оказалось, что это связано с проблемами с BIOS и энергосбережением процессора. Настройка по умолчанию на сервере (HP) состояла в том, чтобы игнорировать управление скоростью процессора ЦП и использовать собственный алгоритм. Изменение этого параметра на управление ОС и обновление BIOS привело к значительным улучшениям. Были некоторые заметки о выпуске (не могу найти их сейчас), что была ошибка BIOS, которая блокировала процессор в состоянии самой низкой производительности.

/server//a/196329/6390

Марк Соул
источник