본문 바로가기

운영/운영 업무 자동화

SQL Server Agent Job waiting for a worker thread

728x90

파워쉘이 포함된 예약작업 만들기

robocopy 소스 경로 타겟 경로 /r:1 /s /z /j /LOG:"로그파일.log"

경로\InsertLogFile.ps1 "시스템 이름"

robocopy을 이용하여 백업 파일들을 이관하는 스크립트를 작성하였고 robocopy에서 발생하는 로그 파일을 모니터링하고자 하는 데이터베이스에 로그를 기록하도록 InsertLogFile이라는 ps 파일을 작성하였습니다. 이 cmd를 이용하여 각 시스템마다의 백업 파일을 관리하려고 Agent에 등록하였습니다.

 

그러나 작업을 병렬로 처리하기 위해 시스템마다 작업을 등록하였고 이를 동시에 수행하려고 하였습니다. 네트워크 및 I/O의 한개치까지 사용하려고 하였는데 문제가 발생하였습니다. 

 

동시 작업 갯수 제한

Waiting for a worker thread

powershell 이 포함된 예약작업을 여러개 수행할 경우 2개까지는 Executing 상태가 되지만 그 이후의 작업들은 Waiting for worker thread 상태가 되며 대기하게 됩니다.

 

이 제약은 msdb.dbo.syssubsystems 에 설정되어 있습니다.

SELECT  s.subsystem_id, 
        s.subsystem, 
        m.[text] AS [description], 
        s.max_worker_threads
FROM msdb.dbo.syssubsystems s
INNER JOIN msdb.sys.messages m 
    ON  s.description_id = m.message_id 
        AND m.language_id = 1033 --English

PowerShell 항목에 max_worker_threads 컬럼을 보면 현재는 5로 설정이 되어 있지만 기본값이 2입니다. 2로 설정이 되어 있기 때문에 PowerShell으로 작성된 예약작업은 동시에 2개까지만 수행이 되고 있었던 것입니다. 이 값을 수정해 주면 동시에 수행되는 작업을 늘릴 수가 있습니다.

syssubsystems

수정방법은 아래와 같습니다. msdb.dbo.syssubsystems 테이블을 수정하고 subsystems_id 가 12인 즉, PowerShell 항목의 max_worker_threads 값을 2에서 5로 수정하는 스크립트입니다.

UPDATE msdb.dbo.syssubsystems
SET max_worker_threads = 5
WHERE subsystem_id = 12

이렇게 수정하고 작업을 수행하면 동시에 5개까지 수행되는 것을 확인할 수 있습니다.

728x90