web-dev-qa-db-fra.com

SQL Server 2008 Utilisation du processeur élevée

Nous avons un serveur Windows 2008 R2 avec un serveur SQL Server 2008. Ce serveur a plusieurs sites .net contenant des bases de données SQL Server. 

Nous utilisons actuellement une utilisation moyenne du processeur de 95%, et SQL Server est responsable de la majeure partie de cette utilisation. 

J'aimerais identifier le site responsable de cette opération afin que nous puissions l'optimiser ou le transférer sur un autre serveur. Mais je n'ai trouvé aucun moyen direct de regarder cela.

J'ai cherché si je pouvais trouver:

  • La base de données qui reçoit les requêtes les plus intensives en CPU
  • Le processus responsable des requêtes gourmandes en ressources processeur

Une chose qui complique également les choses est que nous avons plusieurs sites et "crons" utilisant la même base de données. Donc, une fois la base de données identifiée, il me faudrait aussi des conseils sur le site/cron qui en est responsable.

J'apprécierais vraiment toute aide à ce sujet car cette question ralentit considérablement la vitesse de nos sites ... 

Merci

11
Juan

Vous pouvez identifier les requêtes coûteuses (et les bases de données auxquelles elles sont associées) à l'aide des DMV, par exemple. de cet article 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;

Celles-ci vous renseigneront sur les requêtes lourdes, mais malheureusement, elles ne localiseront pas une base de données pouvant contenir un très grand nombre de petites requêtes utilisant de petits bits de processeur individuellement, mais de gros bits globalement. Vous pouvez le faire avec cette requête à partir des requêtes DMV de Glenn Allan Berry :

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

Aucune de ces requêtes n'identifie l'application qui les a exécutées et les DMV utilisés ne stockent pas ces informations (vous devez attraper les requêtes dans l'acte et noter le nom de l'application dans sys.dm_exec_sessions ou consulter une trace).

Bien sûr, vous pouvez automatiser ce travail avec divers outils de performance tiers disponibles sur le marché (avertissement: je travaille pour l'un d'eux, SQL Sentry, qui produit Performance Advisor , qui effectue tout ce qui précède, y compris le suivi des requêtes coûteuses et la maintenance des informations sur la base de données dans laquelle elles ont été exécutées et quelle application les a appelées).

27
Aaron Bertrand

Vous pouvez également utiliser le moniteur d'activité pour afficher l'état d'intégrité de vos serveurs. À partir de là, vous pourrez identifier les requêtes de longue durée, les verrous tels que le verrouillage de ligne, de table, etc. 

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

0
Amal Dev