Affinity ne "règle pas l'utilisation du CPU" (par exemple, dans votre cas, les CPU effectuent moins de travail), il vous permet soit d'éteindre un CPU (peut-être pour le rendre disponible à une autre instance sur la même machine), soit de définir un CPU sur aide aux E / S uniquement. Même si vous aviez plusieurs processeurs, vous ne seriez pas en mesure d'utiliser le premier pour vous aider à atteindre votre objectif, et il nous est impossible de deviner le dernier car nous ne savons pas ce qui fait que votre utilisation du processeur est si élevée. Cela pourrait être dû à une indexation extrêmement médiocre, à des compilations excessives, à une abondance d'UDF scalaires, à un thrash d'E / S, qui sait? (Et la raison pour laquelle les E / S pourraient être la cause est que si votre base de données est supérieure à 3 Go environ, elle devra constamment échanger des données dans et hors de la mémoire du pool de mémoire tampon, et cela pèse lourd sur le processeur.)
Le cache du processeur est également un trou de lapin que vous n'avez pas besoin de descendre. Je doute fortement que votre CPU bat à 95% en raison de problèmes avec le cache de votre CPU.
Pour aider à réduire la source de pression du processeur et en supposant que vous utilisez des procédures stockées, vous pouvez consulter cette requête de diagnostic de Glenn Berry ( provenant d'ici ) - assurez-vous de l'exécuter dans le contexte de la bonne base de données:
-- 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
Si vous n'utilisez pas de procédures stockées, cet exemple de John Samson peut aider à isoler les requêtes ad hoc ( provenant d'ici ):
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);
Vous pouvez également jeter un oeil à Adam de Machanic sp_WhoIsActive , une procédure stockée qui permet d' analyser rapidement toutes les requêtes en cours d' exécution, et vous permettent de trier cependant que vous voulez (par exemple dans votre cas @sort_order = '[CPU] DESC'
).
Cependant, la première chose que je ferais - en particulier si c'est vraiment essentiel pour les équipes de recherche et de sauvetage - est d'acheter un meilleur matériel. Vous devriez avoir plus de CPU et plus de RAM pour gérer votre application. Vous avez également absolument besoin d'une meilleure haute disponibilité (par exemple, mise en cluster, mise en miroir ou groupes de disponibilité). Il n'y a aucune raison qu'un redémarrage d'une machine physique devrait mettre votre application complètement hors ligne - nous avons de meilleures solutions pour ce problème. Et enfin, je suppose que ce "serveur" n'a qu'un seul lecteur de disque rotatif. Cela signifie que toutes les E / S - du système d'exploitation, des fichiers de données SQL Server, des fichiers journaux, tempdb, etc. passent toutes par un seul contrôleur et partagent l'activité de lecture / écriture sur un seul lecteur. Obtenez plus de disques. Obtenez des SSD si / où vous le pouvez. Utilisez RAID et essayez de répartir les E / S autant que possible.
Cela dit, jeter du matériel sur le problème ne sera pas la seule partie du correctif. Vous devez isoler exactement ce qui cause une utilisation excessive du processeur, puis attaquer ces problèmes, quel que soit le matériel sur lequel vous vous trouvez.
Consultez également cette question StackOverflow pour d'autres idées:
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server