Affinity "passt die CPU-Auslastung nicht an" (z. B. in Ihrem Fall die CPUs weniger arbeiten lassen), sondern ermöglicht es Ihnen, entweder eine CPU auszuschalten (möglicherweise, um sie einer anderen Instanz auf demselben Computer zur Verfügung zu stellen) oder eine CPU auf einzustellen Hilfe nur mit E / A. Selbst wenn Sie mehrere CPUs hätten, könnten Sie erstere nicht verwenden, um Ihr Ziel zu erreichen, und wir können letztere nicht erraten, da wir nicht wissen, was Ihre CPU-Auslastung so hoch treibt. Es könnte an einer extrem schlechten Indizierung, übermäßigen Kompilierungen, einer Fülle skalarer UDFs und E / A-Thrashing liegen, wer weiß? (Und der Grund, warum E / A die Ursache sein könnte, ist, dass Ihre Datenbank, wenn sie größer als 3 GB ist, ständig Daten in den Pufferpoolspeicher und aus diesem heraus austauschen muss, was die CPU belastet.)
Der CPU-Cache ist auch ein Kaninchenbau, den Sie nicht herunterfahren müssen. Ich bezweifle sehr, dass Ihre CPU aufgrund von Problemen mit Ihrem CPU-Cache zu 95% überlastet ist.
Um die Quelle des CPU-Drucks einzugrenzen und davon auszugehen, dass Sie gespeicherte Prozeduren verwenden, können Sie sich diese Diagnoseabfrage von Glenn Berry ( von hier bezogen ) ansehen. Stellen Sie sicher, dass Sie sie im Kontext der richtigen Datenbank ausführen:
-- 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
Wenn Sie keine gespeicherten Prozeduren verwenden, kann dieses Beispiel von John Samson helfen, Ad-hoc-Abfragen zu isolieren ( von hier bezogen ):
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);
Sie können sich auch Adam Machanics sp_WhoIsActive ansehen , eine gespeicherte Prozedur, mit der alle aktuell ausgeführten Abfragen schnell analysiert und sortiert werden können, wie Sie möchten (z. B. in Ihrem Fall @sort_order = '[CPU] DESC').
Das erste, was ich tun würde - insbesondere wenn dies für Such- und Rettungsteams wirklich geschäftskritisch ist - ist, bessere Hardware zu kaufen. Sie sollten mehr CPUs und mehr RAM haben, um Ihre Anwendung zu warten. Sie benötigen außerdem unbedingt eine bessere Hochverfügbarkeit (z. B. Clustering, Spiegelung oder Verfügbarkeitsgruppen). Es gibt keinen Grund, warum ein Neustart eines physischen Computers Ihre Anwendung vollständig offline schalten sollte - wir haben bessere Lösungen für dieses Problem. Und schließlich gehe ich davon aus, dass dieser "Server" nur ein Spinny-Laufwerk hat. Dies bedeutet, dass alle E / A - vom Betriebssystem, von SQL Server-Datendateien, Protokolldateien, Tempdb usw. - einen einzigen Controller durchlaufen und Lese- / Schreibaktivitäten auf einem einzigen Laufwerk gemeinsam nutzen. Holen Sie sich mehr Festplatten. Holen Sie sich SSDs, wenn / wo Sie können. Verwenden Sie RAID und versuchen Sie, die E / A so weit wie möglich zu verteilen.
Trotzdem wird das Werfen von Hardware auf das Problem nicht der einzige Teil der Lösung sein. Sie müssen genau isolieren, was zu einer übermäßigen CPU-Auslastung führt, und diese Probleme dann angreifen, unabhängig davon, auf welcher Hardware Sie sich befinden.
In dieser StackOverflow-Frage finden Sie auch einige andere Ideen:
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server