O Affinity não "ajusta o uso da CPU" (por exemplo, no caso em que as CPUs executam menos trabalho), permite desativar uma CPU (talvez disponibilizá-la para outra instância na mesma máquina) ou definir uma CPU para ajuda apenas com E / S. Mesmo se você tivesse várias CPUs, você não seria capaz de usar a primeira para ajudar com sua meta, e é impossível adivinharmos sobre a segunda, porque não sabemos o que está aumentando o uso da CPU. Pode ser devido à indexação extremamente ruim, compilações excessivas, abundância de UDFs escalares, e / S debulhando, quem sabe? (E a razão pela qual a E / S pode ser a causa é que, se o seu banco de dados for maior que 3 GB ou mais, ele terá que trocar constantemente os dados dentro e fora da memória do buffer pool, e isso afeta a CPU.)
O cache da CPU também é uma toca de coelho que você não precisa descer. Eu duvido muito que sua CPU esteja atingindo 95% por causa de problemas com o cache da CPU.
Para ajudar a diminuir a fonte de pressão da CPU e supondo que você esteja usando procedimentos armazenados, você pode dar uma olhada nesta consulta de diagnóstico de Glenn Berry ( originária daqui ) - certifique-se de executá-la no contexto do banco de dados correto:
-- 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
Se você não estiver usando procedimentos armazenados, este exemplo de John Samson pode ajudar a isolar consultas ad hoc ( originárias daqui ):
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);
Você também pode dar uma olhada no sp_WhoIsActive de Adam Machanic , um procedimento armazenado que pode analisar rapidamente todas as consultas em execução no momento e permitir que você as classifique da maneira que desejar (por exemplo, no seu caso @sort_order = '[CPU] DESC'
).
Porém, a primeira coisa que eu faria - principalmente se isso é realmente essencial para as equipes de busca e resgate - é comprar um hardware melhor. Você deve ter mais CPUs e mais RAM para atender ao seu aplicativo. Você também precisa absolutamente de uma melhor disponibilidade alta (por exemplo, clustering, espelhamento ou grupos de disponibilidade). Não há razão para que a reinicialização de uma máquina física deixe seu aplicativo completamente offline - temos soluções melhores para esse problema. E, finalmente, presumo que esse "servidor" tenha apenas uma unidade de disco giratório. Isso significa que todas as E / S - do SO, dos arquivos de dados, arquivos de log, tempdb etc. do SQL Server, passam por um único controlador e compartilham atividades de leitura / gravação em uma única unidade. Obtenha mais discos. Obtenha SSDs se / onde você puder. Use RAID e tente espalhar a E / S o máximo possível.
Dito isso, jogar o hardware no problema não será a única parte da correção. Você precisa isolar exatamente o que está causando o uso excessivo da CPU e atacar esses problemas, independentemente do hardware em que está.
Consulte também esta pergunta StackOverflow para outras idéias:
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server