sys.dm_os_schedulers(Transact-SQL)
각 스케줄러가 개별 프로세서에 매핑되는 SQL Server의 스케줄러당 하나의 행을 반환합니다. 이 뷰를 사용하여 스케줄러 상태를 모니터링하거나 런어웨이 태스크를 식별할 수 있습니다.
열 이름 |
데이터 형식 |
설명 |
---|---|---|
scheduler_address |
varbinary(8) |
스케줄러의 메모리 주소입니다. Null을 허용하지 않습니다. |
parent_node_id |
int |
부모 노드라고도 하는 스케줄러가 속한 노드의 ID입니다. 이것은 NUMA(Non-Uniform Memory Access) 노드를 나타냅니다. Null을 허용하지 않습니다. |
scheduler_id |
int |
스케줄러의 ID입니다. 일반 쿼리를 실행하는 데 사용되는 모든 스케줄러에는 255 미만의 ID 번호가 있습니다. 전용 관리자 연결 스케줄러와 같이 ID가 255보다 크거나 같은 스케줄러는 SQL Server에서 내부적으로 사용됩니다. Null을 허용하지 않습니다. |
cpu_id |
smallint |
이 스케줄러와 연관된 CPU의 ID입니다. SQL Server가 선호도를 사용하여 실행하도록 구성된 경우 이 값은 스케줄러가 실행되고 있는 CPU의 ID입니다. 255 = 선호도 마스크가 지정되지 않았습니다. Null을 허용하지 않습니다. |
status |
nvarchar(60) |
스케줄러의 상태를 나타냅니다. 다음 값 중 하나를 사용할 수 있습니다.
Null을 허용하지 않습니다. HIDDEN 스케줄러는 데이터베이스 엔진 내부의 요청을 처리하는 데 사용되고 VISIBLE 스케줄러는 사용자 요청을 처리하는 데 사용됩니다. OFFLINE 스케줄러는 선호도 마스크에서 오프라인 상태인 프로세서에 매핑되므로 다른 요청을 처리하는 데 사용되지 않습니다. ONLINE 스케줄러는 선호도 마스크에서 온라인 상태인 프로세서에 매핑되므로 스레드 처리에 사용할 수 있습니다. DAC는 스케줄러가 전용 관리자 연결로 실행되고 있음을 나타냅니다. HOT ADDED는 hot add CPU 이벤트에 대한 응답으로 스케줄러가 추가되었음을 나타냅니다. |
is_online |
bit |
SQL Server가 서버에서 사용할 수 있는 프로세서 중 일부만 사용하도록 구성된 경우 이 구성은 일부 스케줄러가 선호도 마스크에 없는 프로세서에 매핑되어 있음을 의미할 수 있습니다. 이 경우 이 열은 0을 반환합니다. 이 값은 스케줄러가 쿼리나 일괄 처리를 처리하는 데 사용되고 있지 않음을 의미합니다. Null을 허용하지 않습니다. |
is_idle |
bit |
1 = 스케줄러가 유휴 상태입니다. 현재 실행되고 있는 작업자가 없습니다. 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 |
이 스케줄러와 연관된 현재 태스크 수입니다. 이 개수에는 다음이 포함됩니다.
태스크가 완료되면 이 개수가 감소합니다. 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 2000에서는 태스크가 특정 스케줄러로 라우팅됩니다. 그러나 SQL Server에서는 스케줄러의 로드를 기반으로 라우팅 결정이 내려집니다. 또한 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) |
스케줄러 메모리 개체의 메모리 주소입니다. NULL을 허용하지 않습니다. |
task_memory_object_address |
varbinary(8) |
태스크 메모리 개체의 메모리 주소입니다. Null을 허용하지 않습니다. 자세한 내용은 sys.dm_os_memory_objects(Transact-SQL)를 참조하십시오. |
사용 권한
서버에 대한 VIEW SERVER STATE 권한이 필요합니다.
예
1. 숨겨진 스케줄러 및 숨겨지지 않은 스케줄러 모니터링
다음 쿼리에서는 모든 스케줄러에 있는 SQL Server의 태스크 및 작업자 상태를 출력합니다. 이 쿼리는 다음 조건을 충족시키는 컴퓨터 시스템에서 실행되었습니다.
프로세스(CPU) 두 개
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 값은 < 255입니다. ID >= 255인 스케줄러를 숨겨진 스케줄러라고 합니다. 스케줄러 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 노드에서 시작됩니다. 자세한 내용은 NUMA(Non-Uniform Memory Access) 이해를 참조하십시오.
runnable_tasks_count가 0을 반환하므로 실행 중인 활성 태스크는 없지만 활성 세션은 있을 수 있습니다.
DAC를 나타내는 스케줄러 255에는 3개의 작업자가 연결되어 있습니다. 세 작업자는 SQL Server 시작 시 할당되며 변경되지 않습니다. 이러한 작업자는 DAC 쿼리를 처리하기 위한 용도로만 사용됩니다. 이 스케줄러의 두 태스크는 연결 관리자와 유휴 작업자를 나타냅니다.
active_workers_count는 연결된 태스크가 있으며 비선점형 모드에서 실행되는 모든 작업자를 나타냅니다. 네트워크 수신기 같은 일부 태스크는 선점형 일정에서 실행됩니다.
숨겨진 스케줄러는 일반적인 사용자 요청을 처리하지 않습니다. 단, DAC 스케줄러는 예외입니다. 이 DAC 스케줄러에는 요청을 처리하는 스레드 하나가 있습니다.
2. 사용량이 많은 시스템에서 숨겨지지 않은 스케줄러 모니터링
다음 쿼리에서는 사용 가능한 작업자가 처리할 수 없을 만큼 많은 요청이 있는 숨겨지지 않은 과도한 스케줄러의 상태를 보여 줍니다. 이 예에서는 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