Чи буде відключена гіперреалізація, покращить ефективність нашої установки 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
WRITELOG 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 допомогти зменшити використання CPU та збільшити пропускну здатність?



Майте на увазі, що CXPACKET не означає, що для злиття процесів потрібно багато часу. CXPACKET означає, що нитка чекає, коли інша нитка закінчить її обробку. Вам потрібно переглянути конкретний запит, який містить нитку в CXPACKET wait, і побачити, які інші потоки чекають, окрім CXPACKET. Зазвичай це IO або мережа. На виході вище ви очікуєте на засувки і виходите з розкладу. Деякі запити потрібно налаштувати, або вам потрібно зрозуміти, чому знімається засувка.
mrdenny

У нашому випадку CXPACKET був високим, оскільки інші потоки просто надмірно читали з кешу (20 мільйонів логічних читань за запитом). Наш випадок, знову ж таки, був поганим анти-напівз'єднанням з розділеною таблицею, яка складала лише 700 К рядків
озамора

@mrdenny, так, час тривалого очікування засувки стосується того, що ми зараз його досліджуємо.
Сем Шафран

Відповіді:


10

Я все ще відчуваю, що тестування вашої конкретної навантаження відповідно до оригінальної відповіді - це єдиний спосіб бути впевненим. Це не ідеальна відповідь, коли ви намагаєтесь налаштувати виробничу систему (тому я б запитав, чи можна було отримати ідентичну пробну версію в системах, де продуктивність та доступність насправді важливі), але це єдине, що мені дуже комфортно з.

Ми можемо говорити про теорію того, чи повинен Hyperthreading шкодити чи покращувати речі взагалі (я вважаю, що це більше шансів нашкодити, ніж допомогти на серверах, тому для "загального" розгортання я б, можливо, його відключив), але є Єдиний спосіб переконатися, чи зміниться він у вашому конкретному випадку, це спробувати і побачити.


3
Зауважте, що я не подав заявки, нам потрібна вся допомога, яку ми можемо отримати, проте ми хотіли б уникнути ударів у темряві у виробничій системі. Хочу переконатися, що ми зібрали достатню діагностику до того, як здійснити дзвінок про гру з цим налаштуванням.
Сем Шафран

3
Я впевнений, що ви хочете уникати «грати» з виробничою системою, в ідеальному світі для всіх нас були б тестові середовища, ідентичні виробництву. Я погоджуюся з тим, що не хочу змінювати виробництво на спекуляції. Однак я стою проти своєї відповіді: Тестування конкретних навантажень є важливою частиною будь-якого розгортання, і кожен, хто говорить вам інше, - шарлатан. Для мене всі знаки вказують на те, що гіпертонія є проблемою тут, але ми можемо говорити про речі цілий день і всю ніч, і все одно існує лише один спосіб знати напевно.
Роб Моїр

5
Оновлення тут - я згоден з відповіддю. Загальна відповідь: Вимкніть Hyperthreading. Більш конкретна відповідь: Це залежить від специфіки і ОБОВ'ЯЗКОВО випробувати.
TomTom

1
Як не дивно, я думаю, що це найкраща відповідь, яку можна прийняти, розмовляючи з налаштуваннями maxdop, може призвести до безлічі проблем, nehalem cpus набагато швидше, ніж основні ксеони, навіть при дещо меншій тактовій швидкості, я вважаю, що аргументи кешованих 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 року.
Мірча Кірея

Варто зазначити, що ці скасування maxdop створювали лише неприємності. за замовчуванням для нас було просто чудово
Сем Саффрон

2
Стандартна версія SQL Server максимально розширюється на MAXDOP 4, якщо залишити без обмежень. Потрібно Enterprise вийти вище за це. У нас були деякі робочі навантаження, які пройшли найшвидше з MAXDOP 1 (коробка без HT, працює декілька 8-ядерних AMD) ...
Brian Knoblauch

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 мають мало кешу L2. Основна маса - L3, яка поділяється по всіх ядрах.
Мірча Кірея

