Afinite "CPU kullanımını ayarlamaz" (örneğin, durumda CPU'ların daha az iş yapmasını sağlar), bir CPU'yu kapatmanıza (belki de aynı makinedeki başka bir örnek için kullanılabilir hale getirmenize) veya CPU'yu yalnızca G / Ç ile yardım. Birden fazla CPU'nuz olsa bile, hedefinize yardımcı olması için ilkini kullanamazsınız ve ikincisini tahmin etmemiz imkansızdır çünkü CPU kullanımınızı neyin bu kadar yüksek yaptığını bilmiyoruz. Son derece zayıf indeksleme, aşırı derlemeler, skaler UDF'lerin bolluğu, I / O thrashing, kim bilir biliyor? (Ve I / O'nun nedeni olabilmesinin nedeni, veritabanınız 3 GB veya daha büyükse, sürekli olarak arabellek havuzu belleğine girip çıkması gerektiğidir ve bu da CPU'ya zarar verir.)
CPU önbelleği de aşağı inmenize gerek olmayan bir tavşan deliğidir. CPU önbelleğinizle ilgili sorunlar nedeniyle CPU'nuzun% 95 oranında çöktüğünden şüpheleniyorum.
CPU baskısının kaynağını daraltmanıza ve saklı yordamları kullandığınızı varsayarsak, bu tanılama sorgusuna Glenn Berry'den ( buradan kaynaklanır ) göz atabilirsiniz - doğru veritabanı bağlamında çalıştırdığınızdan emin olun:
-- Top Cached SPs By Total Worker time (SQL Server 2012).
-- Worker time relates to CPU cost (Query 44) (SP Worker Time)
SELECT TOP (25)
p.name AS [SP Name],
qs.total_worker_time AS [TotalWorkerTime],
qs.total_worker_time/qs.execution_count AS [AvgWorkerTime],
qs.execution_count,
ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0)
AS [Calls/Second],
qs.total_elapsed_time,
qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time],
qs.cached_time
FROM sys.procedures AS p WITH (NOLOCK)
INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);
-- This helps you find the most expensive cached stored procedures from a CPU perspective
-- You should look at this if you see signs of CPU pressure
Saklı yordamlar kullanmıyorsanız, John Samson'un bu örneği geçici sorguları ( buradan kaynaklanır ) izole etmeye yardımcı olabilir :
SELECT TOP (25)
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 OPTION (RECOMPILE);
Ayrıca , şu anda çalışan tüm sorguları hızlı bir şekilde analiz edebilen ve istediğiniz gibi sıralamanıza izin veren saklı bir prosedür olan Adam Machanic'in sp_WhoIsActive'ine bir göz atabilirsiniz@sort_order = '[CPU] DESC'
.
İlk yapacağım şey - özellikle de bu gerçekten arama ve kurtarma ekipleri için kritik bir görevse - daha iyi bir donanım satın almak. Uygulamanıza hizmet vermek için daha fazla CPU'nuz ve daha fazla RAM'iniz olmalıdır. Ayrıca kesinlikle daha iyi yüksek kullanılabilirliğe ihtiyacınız vardır (örneğin kümeleme, yansıtma veya Kullanılabilirlik Grupları). Fiziksel bir makinenin yeniden başlatılmasının uygulamanızı tamamen çevrimdışına almasının bir nedeni yoktur - bu sorun için daha iyi çözümlerimiz var. Ve son olarak, bu "sunucu" sadece bir spinny disk sürücüsü olduğunu varsayalım. Bu, işletim sisteminden, SQL Server veri dosyalarından, günlük dosyalarından, tempdb vb. Gelen tüm G / Ç'nin tek bir denetleyiciden geçtiği ve okuma / yazma etkinliğini tek bir sürücüde paylaştığı anlamına gelir. Daha fazla disk alın. Mümkünse / varsa SSD'leri alın. RAID kullanın ve G / Ç'yi mümkün olduğunca yaymaya çalışın.
Tüm bunların söylendiği gibi, donanımın problemi atması düzeltmenin tek parçası olmayacak. Aşırı CPU kullanımına neyin sebep olduğunu tam olarak yalıtmanız ve ardından hangi donanımda olursanız olun bu sorunlara saldırmanız gerekir.
Diğer bazı fikirler için şu StackOverflow sorusuna da bakın:
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server