2012-04-25 1 views
11

İçinde bir SQL Server 2008 bulunan bir Windows 2008 R2 Server var. Bu sunucuda SQL sunucu veritabanlarına sahip birden çok .net sitesi var.SQL Server 2008 Yüksek CPU kullanımı

Şu anda ortalama% 95 CPU kullanımı yaşıyoruz ve SQL Server bu kullanımın çoğundan sorumludur.

Bunun için hangi sitenin sorumlu olduğunu belirtmek isteriz, bu yüzden ya onu optimize edebilir veya başka bir sunucuya taşıyabiliriz. Ama ben buna bakmanın doğrudan bir yolunu bulamadım. Bulabildiğim takdirde

ben arıyordum:

  • en CPU yoğun sorgular
  • CPU yoğun sorgular

bir şey sorumludur süreç oluyor veritabanı Bu da karmaşık bir şeydir, aynı veritabanını kullanarak birden fazla siteye ve "crons" a sahip olduğumuzdur. Bu yüzden veritabanını belirledikten sonra, hangi site/cron'un sorumlu olduğuna dair bazı ipuçları almam gerekiyor. DMVs kullanarak

bu konu bizim siteler gerçekten yavaş yapıyor gibi ben gerçekten bu konuda herhangi bir yardım takdir ediyorum

...

Teşekkür

cevap

27

Sen masraflı sorguları (ve ilişkili veritabanları) belirleyebilir , Örneğin 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; 

Bunlar ağır vurucu sorguları hakkında söyleyecektir, ama maalesef tek tek CPU küçük bit kullanan küçük sorgular ama toplamda büyük bit çok yüksek hacme sahip olabilecek bir veritabanı saptamak olmaz.

bu sorguları
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); 

Ne onları koştu uygulama tanımlar ve DMVs bu bilgiyi saklamayın kullanılan (Suçüstü ve notta sorguları yakalamak gerekir: Bu sorguda from Glenn Allan Berry's DMV queries ile yapabilirsiniz uygulama adını sys.dm_exec_sessions veya bir izleme gözden geçirin).

Tabii ki, bu çalışmayı piyasadaki çeşitli 3. taraf performans araçlarıyla otomatik hale getirebilirsiniz (feragatname: Bunlardan biri için çalışıyorum, SQL Sentry, Performance Advisor üretir; yüksek maliyetli sorgulamalar ve hangi veritabanında çalıştırıldıkları ve hangi uygulama denir?