스레드를 사용할 수 있는데도 스레드 풀 대기가있는 이유는 무엇입니까?
신청 시간이 초과되는 것을 확인하고 First Responder Kit의 도움으로 세부 정보를 캡처했습니다. 내 관심을 끈 것 중 하나는 다음과 같습니다.
독 대기 감지 : 스레드 풀
그래서 아래 쿼리를 실행했습니다.
---get thread pool waits---thread pool wait query
SELECT count(*) FROM sys.dm_os_waiting_tasks
where wait_type ='threadpool'
-- get threads available--Threads available query
declare @max int
select @max = max_workers_count from sys.dm_os_sys_info
select
@max as 'TotalThreads',
sum(active_Workers_count) as 'CurrentThreads',
@max - sum(active_Workers_count) as 'AvailableThreads',
sum(runnable_tasks_count) as 'WorkersWaitingForCpu',
sum(work_queue_count) as 'RequestWaitingForThreads' ,
sum(current_workers_count) as 'AssociatedWorkers',
Getdate() as 'DateLogged'
from
sys.dm_os_Schedulers where status='VISIBLE ONLINE'
"스레드 풀 대기"쿼리를 실행하면 스레드 풀 대기가 위의 결과 (때로는 20 개 이상의 결과)에 몇 초 동안 나타나고 다시 실행하면 사라집니다. 그러나 "threads available"쿼리를 통해 두 번째 결과 집합에서 400 개 이상의 스레드를 사용할 수 있다는 것을 알 수있었습니다.
THREADPOOL
첫 번째 쿼리를 실행할 때 대기 하는 이유를 이해할 수 없지만 두 번째 쿼리는 스레드를 계속 사용할 수 있음을 보여줍니다. 아무도 설명해 주시겠습니까?
- Maxdop : 8
- 최대 병렬 처리 수준 : 50
스레드 풀 대기 :
답변
첫 번째 쿼리를 실행할 때 THREADPOOL이 대기하는 이유를 이해할 수 없지만 두 번째 쿼리는 스레드를 계속 사용할 수 있음을 보여줍니다. 아무도 설명해 주시겠습니까?
THREADPOOL
SQL Server가 운영 체제에서 스레드를 획득하는 동안 매우 짧은 대기 시간 (각각 몇 밀리 초)을 많이 볼 수 있습니다 .
예를 들어 SQL Server가 한동안 유휴 상태였다가 한 번에 여러 병렬 쿼리가 실행되는 경우 이러한 상황이 발생할 수 있습니다. 이러한 쿼리는 OS가 sqlservr.exe 프로세스에 스레드를 제공하여 THREADPOOL
해당 시간 동안 대기를 누적 하는 동안 기다려야합니다.
"Process"-> "Thread Count"PerfMon 카운터를 보면이 문제가 발생하는지 확인할 수 있습니다. 일반적으로이 값이 빠르게 올라갈 때마다 이러한 THREADPOOL
대기 가 표시 될 수 있습니다 .
내 블로그 ( Unusual THREADPOOL Waits ) 에이 동작에 대한 완전한 데모가 있습니다. 요약은 다음과 같습니다.
해당 문서 링크로 돌아 가기 :
작업이 작업자가 실행되기를 기다리는 경우에 발생합니다.
일반적인 경우 이는 SQL Server가 한 번에 보유 할 수있는 작업자 스레드 수에 대해 설정 한 논리적 제한에 도달했기 때문입니다.
비정상적인 경우 SQL Server가 해당 작업자를 지원하는 데 필요한 스레드 (OS에서 요청)를 할당하기 때문에 작업이 작업자를 기다리고 있습니다.
명확하게 말하면 이러한 대기가 애플리케이션 시간 초과의 원인이라면 놀랄 것입니다.