Afinitas tidak "menyesuaikan penggunaan CPU" (misalnya dalam kasus Anda membuat CPU melakukan lebih sedikit pekerjaan), itu memungkinkan Anda untuk mematikan CPU (mungkin untuk membuatnya tersedia untuk contoh lain pada mesin yang sama) atau mengatur CPU untuk bantuan dengan I / O saja. Bahkan jika Anda memiliki banyak CPU, Anda tidak akan dapat menggunakan yang pertama untuk membantu tujuan Anda, dan tidak mungkin bagi kami untuk menebak yang terakhir karena kami tidak tahu apa yang mendorong penggunaan CPU Anda begitu tinggi. Bisa jadi karena pengindeksan yang sangat buruk, kompilasi berlebihan, UDF skalar berlimpah, meronta-ronta I / O, siapa tahu? (Dan alasan I / O bisa menjadi penyebabnya adalah bahwa jika database Anda lebih besar dari 3 GB atau lebih, itu akan terus-menerus harus menukar data masuk dan keluar dari memori buffer pool, dan ini akan berdampak pada CPU.)
Cache CPU, juga, adalah lubang kelinci Anda tidak perlu turun. Saya sangat ragu CPU Anda meronta-ronta pada 95% karena masalah dengan cache CPU Anda.
Untuk membantu mempersempit sumber tekanan CPU, dan dengan asumsi Anda menggunakan prosedur tersimpan, Anda dapat melihat permintaan diagnostik ini dari Glenn Berry ( bersumber dari sini ) - pastikan Anda menjalankannya dalam konteks database yang tepat:
-- 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
Jika Anda tidak menggunakan prosedur tersimpan, maka contoh dari John Samson ini dapat membantu mengisolasi kueri ad hoc ( bersumber dari sini ):
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);
Anda juga dapat melihat sp_WhoIsActive Adam Machanic , prosedur tersimpan yang dapat dengan cepat menganalisis semua permintaan yang sedang berjalan, dan memungkinkan Anda untuk mengurutkannya sesuai keinginan Anda (misalnya dalam kasus Anda @sort_order = '[CPU] DESC'
).
Namun, hal pertama yang akan saya lakukan - terutama jika ini benar-benar penting untuk tim pencarian dan penyelamatan - adalah membeli perangkat keras yang lebih baik. Anda harus memiliki lebih banyak CPU dan lebih banyak RAM untuk melayani aplikasi Anda. Anda juga benar-benar membutuhkan ketersediaan tinggi yang lebih baik (mis. Pengelompokan, mirroring atau Ketersediaan Grup). Tidak ada alasan bahwa reboot mesin fisik harus membuat aplikasi Anda sepenuhnya offline - kami memiliki solusi yang lebih baik untuk masalah itu. Dan akhirnya, saya kira "server" ini hanya memiliki satu drive disk spinny. Ini berarti bahwa semua I / O - dari OS, dari file data SQL Server, file log, tempdb, dll. Semua melalui pengontrol tunggal dan berbagi aktivitas baca / tulis pada satu drive. Dapatkan lebih banyak disk. Dapatkan SSD jika / di mana Anda bisa. Gunakan RAID dan coba sebarkan I / O sebanyak mungkin.
Itu semua mengatakan, melempar perangkat keras pada masalah tidak akan menjadi satu-satunya bagian dari perbaikan. Anda perlu mengisolasi apa yang menyebabkan penggunaan CPU berlebih dan kemudian menyerang masalah-masalah itu tidak peduli perangkat keras apa yang Anda gunakan.
Lihat juga pertanyaan StackOverflow ini untuk beberapa ide lain:
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server