2012-04-25 15 views
11

Tenemos un servidor de Windows 2008 R2 con un servidor SQL 2008 en él. Ese servidor tiene múltiples sitios .net que tienen bases de datos de SQL Server en él.SQL Server 2008 Alto uso de CPU

Actualmente estamos experimentando un uso promedio de CPU del 95%, y SQL Server es responsable de la mayor parte de ese uso.

Me gustaría identificar qué sitio es responsable de esto para que podamos optimizarlo o moverlo a otro servidor. Pero no encontré ninguna forma directa de mirar esto.

He estado buscando si podía encontrar:

  • La base de datos que está recibiendo la mayor parte de la CPU consultas intensivas
  • El proceso que se encarga de la CPU consultas intensivas

Una cosa eso también complica las cosas, es que tenemos múltiples sitios y "crons" usando la misma base de datos. Entonces, una vez que identifico la base de datos, también necesito obtener algunas pistas de qué sitio/cron es responsable de ello.

Realmente agradecería cualquier ayuda en este tema ya que esto es hacer nuestros sitios muy lento ...

Gracias

Respuesta

27

Puede identificar las consultas costosas (y las bases de datos que están asociados con las DMV) usando , p.ej from this TechNet article:

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; 

Estos le dirá sobre las consultas de peso pesado, pero por desgracia no será localizar una base de datos que podría tener un volumen muy alto de pequeñas consultas que utilizan pequeños trozos de la CPU de forma individual sino trozos grandes en su conjunto. Usted puede hacer eso con esta consulta from Glenn Allan Berry's DMV queries:

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); 

Ninguna de estas consultas identifica la aplicación que los corrió, y los DMV utiliza No almacenar esa información (que tendría que coger las consultas en el acto y la nota el nombre de la aplicación en sys.dm_exec_sessions, o revisar un seguimiento).

Por supuesto, puede automatizar este trabajo con una variedad de herramientas de rendimiento de terceros en el mercado (descargo de responsabilidad: yo trabajo para uno de ellos, SQL Sentry, que produce Performance Advisor, que hace todo lo anterior, incluyendo el seguimiento de consultas de alto costo y mantenimiento de la información sobre la base de datos en la que se ejecutaron y qué aplicación las llamó).