Sdílet prostřednictvím


sys.dm_os_schedulers (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)databáze SQL v Microsoft Fabric

Vrátí jeden řádek na každý plánovač v SQL Serveru, kde je každý plánovač namapován na jednotlivý procesor. Toto zobrazení slouží ke sledování stavu plánovače nebo k identifikaci neovladatelných úloh. Pro více informací o plánovačích viz Průvodce architekturou vláken a úloh.

Poznámka:

Pro volání z Azure Synapse Analytics nebo Analytics Platform System (PDW) použijte název sys.dm_pdw_nodes_os_schedulers. Tato syntaxe není podporována bezserverovým fondem SQL ve službě Azure Synapse Analytics.

Název sloupce Datový typ Description
scheduler_address varbinary(8) Paměťová adresa plánovače. Není možné nastavit jako null.
parent_node_id int ID uzlu, ke kterému plánovač patří, známého také jako nadřazený uzel. To představuje uzel neuniformního přístupu do paměti (NUMA). Není možné nastavit jako null.
ID plánovače int ID plánovače. Všechny plánovače, které se používají k běžným dotazům, mají ID čísla menší než 1048576. Plánovače, které mají ID větší nebo rovné 1048576, jsou interně používány SQL Serverem, například dedikovaný správce plánovače připojení připojení. Není možné nastavit jako null.
cpu_id smallint CPU ID přiřazené plánovači.

Není možné nastavit jako null.

Poznámka: 255 neznamená žádnou afinitu, jako tomu bylo v SQL Server 2005 (9.x). Další informace o afinitě najdete v sys.dm_os_threads (Transact-SQL ).
stav nvarchar(60) Ukazuje stav plánovače. Může to být jedna z následujících hodnot:

- SKRYTÉ ONLINE
- SKRYTÉ OFFLINE
- VIDITELNÉ ONLINE
- VIDITELNÉ OFFLINE
- VISIBLE ONLINE (DAC)
- HOT_ADDED

Není možné nastavit jako null.

HIDDEN plánovače se používají ke zpracování požadavků, které jsou interní v databázovém enginu. Plánovače VISIBLE se používají ke zpracování uživatelských požadavků.

OFFLINE plánovače mapují na procesory, které jsou offline v afinitní masce, a proto nejsou používány ke zpracování žádných požadavků. ONLINE plánovače mapují na procesory, které jsou online v afinitní masce a jsou dostupné pro zpracování vláken.

DAC označuje, že plánovač běží pod dedikovaným administrátorským připojením.

HOT ADDED znamená, že plánovače byly přidány v reakci na událost CPU při hot add.
is_online bit Pokud je SQL Server nakonfigurován tak, aby používal pouze některé dostupné procesory na serveru, může tato konfigurace znamenat, že některé plánovače jsou mapovány na procesory, které nejsou v afinitní masce. Pokud je tomu tak, tento sloupec vrací 0. Tato hodnota znamená, že plánovač není používán ke zpracování dotazů nebo dávek.

Není možné nastavit jako null.
is_idle bit 1 = Plánovač je nečinný. Momentálně žádní pracovníci nepracují. Není možné nastavit jako null.
preemptive_switches_count int Počet případů, kdy pracovníci na tomto plánovači přešli do režimu předběžného převzetí.

Pokud chcete spustit kód, který je mimo SQL Server (například rozšířené uložené procedury a distribuované dotazy), musí vlákno provést mimo kontrolu ne preemptivního plánovače. K tomu se pracovní proces přepne do preemptivního režimu.
context_switches_count int Počet přepnutí kontextu, které na tomto plánovači nastalo. Není možné nastavit jako null.

Aby mohli běžet i další pracovníci, musí současný pracovník vzdát se kontroly nad plánovačem nebo přepnout kontext.

Poznámka: Pokud pracovník vrátí plánovač a vloží se do běžitelné fronty a pak nenajde žádné další pracovníky, pracovník se vybere sám. V tomto případě se context_switches_count neaktualizuje, ale yield_count ano.
idle_switches_count int Kolikrát plánovač čekal na událost v nečinnosti. Tento sloupek je podobný context_switches_count. Není možné nastavit jako null.
current_tasks_count int Počet aktuálních úkolů, které jsou s tímto plánovačem spojeny. Tento počet zahrnuje následující:

- Úkoly, které čekají na pracovníka, aby je provedl.
- Úkoly, které jsou aktuálně čekající nebo běžící (ve stavu POZASTAVENO nebo BĚŽITELNÉ).

