アフィニティは「CPU使用率を調整する」ことはありません(たとえば、CPUの動作を減らします)。これにより、CPUをオフにする(おそらく同じマシンの別のインスタンスで使用できるようにする)か、CPUをI / Oのみで支援します。複数のCPUがあったとしても、前者を使用して目標を達成することはできません。また、CPU使用率が非常に高くなっている原因がわからないため、後者を推測することはできません。それは、非常に貧弱なインデックス作成、過度のコンパイル、豊富なスカラーUDF、I / Oスラッシングが原因である可能性があります。(そして、I / Oが原因である可能性があるのは、データベースが3 GB程度かそれ以上の場合、データがバッファープールメモリとの間で常にスワップされる必要があり、CPUの負荷がかかるためです。)
CPUキャッシュも、ダウンする必要がないうさぎの穴です。CPUキャッシュに問題があるため、CPUが95%でスラッシングしていることは間違いありません。
CPUプレッシャーの原因を絞り込むのに役立ち、ストアドプロシージャを使用していると想定して、Glenn Berryからのこの診断クエリを確認できます(ここから取得)-正しいデータベースのコンテキストで実行してください。
-- 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
ストアドプロシージャを使用していない場合、John Samsonの次の例は、アドホッククエリ(ここから取得)を分離するのに役立ちます。
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);
また、Adam Machanicのsp_WhoIsActiveを確認することもできます。これは、現在実行中のすべてのクエリをすばやく分析し、必要に応じて(たとえば、@sort_order = '[CPU] DESC'
)並べ替えることができるストアドプロシージャです。
ただし、特にこれが本当に捜索救助チームにとってミッションクリティカルである場合、私が最初に行うことは、より優れたハードウェアを購入することです。アプリケーションにサービスを提供するには、より多くのCPUとRAMが必要です。また、より優れた高可用性(クラスタリング、ミラーリング、可用性グループなど)も絶対に必要です。物理マシンを再起動することでアプリケーションが完全にオフラインになる理由はありません。その問題に対するより良い解決策があります。そして最後に、この「サーバー」には1つのディスクドライブしかないと思います。つまり、OS、SQL Serverデータファイル、ログファイル、tempdbなどからのすべてのI / Oはすべて、単一のコントローラーを経由して、単一のドライブで読み取り/書き込みアクティビティを共有します。より多くのディスクを取得します。可能な場合/場所でSSDを取得します。RAIDを使用して、I / Oを可能な限り分散するようにしてください。
つまり、問題にハードウェアを投入することだけが修正の一部になるわけではありません。過度のCPU使用率を引き起こしている原因を正確に特定し、使用しているハードウェアに関係なくこれらの問題に対処する必要があります。
その他のアイデアについては、このStackOverflowの質問もご覧ください。
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server