SQL Server/SQL Server Tip

Max worker thread 초과 이슈

SungWookKang 2015. 7. 22. 10:45
반응형

Max worker thread 초과 이슈

 

  • Version : SQL Server 2012

 

 

SQL Server는 사용자의 요청을 처리 하기 위해서 작업을 할 수 있도록 리소스를 할당 받는데 시스템의 환경에 따라 최대 작업자 스레드를 자동으로 할당하기도 하며 설정 값 변경을 통하여 강제로 할당 할 수도 있다.

 

스레드 및 태스크 아키텍처 : http://sqlmvp.kr/140191074249

MAX Work thread : http://sqlmvp.kr/140150957238

 

사용자 스레드가 최대 작업자 스레드를 초과할 수 있을까? 다음 사례를 통하여 어떤 이슈가 있었는지 알아 보자.

 

이번 포스트는 SQL Server Premier Field Engineer Blog에 게시된 글로 필자가 읽고 이해한 내용을 바탕으로 정리 하였으며 번역의 오류나 기술적 오류 가능성을 알려둔다. 자세한 내용은 원문을 참고하길 바란다.

 

테스트 환경은 1CPU의 가상머신으로 x64의 기본 워크 스레드는 512이다. 우리는 여기서 워크 스레드가 512개를 넘는 것을 확인 할 수 있다.

 

다음 스크립트를 실행하면 가용성 그룹을 확인 할 수 있으며 현재 40개의 가용성 그룹이 있다.

select count(*)as NumAvailabilityGroups from sys.availability_groups

 

 

 

Sys.dm_os_schedulers에서 512개의 스레드를 훨씬 넘는 사용량을 확인 할 수 있었다.

select

    scheduler_id,current_tasks_count,

    current_workers_count,active_workers_count,work_queue_count

from sys.dm_os_schedulers

where status = 'Visible Online'

 

 

Sp_server_diagnostics 에서도 확인 할 수 있다.

<queryProcessing maxWorkers="512" workersCreated="923"

 

 

Sys.dm_os_workers 에서 단서를 찾을 수 있었다.(그림의 노란색 부분) WAITFOR 스레드에 HADR의 last_wait_types 을 확인 할 수 있었다. 우리는 AG당 1개 이상의 'preemptive Lease mechanism' 스레드를 볼 수 있었으며 다른 HADR의 몇몇 대기도 볼 수 있었다. 그러나 결정적으로 어떻게 스레드 계산을 하는지 또는 최대 작업자 스레드의 한계는 파악되지 않았다.

 

Select

    is_preemptive,state,last_wait_type,

    count(*) as NumWorkers from sys.dm_os_workers

Group by state,last_wait_type,is_preemptive

order by count(*) desc

 

 

Bob Dorr이 게시한 글(http://blogs.msdn.com/b/psssql/archive/2012/05/17/alwayson-hadron-learning-series-worker-pool-usage-for-hadron-enabled-databases.aspx)을 보면 AlwaysON Availability Groups에서 HADR Worker Pool은 최대 40이라고 설명되어 있다. 그러나 우리가 발견 한 것은 최대 작업자 스레드 구성된 값을 포함되지 않는 것을 확인 했다.

 

우리는 소스를 보면서 새 작업자 스레드를 생성 할 때 IdealWorkerLimit와 Max worker threads를 비교하여 계산하였다. 만약 바운드된 작업에 'permanent Task'라고 표시되어 있으면 이것은 워크스레드 한계에 카운트 되지 않았다. 그래서 max worker thread 설정에 따른 한계값으로 계산하기에는 무리가 있다.

  • Always On ( HADR Notification, HADR Controller etc )
  • Lock Manager
  • Log Shipping worker
  • Some Fulltext
  • SQL Trace
  • Some of the Transport Threads such as Service Broker
  • Some of the Recovery threads

 

 

현재 sys.dm_os_tasks 또는 sys.dm_os_schedulers에서 'Permanent Task'에 대해서는 노출하지 않고 있다. 만약 어느 정도 추정하고 싶다면 다음 스크립트를 실행 한다.

select

    last_wait_type, count(*) as NumRequests

from sys.dm_exec_requests

group by last_wait_type

order by count(*) desc

 

 

 

다행이 sys.dm_exec_session에서 is_user_process 열을 확인 할 수 있다. 그래서 우리는 385개의 시스템 요청과 502개의 사용자를 볼 수 있다.

select

is_user_process,count(*) as RequestCount from sys.dm_exec_sessions s

    inner join sys.dm_exec_requests r

on s.session_id = r.session_id

group by is_user_process

 

 

아래 스크립트는 더 많은 종류의 세부 정보를 얻을 수 있다. 최대 작업자 스레드 한계에 대한 계산은 포함되지 않는다.

;with cte as

(

    select

        s.is_user_process,

        w.worker_address,

        w.is_preemptive,

        w.state,

        r.status,

        t.task_state,

        r.command,

        w.last_wait_type,

        t.session_id,

        t.exec_context_id,

        t.request_id

    from dm_exec_sessions s

        inner join dm_exec_requests r

            on s.session_id = r.session_id

        inner join dm_os_tasks t

            on r.task_address = t.task_address

        inner join dm_os_workers w

            on t.worker_address = w.worker_address

    where s.is_user_process = 0

)

 

select

    is_user_process,command,

    last_wait_type,

    count(*) as cmd_cnt

from cte

group by is_user_process,command, last_wait_type

order by cmd_cnt desc

 

 

 

 

[참고자료]

http://blogs.msdn.com/b/psssql/archive/2012/05/17/alwayson-hadron-learning-series-worker-pool-usage-for-hadron-enabled-databases.aspx

  • max worker threads Option :

http://msdn.microsoft.com/en-us/library/ms187024(v=SQL.105).aspx

 

 

2013-10-02 / 강성욱 / http://sqlmvp.kr

 

 

반응형