sys.dm_os_schedulers (Transact-SQL)
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
Restituisce una riga per utilità di pianificazione in SQL Server, dove è stato eseguito il mapping di ogni utilità di pianificazione a un singolo processore. Utilizzare questa vista per eseguire il monitoraggio delle condizioni di un'utilità di pianificazione oppure per identificare eventuali attività sfuggite al controllo. Per altre informazioni sulle utilità di pianificazione, vedere guida all'architettura di thread e attività.
Nota
Per chiamare questa operazione da Azure Synapse Analytics o da Platform System (PDW), usare il nome sys.dm_pdw_nodes_os_schedulers. Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics.
Nome colonna | Tipo di dati | Descrizione |
---|---|---|
scheduler_address | varbinary(8) | Indirizzo di memoria dell'utilità di pianificazione. Non ammette i valori Null. |
parent_node_id | int | ID del nodo a cui appartiene l'utilità di pianificazione, definito anche nodo padre. Rappresenta un nodo NUMA (Non-Uniform Memory Access). Non ammette i valori Null. |
scheduler_id | int | ID dell'utilità di pianificazione. Tutte le utilità di pianificazione utilizzate per eseguire query normali sono identificate da numeri ID minori di 1048576. Le utilità di pianificazione con ID maggiori o uguali a 1048576 vengono usate internamente da SQL Server, ad esempio l'utilità di pianificazione connessione amministratore dedicata. Non ammette i valori Null. |
cpu_id | smallint | ID CPU assegnato all'utilità di pianificazione. Non ammette i valori Null. Nota: 255 non indica alcuna affinità come in SQL Server 2005 (9.x). Per altre informazioni sull'affinità, vedere sys.dm_os_threads (Transact-SQL ). |
stato | nvarchar(60) | Indica lo stato dell'utilità di pianificazione. I possibili valori sono i seguenti: - NASCOSTO ONLINE - NASCOSTO OFFLINE - VISIBILE ONLINE - VISIBILE OFFLINE - VISIBLE ONLINE (DAC) - HOT_ADDED Non ammette i valori Null. Le utilità di pianificazione HIDDEN vengono usate per elaborare le richieste interne al motore di database. Le utilità di pianificazione VISIBLE vengono utilizzate per l'elaborazione delle richieste dell'utente. Le utilità di pianificazione OFFLINE eseguono il mapping ai processori che sono offline nella maschera di affinità e che non vengono pertanto utilizzati per l'elaborazione di alcuna richiesta. Le utilità di pianificazione ONLINE eseguono il mapping ai processori che sono online nella maschera di affinità e che sono disponibili per l'elaborazione di thread. Il valore DAC indica che l'utilità di pianificazione è in esecuzione nell'ambito di una connessione amministrativa dedicata. HOT ADDED indica le utilità di pianificazione aggiunte in risposta a un evento di aggiunta di CPU a caldo. |
is_online | bit | Se SQL Server è configurato per l'uso solo di alcuni processori disponibili nel server, questa configurazione può indicare che alcune utilità di pianificazione vengono mappate ai processori che non si trovano nella maschera di affinità. In tal caso, questa colonna restituisce 0, a indicare che l'utilità di pianificazione non viene utilizzata per elaborare query o batch. Non ammette i valori Null. |
is_idle | bit | 1 = L'utilità di pianificazione è inattiva. Nessun thread di lavoro è in esecuzione. Non ammette i valori Null. |
preemptive_switches_count | int | Numero di volte in cui i thread di lavoro nell'utilità di pianificazione corrente sono passati alla modalità preemptive. Per eseguire codice esterno a SQL Server (ad esempio, stored procedure estese e query distribuite), un thread deve essere eseguito all'esterno del controllo dell'utilità di pianificazione non preemptive. A tale scopo, un thread di lavoro passa alla modalità preemptive. |
context_switches_count | int | Numero di cambi di contesto che si sono verificati nell'utilità di pianificazione corrente. Non ammette i valori Null. Per consentire l'esecuzione di altri thread di lavoro, il thread di lavoro in esecuzione deve cedere il controllo dell'utilità di pianificazione o cambiare contesto. Nota: se un ruolo di lavoro restituisce l'utilità di pianificazione e si inserisce nella coda eseguibile e quindi non trova altri ruoli di lavoro, il ruolo di lavoro selezionerà se stesso. In questo caso la colonna context_switches_count non viene aggiornata, a differenza di yield_count, che viene aggiornata. |
idle_switches_count | int | Numero di volte in cui l'utilità di pianificazione è rimasta in attesa di un evento durante il periodo di inattività. Questa colonna è simile a context_switches_count. Non ammette i valori Null. |
current_tasks_count | int | Numero di attività correnti associate all'utilità di pianificazione corrente. Questo numero include le attività seguenti: - Attività in attesa dell'esecuzione di un ruolo di lavoro. - Attività attualmente in attesa o in esecuzione (in stato SUSPENDED o RUNNABLE). Non appena un'attività viene completata, il conteggio viene ridotto. Non ammette i valori Null. |
runnable_tasks_count | int | Numero di thread di lavoro, con le attività ad essi assegnati, in attesa di essere pianificati nella coda eseguibile. Non ammette i valori Null. |
current_workers_count | int | Numero di thread di lavoro associati all'utilità di pianificazione corrente. Questo numero include i thread di lavoro a cui non sono state assegnate attività. Non ammette i valori Null. |
active_workers_count | int | Numero di thread di lavoro attivi. Un thread di lavoro attivo non è mai preemptive, deve disporre sempre di un'attività associata e può essere in esecuzione, eseguibile o sospeso. Non ammette i valori Null. |
work_queue_count | bigint | Numero di attività nella coda in sospeso in attesa di essere prelevate da un thread di lavoro. Non ammette i valori Null. |
pending_disk_io_count | int | Numero di I/O in sospeso in attesa di essere completati. Ogni utilità di pianificazione dispone di un elenco di operazioni di I/O in sospeso che vengono verificate per determinarne il completamento ogni volta che si verifica uno scambio di contesto. Il conteggio viene incrementato quando la richiesta viene inserita e viene ridotto quando la richiesta viene completata. Questo numero non indica lo stato degli I/O. Non ammette i valori Null. |
load_factor | int | Valore interno indicante il fattore di carico nell'utilità di pianificazione corrente. Questo valore viene utilizzato per determinare se una nuova attività deve essere inserita nell'utilità di pianificazione corrente oppure in un'altra utilità di pianificazione. Risulta utile per eseguire attività di debug nel caso in cui il carico delle utilità di pianificazione non sembra essere distribuito in modo uniforme. Il routing viene definito in base al carico dell'utilità di pianificazione. SQL Server usa anche un fattore di carico di nodi e utilità di pianificazione per determinare la posizione migliore per acquisire le risorse. Quando un'attività viene accodata, il fattore di caricamento viene aumentato. Quando un'attività viene completata, il fattore di caricamento viene ridotto. L'uso dei fattori di carico consente al sistema operativo DI SQL Server di bilanciare meglio il carico di lavoro. Non ammette i valori Null. |
yield_count | int | Valore interno utilizzato per indicare lo stato dell'utilità di pianificazione corrente. Questo valore viene utilizzato dal sistema di monitoraggio dell'utilità di pianificazione per determinare se un thread di lavoro dell'utilità di pianificazione non restituisce tempestivamente il controllo ad altri thread di lavoro. Non indica il passaggio di un thread di lavoro o di un'attività a un nuovo thread di lavoro. Non ammette i valori Null. |
last_timer_activity | bigint | Espresso in tick della CPU, indica l'ultimo controllo della coda del timer dell'utilità di pianificazione da parte dell'utilità stessa. Non ammette i valori Null. |
failed_to_create_worker | bit | Impostare su 1 se risulta impossibile creare un nuovo thread di lavoro nell'utilità di pianificazione corrente. Ciò in genere si verifica a causa di vincoli a livello di memoria. Ammette i valori Null. |
active_worker_address | varbinary(8) | Indirizzo di memoria del thread di lavoro attivo. Ammette i valori Null. Per altre informazioni, vedere sys.dm_os_workers (Transact-SQL). |
memory_object_address | varbinary(8) | Indirizzo di memoria dell'oggetto memoria dell'utilità di pianificazione. Non ammette i valori Null. |
task_memory_object_address | varbinary(8) | Indirizzo di memoria dell'oggetto memoria dell'attività. Non ammette i valori Null. Per altre informazioni, vedi sys.dm_os_memory_objects (Transact-SQL). |
quantum_length_us | bigint | Identificato solo a scopo informativo. Non supportato. Non è garantita la compatibilità con le versioni future. Espone il quantum dell'utilità di pianificazione usato da SQLOS. |
total_cpu_usage_ms | bigint | Si applica a: SQL Server 2016 (13.x) e versioni successive CPU totale utilizzata da questa utilità di pianificazione come segnalato dai ruoli di lavoro non preemptive. Non ammette i valori Null. |
total_cpu_idle_capped_ms | bigint | Identificato solo a scopo informativo. Non supportato. Non è garantita la compatibilità con le versioni future. Indica la limitazione basata sull'obiettivo del livello di servizio, sarà sempre 0 per le versioni non di Azure di SQL Server. Ammette i valori Null. |
total_scheduler_delay_ms | bigint | Si applica a: SQL Server 2016 (13.x) e versioni successive Il tempo tra il cambio di un ruolo di lavoro e l'altro che passa. Può essere causato da ruoli di lavoro preemptive che ritardano la pianificazione del successivo ruolo di lavoro non preemptive o a causa dei thread di pianificazione del sistema operativo da altri processi. Non ammette i valori Null. |
ideal_workers_limit | int | Si applica a: SQL Server 2019 (15.x) e versioni successive Quanti lavoratori dovrebbero essere idealmente nell'utilità di pianificazione. Se i ruoli di lavoro correnti superano il limite dovuto al carico di attività sbilanciato, una volta che diventano inattive verranno tagliati. Non ammette i valori Null. |
pdw_node_id | int | Si applica a: Azure Synapse Analytics, Piattaforma di analisi (PDW) Identificatore del nodo in cui è attiva la distribuzione. |
Autorizzazioni
In SQL Server e Istanza gestita di SQL è richiesta l'autorizzazione VIEW SERVER STATE
.
Negli obiettivi del servizio Basic del Database SQL, S0 e S1 e per i database nei pool elastici, è richiesto l'account amministratore del server, l'account amministratore di Microsoft Entra o l’adesione nel ##MS_ServerStateReader##
al ruolo del server. Per tutti gli altri obiettivi di servizio database SQL, è necessaria l'autorizzazione VIEW DATABASE STATE
per il database o l'adesione ruolo del server ##MS_ServerStateReader##
.
Autorizzazioni per SQL Server 2022 e versioni successive
È richiesta l'autorizzazione VIEW SERVER PERFORMANCE STATE per il server.
Esempi
R. Monitoraggio delle utilità di pianificazione nascoste e non nascoste
La query seguente restituisce lo stato dei ruoli di lavoro e delle attività in SQL Server in tutte le utilità di pianificazione. La query viene eseguita su un computer dotato di:
Due processori (CPU)
Due nodi (NUMA)
Una CPU per nodo NUMA
Maschera di affinità impostata su
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;
Il set di risultati è il seguente.
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
L'output contiene le informazioni seguenti:
Sono disponibili cinque utilità di pianificazione. Due utilità di pianificazione hanno un valore < ID 1048576. Le utilità di pianificazione con ID >= 1048576 sono note come utilità di pianificazione nascoste. L'utilità di pianificazione
255
rappresenta la connessione amministrativa dedicata. Per ogni istanza è prevista un'utilità di pianificazione DAC. I monitoraggi risorse che coordinano le richieste di memoria utilizzano le utilità di pianificazione257
e258
, una per ogni nodo NUMA.Nell'output sono presenti 23 attività in corso, Queste attività includono le richieste utente oltre alle attività di gestione delle risorse avviate da SQL Server. Esempi di attività di SQL Server sono MONITORAGGIO RISORSE (uno per nodo NUMA), LAZY WRITER (uno per nodo NUMA), LOCK MONITOR, CHECKPOINT e LOG WRITER.
Sono stati eseguiti i mapping del nodo NUMA
0
alla CPU1
e del nodo NUMA1
alla CPU0
. SQL Server viene in genere avviato in un nodo NUMA diverso dal nodo 0.Se tramite
runnable_tasks_count
viene restituito0
, significa che non sono presenti attività in esecuzione attiva. È tuttavia possibile che esistano sessioni attive.All'utilità di pianificazione
255
che rappresenta la connessione DAC sono associati3
thread di lavoro, Questi ruoli di lavoro vengono allocati all'avvio di SQL Server e non cambiano. Tali thread vengono utilizzati esclusivamente per l'elaborazione delle query DAC. Le due attività presenti in questa utilità di pianificazione rappresentano una gestione connessione e un thread di lavoro inattivo.active_workers_count
rappresenta tutti i ruoli di lavoro che hanno attività associate e vengono eseguiti in modalità non preemptive. Alcune attività, ad esempio i listener di rete, vengono eseguite nell'ambito di una pianificazione preemptive.Le utilità di pianificazione nascoste non elaborano le richieste utente comuni. L'utilità di pianificazione DAC costituisce l'eccezione, poiché dispone di un thread per l'elaborazione delle richieste.
B. Monitoraggio delle utilità di pianificazione non nascoste in un sistema a utilizzo intensivo
Nella query seguente viene illustrato lo stato delle utilità di pianificazione non nascoste con carichi notevoli, in cui il numero delle richieste è maggiore di quello che può essere gestito dai thread di lavoro disponibili. In questo esempio le attività vengono assegnate a 256 thread di lavoro. Alcune attività sono in attesa dell'assegnazione a un thread di lavoro. Un conteggio di attività eseguibili inferiore indica che più attività sono in attesa di una risorsa.
Nota
Per individuare lo stato dei thread di lavoro, è possibile eseguire una query su sys.dm_os_workers. Per altre informazioni, vedere sys.dm_os_workers (Transact-SQL).
La query è la seguente:
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;
Il set di risultati è il seguente.
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
Nel risultato seguente sono invece presenti più attività eseguibili, mentre nessuna attività è in attesa di un thread di lavoro. Il valore di work_queue_count
è 0
per entrambe le utilità di pianificazione.
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
Vedi anche
Viste a gestione dinamica correlate al sistema operativo SQL Server (Transact-SQL)