7

Hyperthreading - це, у кращому випадку, лише спосіб абстрагування відключення задачі від операційної системи та розміщення її в режимі "матриця", з прямим доступом до кешу L1 та L2, що робить перемикання задач швидше.

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

Все, що було сказано, я згоден з Рональдом, що це, швидше за все, буде ваш кеш L2. Зниження розміру кешу на 33% є істотним, і коли ми спеціалізуємося на наших SQL-серверах, ми завжди щороку переходимо до кешу над необмеженою тактовою частотою.


Чи можете ви встановити спорідненість зовні, щоб правильні 4 ядра ігнорували SQL?
Сем Шафран

3
Як правило, ви б встановили спорідненість один до одного потоку процесора, але до тих пір, поки MAXDOP встановлений правильно, я не бачу жодної причини встановлювати спорідненість. З HT, хоча перший потік, який потрапляє на процесор, стає "головним" потоком, а другий потік - потоком "HT". Немає справжніх "головних" і "ht" потоків, оскільки це все, що з них спочатку потрапило, а потім, коли вони переключаються на завдання, порядок змінюється.
Марк Хендерсон

Процесори на базі Nehalem мають ДУЖЕ, ДУЖЕ МАЛКО кеш-пам'ять L2, більшість з них L3.
Мірча Кірея

7

Виходячи з мого досвіду, HT змушував операції вводу / виводу приймати назавжди мої активні вузли кластера Windows 2008 R2 (під керуванням SQL Server 2008 R2). Цікавим фактом було те, що він не відображався ні в статистиці очікування, ні в pssdiag, який я балотувався на підтримку Microsoft.

Те, як я помітив низький введення / вивід, було лише переглядом лічильників ОС для фізичного диска. Як зазначив Сем, я писав про це тут і тут

Якщо у вас НЕ виникають проблеми з введенням-виведенням і пов'язані з процесором, пропоную почати так:

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

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

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

Наведеними вище кроками ми змогли налаштувати порушуючі процеси та перейти від 85% стійкого використання процесора до майже нуля.

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

Спасибі

Оскар


1
+1 для профілера, врятував мене багато разів після виявлення місця неприємностей
Марк Хендерсон

+1 дякую за всі ваші пропозиції, налаштування нашого SQL на розумний рівень - це загальний кошмар, ми повністю залежаємо від повного тексту для роботи з тегами, досить часто ми шукаємо списки предметів у конкретних тегах, тому ми захоплюємо цілий встановити і відфільтрувати його. Наприклад, отримання списку питань із упорядкованими за датою тегами [x] та [y] передбачає витяг величезної кількості даних із повного тексту, а потім масове з'єднання.
Сем Шафран

Зрозумів. Візьміть один зразок і запустіть його зі статистикою IO ON і подивіться, чи можете ви точно визначити будь-яку таблицю з найбільш логічними показаннями. Знову ж таки, у 2005 році у нас було чудово, і у R2 2008 року було дуже погано. Якщо ви просто знайдете високу завантаженість процесора і маєте високий запуск CXPACKET, спробуйте спочатку, збільшивши поріг витрат для паралелізму до 10, 15 або навіть 20.
Озамора

Якщо нічого іншого не допомагає, відключіть БД, відключіть HT і перейдіть звідти. Удачі
озамора

sp_whoisactive - це надзвичайно чудовий інструмент, люблю те, як запити можна натискати
Сем Шафрон

2

Добрий він чи поганий, важко визначити.

Це дійсно залежить від схеми завантаження сервера на основі досвіду та читання. Тобто, коли це впливає на продуктивність, воно робить так погано : інакше ти цього не помічаєш.

Теорія, яку я читав, полягала в тому, що потоки діляться кешем, що означає, що при несприятливих умовах кожен потік може перезаписати кеш іншого потоку. Якщо у вас немає великого паралелізму або ваша навантаження - це багато коротких запитів, це може не впливати на вас.

