데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

Max worker thread 초과 이슈

jevida(강성욱) 2016.10.08 06:53 Views : 2662

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

 



강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

 

No. Subject Author Date Views
1871 DMV를 활용한 CPU 트러블슈팅 - Sys.dm_exec_query_stats, sys.dm_os_ring_buffers 활용 [1] jevida(강성욱) 2016.10.08 1907
1870 백업 미디어 세트에 압축 백업 추가하기 jevida(강성욱) 2016.10.08 1451
1869 Collation에 따른 실행계획 변경과 성능 문제 jevida(강성욱) 2016.10.08 1667
1868 SQL Connection Timeout 디버깅 with BizTalk Server jevida(강성욱) 2016.10.08 2279
1867 인스턴스 파일 초기화 활성 jevida(강성욱) 2016.10.08 1710
1866 누락된 인덱스 확인하기 jevida(강성욱) 2016.10.08 2871
1865 비클러스터 인덱스 페이지 내용 jevida(강성욱) 2016.10.08 2011
1864 ATTACH DATABASE 오류 1314 jevida(강성욱) 2016.10.08 1161
1863 SQL Server 커넥션 풀링 jevida(강성욱) 2016.10.08 4051
1862 가상 SQL Server에 Hot Add vCPU 사용하기 jevida(강성욱) 2016.10.08 1112
1861 DDL 트리거를 활용한 ERRORLOG에 XEVENT 상태 기록하기 jevida(강성욱) 2016.10.08 1348
1860 쉐어포인트의 SQL Server 접속 문제 jevida(강성욱) 2016.10.08 1446
1859 Lazy Log Truncation jevida(강성욱) 2016.10.08 1290
1858 인덱스 구성과 상황에 따른 인덱스 성능 jevida(강성욱) 2016.10.08 1462
» Max worker thread 초과 이슈 jevida(강성욱) 2016.10.08 2662
1856 SQL Server Failover 클러스터 설치 트러블슈팅 jevida(강성욱) 2016.10.08 2342
1855 MAXDOP 극대화 하기 jevida(강성욱) 2016.10.08 2018
1854 SQL Server 가상화 팁 jevida(강성욱) 2016.10.08 2019
1853 Net Framework 4.0과 SQL Server 2008 설치 오류 jevida(강성욱) 2016.10.08 1842
1852 SQL Server 인덱스 튜닝 접근 jevida(강성욱) 2016.10.07 3439





XE Login