Po dokončení úkolu se tento počet snižuje. Není možné nastavit jako null.
runnable_tasks_count int Počet pracovníků, s přiřazenými úkoly, kteří čekají na zařazení do běžné fronty. Není možné nastavit jako null.
current_workers_count int Počet pracovníků spojených s tímto plánovačem. Tento počet zahrnuje pracovníky, kterým není přiřazen žádný úkol. Není možné nastavit jako null.
active_workers_count int Počet aktivních pracovníků. Aktivní pracovník nikdy není předemptivní, musí mít přiřazený úkol a je buď v provozu, běžný nebo pozastavený. Není možné nastavit jako null.
work_queue_count bigint Počet úkolů ve frontě čekající. Tyto úkoly čekají, až je vyzvedne pracovník. Není možné nastavit jako null.
pending_disk_io_count int Počet čekajících I/O procesů, které čekají na dokončení. Každý plánovač má seznam čekajících I/O operací, které se kontrolují, zda byly dokončeny pokaždé, když dojde ke změně kontextu. Počet se zvyšuje při vložení požadavku. Tento počet se snižuje po dokončení žádosti. Toto číslo neukazuje stav I/O. Není možné nastavit jako null.
load_factor int Interní hodnota, která indikuje vnímané zatížení tohoto plánovače. Tato hodnota se používá k určení, zda by měl být nový úkol umístěn do tohoto plánovače nebo do jiného plánovače. Tato hodnota je užitečná pro ladění, když se zdá, že plánovače nejsou rovnoměrně načteny. Rozhodnutí o směrování se přijímá na základě zatížení plánovače. SQL Server také využívá load factor uzlů a plánovačů, aby pomohl určit nejlepší místo pro získávání zdrojů. Když je úkol zařazen do fronty, zvyšuje se faktor zatížení. Po dokončení úkolu se faktor zatížení sníží. Použití load factorů pomáhá OS SQL Server lépe vyvážit pracovní zátěž. Není možné nastavit jako null.
yield_count int Interní hodnota, která se používá k indikaci pokroku v tomto plánovači. Tuto hodnotu používá Scheduler Monitor k určení, zda pracovník na plánovači nepředvádí včas ostatním pracovníkům. Tato hodnota neznamená, že pracovník nebo úkol přešel na nového pracovníka. Není možné nastavit jako null.
last_timer_activity bigint Při CPU tickech je poslední kontrola, kdy plánovač kontroloval frontu časovače. Není možné nastavit jako null.
failed_to_create_worker bit Nastavte na 1, pokud nový pracovník nemohl být vytvořen v tomto plánovači. K tomu obvykle dochází kvůli omezením paměti. Je nullable.
active_worker_address varbinary(8) Paměťová adresa pracovníka, který je aktuálně aktivní. Je nullable. Pro více informací viz sys.dm_os_workers (Transact-SQL).
memory_object_address varbinary(8) Paměťová adresa paměťového objektu plánovače. Není to NULLABLE.
task_memory_object_address varbinary(8) Paměťová adresa objektu paměti úlohy. Není možné nastavit jako null. Pro více informací viz sys.dm_os_memory_objects (Transact-SQL).
quantum_length_us bigint Určeno pouze pro informační účely. Není podporováno. Budoucí kompatibilita není zaručena. Zpřístupňuje kvantové množství plánovače používané SQLOS.
total_cpu_usage_ms bigint Platí na: SQL Server 2016 (13.x) a novější

Celkový CPU spotřebovaný tímto plánovačem, jak je hlášeno ne-preventivními pracovníky. Není možné nastavit jako null.
total_cpu_idle_capped_ms bigint Určeno pouze pro informační účely. Není podporováno. Budoucí kompatibilita není zaručena. Označuje zpomalování podle Service Level Objective, u ne-Azure verzí SQL Serveru bude vždy 0. Je nullable.
total_scheduler_delay_ms bigint Platí na: SQL Server 2016 (13.x) a novější

Čas mezi tím, jak jeden pracovník přechází a druhý nastupuje. Může být způsobeno tím, že předběžní pracovníci zdržují plánování dalšího nepreemptivního pracovníka, nebo kvůli plánovacím vláknům operačního systému z jiných procesů. Není možné nastavit jako null.
ideal_workers_limit int Platí na: SQL Server 2019 (15.x) a novější

