Высокое использование ЦП SQL Server 2008

У нас есть сервер Windows 2008 R2 с SQL Server 2008. Этот сервер имеет несколько узлов .net, на которых есть базы данных SQL Server.

В настоящее время мы испытываем среднее использование ЦП на 95%, и SQL Server несет ответственность за большую часть этого использования.

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

Я искал, мог ли я найти:

  • База данных, которая получает наиболее интенсивные запросы с процессором
  • Процесс, отвечающий за интенсивные запросы CPU

Одна вещь, которая также усложняет ситуацию, состоит в том, что у нас есть несколько сайтов и "крон", использующих одну и ту же базу данных. Поэтому, как только я идентифицирую базу данных, мне также нужно будет получить некоторые подсказки, за которые отвечает сайт /cron.

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

Спасибо

Ответ 1

Вы можете определить дорогостоящие запросы (и связанные с ними базы данных) с использованием DMV, например. из этой статьи TechNet:

SELECT TOP 50
 [Average CPU used] = total_worker_time / qs.execution_count,
 [Total CPU used] = total_worker_time,
 [Execution count] = qs.execution_count,
 [Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 
         (CASE WHEN qs.statement_end_offset = -1 
            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 
          ELSE qs.statement_end_offset END - 
qs.statement_start_offset)/2)
,[Parent Query] = qt.text
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY [Average CPU used] DESC;

Они расскажут вам о тяжелых запросах для нападающих, но, к сожалению, он не будет определять базу данных, которая может иметь очень большой объем небольших запросов, которые используют небольшие биты процессора отдельно, но большие биты в совокупности. Вы можете сделать это с помощью этого запроса от запросов Glenn Allan Berry DMV:

WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], 
  SUM(total_worker_time) AS [CPU_Time_Ms]
 FROM sys.dm_exec_query_stats AS qs
 CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] 
              FROM sys.dm_exec_plan_attributes(qs.plan_handle)
              WHERE attribute = N'dbid') AS F_DB
 GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
       DatabaseName, [CPU_Time_Ms], 
       CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) 
       OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);

Ни один из этих запросов не определяет приложение, которое их запускало, а используемые DMV не хранят эту информацию (вам нужно будет уловить запросы в действии и отметить имя приложения в sys.dm_exec_sessions или просмотреть трассировку).

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

Ответ 2

В качестве альтернативы вы можете использовать монитор Activity для просмотра состояния работоспособности серверов. Оттуда вы сможете выделить длинные запросы, любые блокировки, такие как блокировка строк, блокировка таблицы и т.д.

http://www.mssqltips.com/sqlservertip/1917/performance-analysis-using-sql-server-2008-activity-monitor-tool/