Как узнать, что забивает мой SQL-сервер?


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

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

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

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

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

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

Я после любого способа найти то, что вызывает печаль процессора в SQL.

5 55

5 ответов:

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

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

Я бы также рекомендовал использовать Адам, который активен скрипт, хотя это немного более продвинутый.

и последнее, но не менее важное я рекомендую вам скачать и прочитать технический документ MS SQL Customer Advisory Team по анализу производительности:SQL 2005 ждет и ставит в очередь.

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

этот запрос использует DMV для определения наиболее дорогостоящих запросов по CPU

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 по CPU

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

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

select * from master..sysprocesses
order by CPU
desc

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

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

два вопроса:

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

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

для подхода GUI я бы взглянул на монитор активности под управлением и сортировку по процессору.