선호도는 "CPU 사용을 조정"하지 않습니다 (예를 들어 CPU가 더 적은 작업을 수행하도록 함). CPU를 끄거나 (같은 머신의 다른 인스턴스에서 사용 가능하도록) CPU를 I / O 만 지원하십시오. CPU가 여러 개인 경우에도 이전 CPU를 사용하여 목표를 달성 할 수 없으며, CPU 사용량이 많은 이유를 알지 못하므로 후자를 추측하는 것은 불가능합니다. 인덱싱이 극도로 열악하고 컴파일이 너무 많거나 스칼라 UDF가 풍부하고 I / O 스 래싱이 원인 일 수 있습니다. (그리고 I / O가 원인 일 수있는 이유는 데이터베이스가 3GB 이상인 경우 지속적으로 버퍼 풀 메모리 안팎으로 데이터를 교환해야하기 때문에 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이 있어야합니다. 또한 더 나은 고 가용성 (예 : 클러스터링, 미러링 또는 가용성 그룹)이 필요합니다. 물리적 시스템을 재부팅하여 애플리케이션을 완전히 오프라인 상태로 만들어야 할 이유는 없습니다.이 문제에 대한 더 나은 솔루션이 있습니다. 마지막으로이 "서버"에는 하나의 가시 디스크 드라이브 만 있다고 가정합니다. 이는 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