Мой процессор SQL Server на протяжении большей части сегодняшнего дня находится на уровне около 90%.

Я не могу перезапустить его, потому что он постоянно используется.

Можно ли узнать, что в SQL вызывает такую ​​перегрузку процессора?

Я запустил SQL Profiler, но происходит так много всего, что трудно сказать, вызывает ли это что-то конкретное.

Я запустил sp_who2, но не уверен, что именно все означает, и можно ли здесь выявить возможные проблемы.

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

Мне нужен какой-либо способ найти, что вызывает проблемы с процессором в SQL.

78
joshcomley 3 Июн 2009 в 18:24

6 ответов

Лучший ответ

Я предполагаю, что при должной осмотрительности вы подтвердили, что ЦП фактически потребляется процессом SQL (счетчики категорий процессов perfmon подтвердят это). Обычно для таких случаев вы берете образец соответствующих счетчиков производительности и сравниваете их с базовыми показателями, установленными вами в условиях нормальной нагрузки. Как только вы решите эту проблему, я рекомендую вам установить такую ​​основу для будущих сравнений.

Вы можете точно узнать, на что SQL расходует каждый цикл ЦП. Но чтобы знать, где искать, нужно много знаний и опыта. Это SQL 2005/2008 или 2000? К счастью, для 2005 года и новее есть несколько готовых решений. У вас уже есть пара хороших указателей с ответом Джона Самсона. Я хотел бы добавить рекомендацию по загрузке и установке Отчеты панели мониторинга производительности SQL Server. Некоторые из этих отчетов включают самые популярные запросы по времени или по вводу-выводу, наиболее часто используемые файлы данных и т. Д., И вы можете быстро понять, в чем проблема. Вывод является как числовым, так и графическим, поэтому он более полезен для новичков.

Я также рекомендовал бы использовать сценарий Adam's Who is Active, хотя он немного более продвинутый.

И последнее, но не менее важное: я рекомендую вам загрузить и прочитать технический документ группы поддержки клиентов MS SQL по анализу производительности: SQL 2005 Waits and Queues.

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

31
was 15 Ноя 2017 в 06:28

Этот запрос использует DMV для определения наиболее дорогостоящих запросов по ЦП.

SELECT TOP 20
    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

Полное объяснение см. На странице Как определить наиболее затратные запросы SQL Server по ЦП

107
marc_s 27 Янв 2017 в 13:07

Выполните любой из них с интервалом в несколько секунд. Вы обнаружите высокую скорость подключения ЦП. Или: сохраненный ЦП в локальной переменной, WAITFOR DELAY, сравнение сохраненных и текущих значений ЦП

select * from master..sysprocesses
where status = 'runnable' --comment this out
order by CPU
desc

select * from master..sysprocesses
order by CPU
desc

Может быть, не самым элегантным, но эффективным и быстрым.

7
gbn 3 Июн 2009 в 14:29

Вы можете запустить SQL Profiler и отфильтровать по ЦП или продолжительности, чтобы исключить все «мелочи». Тогда должно быть намного проще определить, есть ли у вас проблема, например, конкретная сохраненная процедура, которая работает намного дольше, чем должна (может быть отсутствующий индекс или что-то в этом роде).

Два предостережения:

  • Если проблема заключается в большом количестве крошечных транзакций, то описанный выше фильтр их исключит, и вы это пропустите.
  • Кроме того, если проблема заключается в одной большой работе (например, 8-часовом анализе или плохо спроектированном выборе, который должен перекрестно объединить миллиард строк), вы можете не увидеть этого в профилировщике, пока она не будет полностью выполнена, в зависимости от о том, какие события вы профилируете (sp: completed vs sp: statementcompleted).

Но обычно я начинаю с монитора активности или sp_who2.

7
BradC 3 Июн 2009 в 14:58

Здесь вы можете найти полезный запрос:

Исследование причины высокой загрузки ЦП SQL Server

Мне это очень помогло:

SELECT s.session_id,
    r.status,
    r.blocking_session_id 'Blk by',
    r.wait_type,
    wait_resource,
    r.wait_time / (1000 * 60) 'Wait M',
    r.cpu_time,
    r.logical_reads,
    r.reads,
    r.writes,
    r.total_elapsed_time / (1000 * 60) 'Elaps M',
    Substring(st.TEXT,(r.statement_start_offset / 2) + 1,
    ((CASE r.statement_end_offset
WHEN -1
THEN Datalength(st.TEXT)
ELSE r.statement_end_offset
END - r.statement_start_offset) / 2) + 1) AS statement_text,
    Coalesce(Quotename(Db_name(st.dbid)) + N'.' + Quotename(Object_schema_name(st.objectid, st.dbid)) + N'.' +
    Quotename(Object_name(st.objectid, st.dbid)), '') AS command_text,
    r.command,
    s.login_name,
    s.host_name,
    s.program_name,
    s.last_request_end_time,
    s.login_time,
    r.open_transaction_count
FROM sys.dm_exec_sessions AS s
    JOIN sys.dm_exec_requests AS r
ON r.session_id = s.session_id
    CROSS APPLY sys.Dm_exec_sql_text(r.sql_handle) AS st
WHERE r.session_id != @@SPID
ORDER BY r.cpu_time desc

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

6
Saadat 5 Ноя 2018 в 11:18

Для подхода с графическим интерфейсом я бы взглянул на Activity Monitor в разделе Management и отсортировал по CPU.

3
cmsjr 3 Июн 2009 в 14:40