Kolik pracovníků by mělo být ideálně na plánovači. Pokud stávající pracovníci překročí limit kvůli nevyváženému zatížení úkolů, jakmile se stanou nečinnými, budou oříznuti. Není možné nastavit jako null.
pdw_node_id int platí pro: Azure Synapse Analytics, Analytics Platform System (PDW)

Identifikátor uzlu, na který je tato distribuce zapnutá.

Povolení

Na SQL Serveru a službě SQL Managed Instance vyžaduje VIEW SERVER STATE oprávnění.

U cílů služby SQL Database Basic, S0 a S1 a pro databáze v elastických fondech se vyžaduje účet správce serveru , účet správce Microsoft Entra nebo členství v ##MS_ServerStateReader##roli serveru . U všech ostatních cílů VIEW DATABASE STATE služby SQL Database se vyžaduje buď oprávnění k databázi, nebo členství v ##MS_ServerStateReader## roli serveru.

Oprávnění pro SQL Server 2022 a novější

Vyžaduje oprávnění ZOBRAZIT STAV VÝKONU SERVERU na serveru.

Examples

A. Monitorování skrytých a neskrytých plánovačů

Následující dotaz vygeneruje stav pracovníků a úloh v SQL Serveru napříč všemi plánovači. Tento dotaz byl proveden na počítačovém systému, který má následující:

  • Dva procesory (CPU)

  • Dva (NUMA) uzly

  • Jeden CPU na každý uzel NUMA

  • Maska afinity nastavená na 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;  

Tady je soubor výsledků.

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  

Výstup poskytuje následující informace:

  • Je pět plánovačů. Dva plánovače mají hodnotu < ID 1048576. Plánovače s ID >= 1048576 jsou známé jako skryté plánovače. Plánovač 255 představuje připojení dedikovaného správce (DAC). Na každou instanci je jeden DAC plánovač. Monitory zdrojů, které koordinují tlak paměti, používají plánovač 257 a plánovač, 258jeden na každý uzel NUMA

  • Ve výstupu je 23 aktivních úkolů. Tyto úkoly zahrnují uživatelské požadavky kromě úloh správy zdrojů, které byly zahájeny SQL Serverem. Příklady úloh SQL Serveru jsou RESOURCE MONITOR (jeden na každý NUMA uzel), LAZY WRITER (jeden na NUMA uzel), LOCK MONITOR, CHECKPOINT a LOG WRITER.

  • NUMA uzel 0 je mapován na CPU 1 a NUMA 1 uzel na CPU 0. SQL Server obvykle začíná na NUMA uzlu jiném než node 0.

  • Při runnable_tasks_count návratu 0neexistují aktivně běžící úlohy. Nicméně mohou existovat aktivní sezení.

  • Plánovač 255 reprezentující DAC má 3 pracovníky spojené. Tito pracovníci jsou přidělováni při spuštění SQL Serveru a nemění. Tito pracovníci jsou používáni pouze ke zpracování dotazů DAC. Dvě úlohy na tomto plánovači představují správce spojení a nečinného pracovníka.

  • active_workers_count představuje všechny pracovníky, kteří mají přiřazené úkoly a běží v nepreemptivním režimu. Některé úkoly, například síťové posluchače, běží na základě předběžného plánování.

  • Skryté plánovače nezpracovávají typické uživatelské požadavky. Výjimkou je DAC plánovač. Tento DAC plánovač má jedno vlákno pro zpracování požadavků.

B. Monitorování neskrytých plánovačů v rušném systému

Následující dotaz ukazuje stav silně zatížených neskrytých plánovačů, kde existuje více požadavků, než kolik je zvládne dostupní pracovníci. V tomto příkladu je přiděleno 256 pracovníků. Některé úkoly čekají na přidělení pracovníkovi. Nižší počet spustitelných úkolů znamená, že na zdroj čeká více úkolů.

Poznámka:

Stav pracovníků zjistíte dotazem sys.dm_os_workers. Pro více informací viz sys.dm_os_workers (Transact-SQL).

Zde je dotaz:

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;  

Tady je soubor výsledků.

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  

Pro srovnání, následující výsledek ukazuje více spustitelných úloh, kde žádný úkol nečeká na získání pracovníka. To work_queue_count platí 0 pro oba plánovače.

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  

Viz také

Zobrazení dynamické správy související s operačním systémem SQL Server (Transact-SQL)