Мой процессор SQL Server на протяжении большей части сегодняшнего дня находится на уровне около 90%.
Я не могу перезапустить его, потому что он постоянно используется.
Можно ли узнать, что в SQL вызывает такую перегрузку процессора?
Я запустил SQL Profiler, но происходит так много всего, что трудно сказать, вызывает ли это что-то конкретное.
Я запустил sp_who2, но не уверен, что именно все означает, и можно ли здесь выявить возможные проблемы.
Чтобы предотвратить любые ответы «это, вероятно, просто много используется», это сработало только сегодня с совершенно нормальных уровней активности.
Мне нужен какой-либо способ найти, что вызывает проблемы с процессором в SQL.
6 ответов
Я предполагаю, что при должной осмотрительности вы подтвердили, что ЦП фактически потребляется процессом SQL (счетчики категорий процессов perfmon подтвердят это). Обычно для таких случаев вы берете образец соответствующих счетчиков производительности и сравниваете их с базовыми показателями, установленными вами в условиях нормальной нагрузки. Как только вы решите эту проблему, я рекомендую вам установить такую основу для будущих сравнений.
Вы можете точно узнать, на что SQL расходует каждый цикл ЦП. Но чтобы знать, где искать, нужно много знаний и опыта. Это SQL 2005/2008 или 2000? К счастью, для 2005 года и новее есть несколько готовых решений. У вас уже есть пара хороших указателей с ответом Джона Самсона. Я хотел бы добавить рекомендацию по загрузке и установке Отчеты панели мониторинга производительности SQL Server. Некоторые из этих отчетов включают самые популярные запросы по времени или по вводу-выводу, наиболее часто используемые файлы данных и т. Д., И вы можете быстро понять, в чем проблема. Вывод является как числовым, так и графическим, поэтому он более полезен для новичков.
Я также рекомендовал бы использовать сценарий Adam's Who is Active, хотя он немного более продвинутый.
И последнее, но не менее важное: я рекомендую вам загрузить и прочитать технический документ группы поддержки клиентов MS SQL по анализу производительности: SQL 2005 Waits and Queues.
Я также рекомендую посмотреть на ввод-вывод. Если вы добавили на сервер нагрузку, которая уничтожает буферный пул (т.е. ему нужно столько данных, что он вытесняет кешированные страницы данных из памяти), результатом будет значительное увеличение ЦП (звучит удивительно, но это правда). Обычно виноват новый запрос, который сканирует большую таблицу от начала до конца.
Этот запрос использует 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 по ЦП
Выполните любой из них с интервалом в несколько секунд. Вы обнаружите высокую скорость подключения ЦП. Или: сохраненный ЦП в локальной переменной, WAITFOR DELAY, сравнение сохраненных и текущих значений ЦП
select * from master..sysprocesses
where status = 'runnable' --comment this out
order by CPU
desc
select * from master..sysprocesses
order by CPU
desc
Может быть, не самым элегантным, но эффективным и быстрым.
Вы можете запустить SQL Profiler и отфильтровать по ЦП или продолжительности, чтобы исключить все «мелочи». Тогда должно быть намного проще определить, есть ли у вас проблема, например, конкретная сохраненная процедура, которая работает намного дольше, чем должна (может быть отсутствующий индекс или что-то в этом роде).
Два предостережения:
- Если проблема заключается в большом количестве крошечных транзакций, то описанный выше фильтр их исключит, и вы это пропустите.
- Кроме того, если проблема заключается в одной большой работе (например, 8-часовом анализе или плохо спроектированном выборе, который должен перекрестно объединить миллиард строк), вы можете не увидеть этого в профилировщике, пока она не будет полностью выполнена, в зависимости от о том, какие события вы профилируете (sp: completed vs sp: statementcompleted).
Но обычно я начинаю с монитора активности или sp_who2.
Здесь вы можете найти полезный запрос:
Исследование причины высокой загрузки ЦП 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 вы можете найти задачу, которая в данный момент потребляет больше всего ресурсов процессора.
Для подхода с графическим интерфейсом я бы взглянул на Activity Monitor в разделе Management и отсортировал по CPU.
Похожие вопросы
Связанные вопросы
Новые вопросы
sql-server
Microsoft SQL Server - это система управления реляционными базами данных (RDBMS). Используйте этот тег для всех выпусков SQL Server, включая Compact, Express, Azure, Fast-track, APS (ранее PDW) и Azure SQL DW. Не используйте этот тег для других типов СУБД (MySQL, PostgreSQL, Oracle и т. Д.). Не используйте этот тег для проблем, связанных с разработкой программного обеспечения и мобильных устройств, если только он не связан напрямую с базой данных.