다음을 통해 공유


sys.dm_os_schedulers(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

각 스케줄러가 개별 프로세서에 매핑되는 SQL Server의 스케줄러당 한 행을 반환합니다. 이 보기를 사용하여 스케줄러의 상태를 모니터링하거나 런어웨이 태스크를 식별할 수 있습니다. 스케줄러에 대한 자세한 내용은 스레드 및 작업 아키텍처 가이드를 참조하세요.

참고 항목

Azure Synapse Analytics 또는 PDW(Analytics Platform System)에서 이를 호출하려면 이름 sys.dm_pdw_nodes_os_schedulers 사용합니다. 이 구문은 Azure Synapse Analytics의 서버리스 SQL 풀에서 지원되지 않습니다.

열 이름 데이터 형식 설명
scheduler_address varbinary(8) 스케줄러의 메모리 주소입니다. Null을 허용하지 않습니다.
parent_node_id int 스케줄러가 속한 노드의 ID(부모 노드라고도 함). 이것은 NUMA(Non-Uniform Memory Access) 노드를 나타냅니다. Null을 허용하지 않습니다.
scheduler_id int 스케줄러의 ID입니다. 일반 쿼리를 실행하는 데 사용되는 모든 스케줄러에는 1048576 미만의 ID 번호가 있습니다. ID가 1048576 크거나 같은 스케줄러는 전용 관리자 연결 스케줄러와 같은 SQL Server에서 내부적으로 사용됩니다. Null을 허용하지 않습니다.
cpu_id smallint 스케줄러에 할당된 CPU ID입니다.

Null을 허용하지 않습니다.

참고: 255는 SQL Server 2005(9.x)에서와 같이 선호도를 나타내지 않습니다. 추가 선호도 정보는 sys.dm_os_threads(Transact-SQL)를 참조하세요.
status nvarchar(60) 스케줄러의 상태를 나타냅니다. 다음 값 중 하나일 수 있습니다.

- 숨겨진 온라인
- 오프라인으로 숨김
- 온라인 표시
- 오프라인으로 표시
- DAC(VISIBLE ONLINE)
- HOT_ADDED

Null을 허용하지 않습니다.

HIDDEN 스케줄러는 데이터베이스 엔진 내부인 요청을 처리하는 데 사용됩니다. VISIBLE 스케줄러는 사용자 요청을 처리하는 데 사용됩니다.

오프라인 스케줄러는 선호도 마스크에서 오프라인 상태이므로 요청을 처리하는 데 사용되지 않는 프로세서에 매핑됩니다. ONLINE 스케줄러는 선호도 마스크에서 온라인 상태인 프로세서에 매핑되므로 스레드 처리에 사용할 수 있습니다.

DAC는 스케줄러가 전용 관리자 연결에서 실행 중임을 나타냅니다.

HOT ADDED는 hot add CPU 이벤트에 대한 응답으로 스케줄러가 추가되었음을 나타냅니다.
is_online bit SQL Server가 서버에서 사용 가능한 프로세서 중 일부만 사용하도록 구성된 경우 이 구성은 일부 스케줄러가 선호도 마스크에 없는 프로세서에 매핑됨을 의미할 수 있습니다. 이 경우 이 열은 0을 반환합니다. 이 값은 스케줄러가 쿼리 또는 일괄 처리를 처리하는 데 사용되지 않음을 의미합니다.

Null을 허용하지 않습니다.
is_idle bit 1 = Scheduler가 유휴 상태입니다. 현재 실행 중인 작업자가 없습니다. Null을 허용하지 않습니다.
preemptive_switches_count int 이 스케줄러의 작업자가 선점 모드로 전환한 횟수입니다.

SQL Server 외부의 코드(예: 확장 저장 프로시저 및 분산 쿼리)를 실행하려면 비선점형 스케줄러의 제어를 벗어나서 스레드를 실행해야 합니다. 이를 위해 작업자는 선점 모드로 전환됩니다.
context_switches_count int 이 스케줄러에서 발생한 컨텍스트 스위치의 수입니다. Null을 허용하지 않습니다.

다른 작업자가 실행되도록 허용하려면 현재 실행 중인 작업자가 스케줄러의 제어를 포기하거나 컨텍스트를 전환해야 합니다.

참고: 작업자가 스케줄러를 생성하고 실행 가능한 큐에 배치한 다음 다른 작업자를 찾지 못하면 작업자가 자신을 선택합니다. 이 경우 context_switches_count 업데이트되지 않지만 yield_count 업데이트됩니다.
idle_switches_count int 스케줄러가 유휴 상태일 때 이벤트를 대기한 횟수입니다. 이 열은 context_switches_count 비슷합니다. Null을 허용하지 않습니다.
current_tasks_count int 이 스케줄러와 연결된 현재 작업의 수입니다. 이 개수에는 다음이 포함됩니다.

- 작업자가 실행되기를 기다리는 작업입니다.
- 현재 대기 중이거나 실행 중인 작업(SUSPENDED 또는 RUNNABLE 상태)입니다.

작업이 완료되면 이 수가 감소합니다. Null을 허용하지 않습니다.
runnable_tasks_count int 실행 가능한 큐에서 예약되기를 기다리는 작업이 할당된 작업자 수입니다. Null을 허용하지 않습니다.
current_workers_count int 이 스케줄러와 연결된 작업자 수입니다. 이 수에는 작업이 할당되지 않은 작업자가 포함됩니다. Null을 허용하지 않습니다.
active_workers_count int 활성 상태인 작업자 수입니다. 활성 작업자는 비선점형이며 연결된 태스크가 있어야 하고 실행 중이거나 실행 가능하거나 일시 중지 상태입니다. Null을 허용하지 않습니다.
work_queue_count bigint 보류 중인 큐의 작업 수입니다. 이러한 작업은 작업자가 이를 데리러 올 때까지 기다리고 있습니다. Null을 허용하지 않습니다.
pending_disk_io_count int 완료되기를 기다리는 보류 중인 I/O 수입니다. 각 스케줄러에는 컨텍스트 전환이 있을 때마다 완료되었는지 여부를 확인하기 위해 검사되는 보류 중인 I/O 목록이 있습니다. 요청이 삽입될 때 개수가 증가합니다. 요청이 완료되면 이 수가 감소합니다. 이 숫자는 I/O의 상태를 나타내지 않습니다. Null을 허용하지 않습니다.
load_factor int 이 스케줄러에서 감지된 로드를 나타내는 내부 값입니다. 이 값은 이 스케줄러 또는 다른 스케줄러에 새 작업을 배치해야 하는지 여부를 결정하는 데 사용됩니다. 이 값은 스케줄러가 균등하게 로드되지 않는 것으로 표시되는 경우 디버깅 용도로 유용합니다. 스케줄러의 로드에 따라 라우팅이 결정됩니다. 또한 SQL Server는 노드 및 스케줄러의 로드 팩터를 사용하여 리소스를 획득하기에 가장 적합한 위치를 결정하는 데 도움을 줍니다. 태스크가 큐에 포함되면 부하 요소가 증가합니다. 태스크가 완료되면 로드 비율이 감소합니다. 부하 요소를 사용하면 SQL Server OS가 작업 부하를 더 효율적으로 분산할 수 있습니다. Null을 허용하지 않습니다.
yield_count int 이 스케줄러의 진행률을 나타내는 데 사용되는 내부 값입니다. 이 값은 스케줄러 모니터에서 스케줄러의 작업자가 다른 작업자에게 정시에 양보하지 않는지 여부를 확인하는 데 사용됩니다. 이 값은 작업자나 태스크가 새 작업자로 전환되었음을 나타내지 않습니다. Null을 허용하지 않습니다.
last_timer_activity bigint CPU 틱에서 스케줄러에서 스케줄러 타이머 큐를 마지막으로 확인한 시간입니다. Null을 허용하지 않습니다.
failed_to_create_worker bit 이 스케줄러에서 새 작업자를 만들 수 없는 경우 1로 설정합니다. 일반적으로 메모리 제약 조건으로 인해 발생합니다. Null을 허용합니다.
active_worker_address varbinary(8) 현재 활성 상태인 작업자의 메모리 주소입니다. Null을 허용합니다. 자세한 내용은 sys.dm_os_workers(Transact-SQL)를 참조 하세요.
memory_object_address varbinary(8) 스케줄러 메모리 개체의 메모리 주소입니다. NULLABLE이 아닙니다.
task_memory_object_address varbinary(8) 작업 메모리 개체의 메모리 주소입니다. Null을 허용하지 않습니다. 자세한 내용은 sys.dm_os_memory_objects(Transact-SQL)를 참조하세요.
quantum_length_us bigint 정보를 제공하기 위해서만 확인됩니다. 지원 안 됨. 향후 호환성은 보장되지 않습니다. SQLOS에서 사용하는 스케줄러 양자를 노출합니다.
total_cpu_usage_ms bigint 적용 대상: SQL Server 2016(13.x) 이상

비선점 작업자가 보고한 이 스케줄러에서 사용한 총 CPU입니다. Null을 허용하지 않습니다.
total_cpu_idle_capped_ms bigint 정보를 제공하기 위해서만 확인됩니다. 지원 안 됨. 향후 호환성은 보장되지 않습니다. 서비스 수준 목표에 따라 제한이 항상 비 Azure 버전의 SQL Server에 대해 0이 됨을 나타냅니다. Null을 허용합니다.
total_scheduler_delay_ms bigint 적용 대상: SQL Server 2016(13.x) 이상

한 작업자가 전환되고 다른 작업자가 전환되는 시간입니다. 선점 작업자가 다음 비선점 작업자의 예약을 지연하거나 다른 프로세스의 OS 일정 스레드로 인해 발생할 수 있습니다. Null을 허용하지 않습니다.
ideal_workers_limit int 적용 대상: SQL Server 2019(15.x) 이상

스케줄러에 이상적으로 있어야 하는 작업자 수입니다. 현재 작업자가 불균형 작업 부하로 인해 제한을 초과하면 유휴 상태가 되면 잘립니다. Null을 허용하지 않습니다.
pdw_node_id int 적용 대상: Azure Synapse Analytics, Analytics Platform System(PDW)

이 배포가 있는 노드의 식별자입니다.

사용 권한

SQL Server 및 SQL Managed Instance에서는 VIEW SERVER STATE 권한이 필요합니다.

SQL Database Basic, S0S1 서비스 목표 또는 탄력적 풀 내의 데이터베이스에 대해서는 서버 관리자 계정, Microsoft Entra 관리자 계정 또는 ##MS_ServerStateReader## 서버 역할의 멤버 자격이 필요합니다. 다른 모든 SQL Database 서비스 목표에 대해서는 데이터베이스에 대한 VIEW DATABASE STATE 권한 또는 ##MS_ServerStateReader## 서버 역할의 멤버 자격이 필요합니다.

SQL Server 2022 이상에 대한 사용 권한

서버에 대한 VIEW SERVER PERFORMANCE STATE 권한이 필요합니다.

예제

A. 숨겨진 스케줄러 및 숨겨지지 않은 스케줄러 모니터링

다음 쿼리는 모든 스케줄러에서 SQL Server의 작업자 및 태스크 상태를 출력합니다. 이 쿼리는 다음 조건을 충족시키는 컴퓨터 시스템에서 실행되었습니다.

  • 두 개의 프로세서(CPU)

  • 2개(NUMA) 노드

  • NUMA 노드당 하나의 CPU

  • 선호도 마스크를 .로 0x03설정합니다.

SELECT  
    scheduler_id,  
    cpu_id,  
    parent_node_id,  
    current_tasks_count,  
    runnable_tasks_count,  
    current_workers_count,  
    active_workers_count,  
    work_queue_count  
  FROM sys.dm_os_schedulers;  

결과 집합은 다음과 같습니다.

scheduler_id cpu_id parent_node_id current_tasks_count  
------------ ------ -------------- -------------------  
0            1      0              9                    
257          255    0              1                    
1            0      1              10                   
258          255    1              1                    
255          255    32             2                    
  
runnable_tasks_count current_workers_count  
-------------------- ---------------------  
0                    11                     
0                    1                      
0                    18                     
0                    1                      
0                    3                      
  
active_workers_count work_queue_count  
-------------------- --------------------  
6                    0  
1                    0  
8                    0  
1                    0  
1                    0  

출력은 다음 정보를 제공합니다.

  • 5개의 스케줄러가 있습니다. 두 스케줄러의 ID 값 < 은 1048576. ID >= 1048576 스케줄러를 숨겨진 스케줄러라고 합니다. Scheduler 255 는 DAC(관리자 전용 연결)를 나타냅니다. 인스턴스당 하나의 DAC 스케줄러가 있습니다. 메모리 압력을 조정하는 리소스 모니터는 NUMA 노드당 하나씩 스케줄러 257 및 스케줄러 258를 사용합니다.

  • 출력에는 23가지 활성 작업이 있습니다. 이러한 작업에는 SQL Server에서 시작한 리소스 관리 작업 외에도 사용자 요청이 포함됩니다. SQL Server 작업의 예로는 RESOURCE MONITOR(NUMA 노드당 하나), LAZY WRITER(NUMA 노드당 하나), LOCK MONITOR, CHECKPOINT 및 LOG WRITER가 있습니다.

  • NUMA 노드 0 는 CPU 1 에 매핑되고 NUMA 노드 1 는 CPU 0에 매핑됩니다. SQL Server는 일반적으로 노드 0이 아닌 NUMA 노드에서 시작합니다.

  • runnable_tasks_count0을 반환하므로 실행 중인 활성 태스크는 없지만 그러나 활성 세션이 있을 수 있습니다.

  • DAC를 나타내는 스케줄러 255에는 3개의 작업자가 연결되어 있습니다. 이러한 작업자는 SQL Server 시작 시 할당되며 변경되지 않습니다. 이러한 작업자는 DAC 쿼리를 처리하기 위한 용도로만 사용됩니다. 이 스케줄러의 두 태스크는 연결 관리자와 유휴 작업자를 나타냅니다.

  • active_workers_count 는 관련 작업이 있고 비선점 모드에서 실행 중인 모든 작업자를 나타냅니다. 네트워크 수신기 같은 일부 태스크는 선점형 일정에서 실행됩니다.

  • 숨겨진 스케줄러는 일반적인 사용자 요청을 처리하지 않습니다. DAC 스케줄러는 예외입니다. 이 DAC 스케줄러에는 요청을 처리할 스레드가 하나 있습니다.

B. 사용 중인 시스템에서 숨기지 않은 스케줄러 모니터링

다음 쿼리에서는 사용 가능한 작업자가 처리할 수 없을 만큼 많은 요청이 있는 숨겨지지 않은 과도한 스케줄러의 상태를 보여 줍니다. 이 예제에서는 256명의 작업자에게 태스크가 할당됩니다. 일부 작업은 작업자에 대한 할당을 기다리고 있습니다. 실행 가능한 수가 낮을 경우 여러 태스크가 리소스를 기다리고 있음을 의미합니다.

참고 항목

sys.dm_os_workers 쿼리하여 작업자의 상태를 찾을 수 있습니다. 자세한 내용은 sys.dm_os_workers(Transact-SQL)를 참조 하세요.

쿼리는 다음과 같습니다.

SELECT  
    scheduler_id,  
    cpu_id,  
    current_tasks_count,  
    runnable_tasks_count,  
    current_workers_count,  
    active_workers_count,  
    work_queue_count  
  FROM sys.dm_os_schedulers  
  WHERE scheduler_id < 255;  

결과 집합은 다음과 같습니다.

scheduler_id current_tasks_count runnable_tasks_count  
------------ ------------------- --------------------  
0            144                 0                     
1            147                 1                     
  
current_workers_count active_workers_count work_queue_count  
--------------------- -------------------- --------------------  
128                   125                  16  
128                   126                  19  

비교를 위해 다음 결과에서는 작업자를 가져오기 위해 대기하는 작업이 없는 여러 실행 가능 태스크를 보여 줍니다. work_queue_count는 두 스케줄러에서 모두 0입니다.

scheduler_id current_tasks_count runnable_tasks_count  
------------ ------------------- --------------------  
0            107                 98                    
1            110                 100                   
  
current_workers_count active_workers_count work_queue_count  
--------------------- -------------------- --------------------  
128                   104                  0  
128                   108                  0  

참고 항목

SQL Server 운영 체제 관련 동적 관리 뷰(Transact-SQL)