Сходство не «регулирует загрузку ЦП» (например, в вашем случае заставляет ЦП выполнять меньше работы), оно позволяет либо отключить ЦП (возможно, чтобы сделать его доступным для другого экземпляра на той же машине), либо установить ЦП на помощь только с вводом / выводом. Даже если бы у вас было несколько процессоров, вы не смогли бы использовать первый, чтобы помочь вам в достижении вашей цели, и мы не можем догадаться о втором, потому что мы не знаем, что приводит к такому высокому использованию вашего процессора. Это может быть из-за крайне плохой индексации, излишней компиляции, обилия скалярных UDF, перебоя ввода-вывода, кто знает? (И причина того, что ввод-вывод может быть причиной, заключается в том, что если ваша база данных больше 3 ГБ или около того, ей постоянно приходится обмениваться данными в и из памяти буферного пула, и это сказывается на ЦП.)
Кроме того, кэш-память процессора - это кроличья нора, которую вам не нужно закрывать. Я очень сомневаюсь, что ваш процессор работает на 95% из-за проблем с вашим кешем.
Чтобы сузить источник нагрузки на процессор и предположить, что вы используете хранимые процедуры, вы можете взглянуть на этот диагностический запрос от Гленна Берри ( источник отсюда ) - убедитесь, что вы запускаете его в контексте нужной базы данных:
-- 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
Если вы не используете хранимые процедуры, то этот пример от Джона Самсона может помочь изолировать специальные запросы ( отсюда ):
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);
Вы также можете взглянуть на sp_WhoIsActive Адама Мачаника , хранимую процедуру, которая может быстро проанализировать все выполняющиеся в данный момент запросы и позволить вам отсортировать их по своему усмотрению (например, в вашем случае @sort_order = '[CPU] DESC'
).
Первое, что я хотел бы сделать - особенно если это действительно важно для поисково-спасательных команд - это купить лучшее оборудование. У вас должно быть больше процессоров и больше оперативной памяти для обслуживания вашего приложения. Вам также абсолютно необходима лучшая высокая доступность (например, кластеризация, зеркалирование или группы доступности). Нет никаких причин, по которым перезагрузка физического компьютера должна переводить ваше приложение в автономный режим - у нас есть лучшие решения для этой проблемы. И, наконец, я предполагаю, что этот «сервер» имеет только один спиннид. Это означает, что все операции ввода-вывода - из операционной системы, из файлов данных SQL Server, файлов журналов, базы данных tempdb и т. Д. - проходят через один контроллер и совместно используют операции чтения / записи на одном диске. Получите больше дисков. Получить SSD, если / где вы можете. Используйте RAID и постарайтесь максимально расширить возможности ввода-вывода.
Это все сказало, бросая аппаратные средства в проблему не будет единственной частью исправления. Вы должны точно определить, что вызывает чрезмерную загрузку процессора, а затем атаковать эти проблемы, независимо от того, на каком оборудовании вы находитесь.
Также посмотрите этот вопрос StackOverflow для некоторых других идей:
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server