Високе використання процесора на SQL сервері - Повільні запити [закрито]


11

Наш MS SQL Server використовує близько 95% CPU-потужності.

Після перезавантаження сервера (обладнання) або перезавантаження SQL-сервісу використання становить 0% і повільно збільшується протягом 1-3 днів. Залежно від того, скільки його використовують.

Коли це більше 80%, кожен запит відбувається надзвичайно повільно.

Наш веб-сайт має багато великих запитів, тому деякі з них займають 45-60 секунд. Після перезавантаження (використання процесора менше 80%) для того самого запиту потрібно 11-20 секунд.


Як я можу це виправити? Я читав в Інтернеті, що маски афінності можуть регулювати використання процесора, але налаштування Affinity вимкнено. Я не можу їх змінити. Це тому, що у мене є лише 1 процесор?

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

Більшість із них уже досить добре оптимізовані.


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

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


Я шукав всюди, але не знайшов нічого, окрім матеріалів про "Маски спорідненості", які я не можу змінити.

Повинен бути спосіб очистити кеш процесора, не припиняючи поточні запити ... правда?


SQL: Microsoft SQL Server 11.0.2100.60
OS: Windows Server 2012 x64
Processor: 2.30 GHz
RAM: 4.00 GB

Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Пол Білий 9

Відповіді:


7

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

DBCC FREEPROCCACHE

Ви можете перевірити, що таке параметр примусової параметризації, якщо очищення кешу працює:

SELECT name
     , is_parameterization_forced
  FROM sys.databases;

Ймовірно, це встановлено на 0, за замовчуванням. Якщо вони бажають, ви можете встановити це як істинне, зробивши:

ALTER DATABASE [database_name] SET PARAMETERIZATION FORCED;

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

ALTER DATABASE [database_name] SET PARAMETERIZATION SIMPLE;

5
Зауважте, що звільнення кеш-процедури може насправді спричинити величезний сплеск процесора - оскільки всі запити тепер доведеться перекомпілювати свої плани виконання.
Аарон Бертран

18

Affinity не "коригує використання процесора" (наприклад, у вашому випадку змушує CPU виконувати менше роботи), вона дозволяє або вимкнути ЦП (можливо, зробити його доступним для іншого екземпляра на тій же машині) або встановити ЦП на допомога лише вводу / виводу. Навіть якби у вас було декілька процесорів, ви не змогли б використати перший для того, щоб допомогти з вашою метою, і ми не можемо здогадатися про останню, тому що ми не знаємо, що сприяє використанню вашого процесора настільки високо. Це може бути через надзвичайно погану індексацію, надмірну компіляцію, велику кількість скалярних АДС, обмітання вводу / виводу, хто знає? (І причиною того, що введення-виведення може бути причиною, є те, що якщо ваша база даних перевищує 3 Гб або більше, їй постійно доведеться обмінюватися даними з пам’яті пулу буферної пам’яті і вимикати дані, і це сприймає свою плату на процесорі.)

Кеш процесора - це також кроляча діра, яку вам не потрібно знижувати. Я дуже сумніваюся, що ваш процесор обмотаний на 95% через проблеми з кешем процесора.

Щоб зменшити джерело тиску ЦП та припускаючи, що ви використовуєте збережені процедури, ви можете ознайомитися з цим діагностичним запитом від Глена Беррі ( джерело звідси ) - переконайтеся, що ви запускаєте його в контексті потрібної бази даних:

-- Top Cached SPs By Total Worker time (SQL Server 2012). 
-- Worker time relates to CPU cost  (Query 44) (SP Worker Time)

SELECT TOP (25) 
  p.name AS [SP Name], 
  qs.total_worker_time AS [TotalWorkerTime], 
  qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], 
  qs.execution_count, 
  ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) 
    AS [Calls/Second],
  qs.total_elapsed_time, 
  qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], 
  qs.cached_time
FROM sys.procedures AS p WITH (NOLOCK)
INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);

-- This helps you find the most expensive cached stored procedures from a CPU perspective
-- You should look at this if you see signs of CPU pressure

Якщо ви не використовуєте збережені процедури, то цей приклад від Джона Самсона може допомогти виділити спеціальні запити ( отримані звідси ):

SELECT TOP (25)
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
    qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
    (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
    qs.total_elapsed_time/1000000,
    st.text,
    qp.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);

Ви також можете поглянути на sp_WhoIsActive Адама Маханіка , що зберігається процедура, яка може швидко проаналізувати всі поточні запити, що дозволяють, і дозволити їх сортувати як завгодно (наприклад, у вашому випадку @sort_order = '[CPU] DESC').

Перше, що я би зробив, особливо - якщо це дійсно важливо для місій пошуково-рятувальних груп - це придбати краще обладнання. Ви повинні мати більше процесорів та більше оперативної пам’яті, щоб обслуговувати свою програму. Також вам абсолютно потрібна краща висока доступність (наприклад, кластеризація, дзеркальне відображення або групи доступності). Немає причин, що перезавантаження фізичної машини повинно брати вашу програму повністю в автономному режимі - у нас є кращі рішення для цієї проблеми. І нарешті, я припускаю, що цей "сервер" має лише один накопичувач. Це означає, що всі введення-виведення - з ОС, з файлів даних SQL Server, файлів журналів, tempdb тощо, всі проходять через один контролер і діляться активністю читання / запису на одному диску. Отримайте більше дисків. Отримайте SSD, якщо / де можете. Використовуйте RAID і намагайтеся максимально поширити введення-виведення.

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

Також дивіться це питання StackOverflow щодо деяких інших ідей:

/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server


0

Наступні пропозиції - це "знімок у темряві", оскільки я не бачу фактичного коду.

По-перше, SP може відкривати курсори та залишати їх відкритими. Прочитайте курсори, особливо закрити та виділити. Хтось може закриватися, але не розбирати курсори. Поведінка, можливо, змінилася через оновлення, 2012 рік може поводитись із курсорами, які залишились, інакше, ніж у 2008 році.

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

Чи використовуєте Ви WinLink випадково? Щось про це звучить нечітко знайоме.


-4

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


Але це не змінить використання процесора на SQL-сервері, правда? Це просто змусить запити йти швидше на веб-сайті, і можуть виникнути проблеми, коли щось зміниться в таблиці, а хтось інший використовує запам’ятовані результати з тієї ж таблиці, правда?
Леві Йохансен

@Levi, якщо ви кешуєте результати запитів десь із середнього рівня, запити не потрапляють у базу даних (за винятком випадків, коли вам потрібно оновити кеш).
Аарон Бертран

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