Affinity不会“调整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以服务您的应用程序。您还绝对需要更好的高可用性(例如,群集,镜像或可用性组)。没有理由重启物理计算机会使您的应用程序完全脱机-我们为该问题提供了更好的解决方案。最后,我假设此“服务器”只有一个棘手的磁盘驱动器。这意味着来自操作系统,SQL Server数据文件,日志文件,tempdb等的所有I / O都将通过单个控制器并共享单个驱动器上的读/写活动。获取更多磁盘。如果可能的话/在可能的地方获得SSD。使用RAID并尝试尽可能多地扩展I / O。
综上所述,将硬件扔到问题上将不是修复的唯一部分。无论您使用的是哪种硬件,都需要准确地找出导致CPU使用率过高的原因,然后解决这些问题。
另请参阅此StackOverflow问题以了解其他一些想法:
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server