Я намагався з MAXDOP та спорідненістю з процесором (ще в останній моїй справжній ролі DBA на SQL Server 2000), але ніколи не міг знайти нічого переконливого: але тільки для мого магазину в той час.

Як швидкий тест, ви можете встановити спорідненість процесора, щоб використовувати лише фізичні ядра (нижчі числа) і подивитися, що відбувається.

Однак максимум ви втрачаєте половину своїх ядер. Сьогодні це може не мати значення в порівнянні з тим, з чим я грав кілька років тому, коли було 2 проти 4 або 4 проти 8. Зараз це 8 проти 16 або 16 проти 32.

Редагувати: Тест Слави Окса


чи ядра 0-3 фізичні та 4-7 логічні? Так це працює? Ми не могли сказати, і я не міг розібратися з будь-яким інструментом, який би повідомив мене ..
Джефф Етвуд

2
@ Джеф Етвуд: більше знайду пізніше. Я вже читав де - то .... Зараз: support.microsoft.com/kb/322385
ГБН

Ця стаття в КБ майже підсумовує її.
pauska

Хоча ця стаття KB містить корисну інформацію, схоже, вона прямо не відповідає на питання Джефа про те, як саме логічні процесори відображаються на фізичні. Мій мозок обсмажився приблизно на півдорозі, але, сподіваємось, ця стаття про INTEL повинна дати вам те, що вам потрібно, щоб з’ясувати відображення: software.intel.com/en-us/articles/… також дивіться software.intel.com/en-us/ блоги / 2009/12/21 /… із пов'язаними з цим посиланнями.
BradC

@Jeff Atwood, @BradC: Lordy, важко знайти. Дивіться це: він покладається на рекоммедації Intel. SQL Server використовуватиме перелічення Windows Download.microsoft.com/download/5/7/7/… .
gbn

2

На жаль, я не думаю, що ви збираєтесь отримати більш остаточну відповідь, ніж "спробуйте вимкнути гіпертодування і побачити, чи це допомагає".

Незважаючи на корисну відповідь Джонатана в моїй оригінальній темі (яку ви пов’язали у своєму запитанні), я ніколи не зміг отримати жодних остаточних доказів про вплив HT на конкретні сервери, на яких я досліджував. У моєму випадку, сервери вже були заплановані на заміну, тому ми просто дозволили цим замінам "подбати про проблему", так би мовити.

Моя порада:

Спробуйте встановити на рівні сервера MAX ступінь паралельності 1 . Паралелізм у SQL в будь-якому випадку є найбільш корисним для більш тривалих запитів, і ваше навантаження (я припускаю) складається з великої кількості менших запитів у будь-якому разі. Це повинно повністю усунути очікування CXPACKET. Це може змусити деякі окремі запити виконуватись трохи довше, але повинно забезпечити більше "пропускну здатність" загальних запитів на сервері.

У мене були хороші результати, роблячи це на серверах OLTP. Іншим серверам (сервери звітності, сервери обробки даних, зберігання даних), безумовно, потрібен MAXDOP, встановлений вище.

І щоб було зрозуміло, цей параметр все ще дозволить SQL використовувати декілька потоків для кожної окремої таблиці в ПРИЄДНАННІ, тож ви насправді не повністю виключаєте паралелізм.

Принаймні варто спробувати, оскільки ця зміна параметрів набуває чинності негайно і навіть не вимагає перезапуску служби SQL: http://msdn.microsoft.com/en-us/library/ms181007.aspx
Це означає, що ви можете переключитися це повертається негайно, якщо все почало йти в пекло.

Якщо вимкнути гіперреалізацію в BIOS, це вимагатиме повного перезавантаження сервера, тому трохи ризикованіше.


0

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

https://serverfault.com/a/196329/6390

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.