Aracılığıyla paylaş


sys.dm_os_schedulers (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Microsoft Fabric'te SQL Veritabanı

SQL Server'da her zamanlayıcının tek bir işlemciye eşlendiği zamanlayıcı başına bir satır döndürür. Zamanlayıcının koşulunu izlemek veya kaçak görevleri tanımlamak için bu görünümü kullanın. Zamanlayıcılar hakkında daha fazla bilgi için Thread ve Görev Mimarisi Rehberi'ne bakınız.

Uyarı

Bunu Azure Synapse Analytics veya Analytics Platform System (PDW) olarak adlandırmak için sys.dm_pdw_nodes_os_schedulers adını kullanın. Bu söz dizimi, Azure Synapse Analytics'teki sunucusuz SQL havuzu tarafından desteklenmez.

Sütun adı Veri türü Description
scheduler_address varbinary(8) Zamanlayıcının bellek adresi. Null olamaz.
parent_node_id int Zamanlayıcının ait olduğu düğümün kimliği, yani ana düğüm olarak da bilinir. Bu, bir düzensiz bellek erişimi (NUMA) düğümünü temsil eder. Null olamaz.
zamanlayıcı_id int Zamanlayıcının kimliği. Düzenli sorgular yürütmek için kullanılan tüm zamanlayıcıların ID numaraları 1048576'ten küçüktür. 1048576'den büyük veya eşit ID'ye sahip zamanlayıcılar, SQL Server tarafından dahili olarak kullanılır, örneğin özel yönetici bağlantı zamanlayıcısı. Null olamaz.
cpu_id smallint Zamanlayıcıya atanmış CPU ID.

Null olamaz.

Not: 255, SQL Server 2005 (9.x)'deki gibi herhangi bir yakınlık belirtmez. Ek yakınlık bilgileri için sys.dm_os_threads (Transact-SQL) bölümüne bakınız.
statü nvarchar(60) Zamanlayıcının durumunu gösterir. Aşağıdaki değerlerden biri olabilir:

- GIZLI ÇEVRIMIÇI
- GIZLI ÇEVRIMDİRİŞ
- ÇEVRIMIÇI GÖRÜNÜR
- GÖRÜNÜR ÇEVRIMDİRİŞ
- VISIBLE ONLINE (DAC)
- HOT_ADDED

Null olamaz.

HIDDEN zamanlayıcılar, Veritabanı Motoru dahili talepleri işlemek için kullanılır. VISIBLE zamanlayıcılar kullanıcı taleplerini işlemek için kullanılır.

Çevrimdışı zamanlayıcılar, affinity maskesinde çevrimdışı olan ve bu nedenle herhangi bir isteği işlemek için kullanılmayan işlemcilere eşlenir. ONLINE zamanlayıcılar, affinity maskesinde çevrimiçi olan ve iş parçacıklarını işlemeye açık olan işlemcilere eşlenir.

DAC, zamanlayıcının özel bir yönetici bağlantısı altında çalıştığını gösterir.

HOT ADDED, zamanlayıcıların bir sıcak ekleme CPU olayına yanıt olarak eklendiğini gösterir.
is_online bit SQL Server sunucudaki mevcut işlemcilerin sadece bazılarını kullanacak şekilde yapılandırılmışsa, bu yapılandırma bazı zamanlayıcıların affinity maskesinde olmayan işlemcilere eşlendiği anlamına gelebilir. Eğer durum buysa, bu sütun 0 döner. Bu değer, zamanlayıcının sorguları veya toplu işleri işlemek için kullanılmadığı anlamına gelir.

Null olamaz.
is_idle bit 1 = Zamanlayıcı boşta. Şu anda hiçbir çalışan çalışmakta değil. Null olamaz.
preemptive_switches_count int Bu zamanlayıcıdaki çalışanların kaç kez önleyici moda geçtiği.

SQL Server dışındaki kodu (örneğin, genişletilmiş saklı yordamlar ve dağıtılmış sorgular) yürütmek için, iş parçacığının önleyici olmayan zamanlayıcının denetimi dışında yürütülmesi gerekir. Bunu yapmak için bir çalışan önalımlı moda geçer.
context_switches_count int Bu zamanlayıcıda gerçekleşen bağlam değişimlerinin sayısı. Null olamaz.

Diğer çalışanların çalışabilmesi için, mevcut çalışan işçi zamanlayıcı kontrolünü bırakmak veya bağlamı değiştirmek zorunda kalır.

Not: Bir çalışan zamanlayıcıyı teslim edip çalıştırılabilir kuyruğa koyarsa ve başka çalışan bulamazsa, kendisini seçer. Bu durumda context_switches_count güncellenmiyor, ama yield_count güncelleniyor.
idle_switches_count int Programlayıcının boşta bir etkinliği beklediği kaç kez var. Bu sütun context_switches_count'a benzer. Null olamaz.
current_tasks_count int Bu zamanlayıcı ile ilişkili mevcut görevlerin sayısı. Bu sayım aşağıdakileri içerir:

- Bir çalışanın onları yerine getirmesini bekleyen görevler.
- Şu anda bekleyen veya çalışan görevler (SUSPENDED veya RUNNABLE durumda).

Bir görev tamamlandığında, bu sayı azalır. Null olamaz.
runnable_tasks_count int Görev atanmış ve çalıştırılabilir kuyruk üzerinde planlanmayı bekleyen çalışan sayısı. Null olamaz.
current_workers_count int Bu programlayıcıyla ilişkili çalışan sayısı. Bu sayı, herhangi bir göreve atanmayan çalışanları da kapsar. Null olamaz.
active_workers_count int Aktif çalışan sayısı. Aktif bir çalışan asla önleyici değildir, ilişkili bir görevi olmalıdır ve ya koşabilir, çalıştırılabilir veya askıya alınmıştır. Null olamaz.
work_queue_count bigint Bekleyen kuyruk üzerindeki görev sayısı. Bu görevler, bir çalışanın onları almasını bekliyor. Null olamaz.
pending_disk_io_count int Tamamlanmayı bekleyen bekleyen G/O sayısı. Her zamanlayıcı, bağlam değişikliği olduğunda tamamlanıp tamamlanmadığını belirlemek için bekleyen bir G/O listesi vardır. İstek eklendiğinde sayım artırılır. Bu sayı, talep tamamlandığında azalır. Bu sayı, I/O'nun durumunu göstermez. Null olamaz.
load_factor int Bu zamanlayıcıda algılanan yükü gösteren iç değer. Bu değer, yeni bir görevin bu zamanlayıcıya mı yoksa başka bir zamanlayıcıya mı eklenmesi gerektiğini belirlemek için kullanılır. Bu değer, zamanlayıcıların eşit şekilde yüklenmediği göründüğünde hata ayıklama amacıyla faydalıdır. Rota kararı, zamanlayıcıdaki yüke göre verilir. SQL Server ayrıca, kaynak edinilecek en iyi konumu belirlemeye yardımcı olmak için düğümler ve zamanlayıcılardan oluşan bir yük faktörü kullanır. Bir görev sıraya alındığında, yük faktörü artar. Bir görev tamamlandığında, yük faktörü azalır. Yük faktörlerinin kullanılması SQL Server OS'nin iş yükünü daha iyi dengelemesine yardımcı oluyor. Null olamaz.
yield_count int Bu zamanlayıcıda ilerlemeyi göstermek için kullanılan iç değer. Bu değer, Scheduler Monitor tarafından, bir çalışanın diğer çalışanlara zamanında teslim olup olmadığını belirlemek için kullanılır. Bu değer, çalışanın veya görevin yeni bir çalışana geçtiğini göstermez. Null olamaz.
last_timer_activity bigint CPU ticklerinde, zamanlayıcı zamanlayıcı kuyruğunun zamanlayıcı tarafından son kez kontrol edildiyi zamanlayıcı. Null olamaz.
failed_to_create_worker bit Bu zamanlayıcıda yeni bir çalışan oluşturulamazsa 1'e ayarlanır. Bu genellikle bellek kısıtlamaları nedeniyle ortaya çıkar. Boş değer atanabilir.
active_worker_address varbinary(8) Şu anda aktif olan çalışanın bellek adresi. Boş değer atanabilir. Daha fazla bilgi için bkz. sys.dm_os_workers (Transact-SQL).
memory_object_address varbinary(8) Zamanlayıcı bellek nesnesinin bellek adresi. GEÇERSIZ OLMAZ.
task_memory_object_address varbinary(8) Görev belleği nesnesinin bellek adresi. Null olamaz. Daha fazla bilgi için sys.dm_os_memory_objects (Transact-SQL) sayfasına bakınız.
quantum_length_us bigint Yalnızca bilgilendirme amacıyla tanımlanır. Desteklenmiyor. Gelecekteki uyumluluk garanti edilmemektedir. SQLOS tarafından kullanılan zamanlayıcı kuantumunu açığa çıkarır.
total_cpu_usage_ms bigint Geçerlidir: SQL Server 2016 (13.x) ve sonrası

Önleyici olmayan çalışanlar tarafından bildirilen bu zamanlayıcı tarafından tüketilen toplam CPU. Null olamaz.
total_cpu_idle_capped_ms bigint Yalnızca bilgilendirme amacıyla tanımlanır. Desteklenmiyor. Gelecekteki uyumluluk garanti edilmemektedir. Service Level Objective'e dayalı throttling gösterir, SQL Server'ın Azure dışı sürümleri için her zaman 0 olacaktır. Boş değer atanabilir.
total_scheduler_delay_ms bigint Geçerlidir: SQL Server 2016 (13.x) ve sonrası

Bir çalışanın değişmesiyle diğerinin işe girmesi arasındaki süre. Önleyici çalışanların bir sonraki önleyici olmayan çalışanın zamanlamasını geciktirmesi veya işletim sisteminin diğer süreçlerden gelen iş parçacıklarını zamanlaması nedeniyle olabilir. Null olamaz.
ideal_workers_limit int Geçerlidir: SQL Server 2019 (15.x) ve sonrası

Planlama cihazında ideal olarak kaç işçi olması gerektiği. Mevcut çalışanlar dengesiz görev yükü nedeniyle sınırı aşarsa, boş kaldıklarında kesileceklerdir. Null olamaz.
pdw_node_id int için geçerlidir: Azure Synapse Analytics, Analiz Platformu Sistemi (PDW)

Bu dağıtımın üzerinde olduğu düğümün tanımlayıcısı.

Permissions

SQL Server ve SQL Yönetilen Örneği'ne VIEW SERVER STATE izni gerekir.

SQL Veritabanı Temel,S0 ve S1 hizmet hedeflerinive elastik havuzlardaki veritabanları için, sunucu yöneticisi hesabı, Microsoft Entra yönetici hesabı veya ##MS_ServerStateReader##sunucu rolü üyeliği gereklidir. Diğer tüm SQL Veritabanı hizmet hedeflerinde, veritabanında VIEW DATABASE STATE izni veya ##MS_ServerStateReader## sunucu rolü üyeliği gereklidir.

SQL Server 2022 ve üzeri için izinler

Sunucuda SUNUCU PERFORMANS DURUMUNU GÖRÜNTÜLE izni gerektirir.

Örnekler

A. Gizli ve gizli olmayan zamanlayıcıların izlenmesi

Aşağıdaki sorgu, SQL Server'daki tüm zamanlayıcılar üzerindeki çalışanların ve görevlerin durumunu çıkarır. Bu sorgu, aşağıdaki özelliklere sahip bir bilgisayar sisteminde yürütülmüştür:

  • İki işlemci (CPU)

  • İki (NUMA) düğümü

  • Her NUMA düğümü için bir CPU

  • Affinity maski olarak 0x03ayarlandı.

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;  

Sonuç kümesi aşağıdadır.

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  

Çıktı aşağıdaki bilgileri sağlar:

  • Beş programcı var. İki zamanlayıcının bir kimlik değeri < 1048576. ID >= 1048576 olan zamanlayıcılar gizli zamanlayıcılar olarak bilinir. Zamanlayıcı 255 , özel yönetici bağlantısını (DAC) temsil eder. Her örnek için bir DAC zamanlayıcı vardır. Bellek basıncını koordine eden kaynak monitörleri, her NUMA düğümü için bir tane zamanlayıcı 257 ve zamanlayıcı 258kullanır

  • Çıktıda 23 aktif görev bulunmaktadır. Bu görevler, SQL Server tarafından başlatılan kaynak yönetimi görevlerinin yanı sıra kullanıcı taleplerini de içerir. SQL Server görevlerine örnek olarak RESOURCE MONITOR (her NUMA düğümü için bir tane), LAZY WRITER (HER NUMA DÜĞÜMÜ IÇIN BIR TANE), LOCK MONITOR ve LOG WRITER verilebilir.

  • NUMA düğümü 0 CPU'ya 1 eşlenir ve NUMA düğümü 1 CPU'ya 0eşlenir. SQL Server genellikle 0 düğüm dışında bir NUMA düğümünde başlar.

  • Geri 0döndüğünderunnable_tasks_count, aktif olarak çalıştırılan görevler yoktur. Ancak, aktif seanslar da olabilir.

  • DAC'ı temsil eden zamanlayıcının 255 kendisiyle ilişkili çalışanları 3 vardır. Bu çalışanlar SQL Server başlangıcında tahsis edilir ve değişmezler. Bu çalışanlar yalnızca DAC sorgularını işlemek için kullanılır. Bu zamanlayıcıdaki iki görev, bir bağlantı yöneticisi ve boşta çalışan bir kişiyi temsil eder.

  • active_workers_count Bağlantılı görevleri olan ve önleyici olmayan modda çalışan tüm çalışanları temsil eder. Bazı görevler, örneğin ağ dinleyicileri, önleyici zamanlama altında çalışır.

  • Gizli zamanlayıcılar tipik kullanıcı taleplerini işlemez. DAC zamanlayıcı istisnadır. Bu DAC zamanlayıcının talepleri işlemek için tek bir iş parçacığı vardır.

B. Yoğun bir sistemde gizli olmayan zamanlayıcıların izlenmesi

Aşağıdaki sorgu, mevcut çalışanların işleyebileceğinden daha fazla isteğin bulunduğu ağır yüklü gizli olmayan zamanlayıcıların durumunu gösterir. Bu örnekte, 256 çalışana görevler verilmiştir. Bazı görevler bir çalışana atama bekler. Daha düşük çalıştırılabilir sayı, birden fazla görevin bir kaynak için beklediği anlamına gelir.

Uyarı

İşçilerin durumunu sys.dm_os_workers sorgulayışla öğrenebilirsiniz. Daha fazla bilgi için bkz. sys.dm_os_workers (Transact-SQL).

İşte soru:

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;  

Sonuç kümesi aşağıdadır.

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  

Karşılaştırma olarak, aşağıdaki sonuç, bir işçi elde etmek için beklemeyen birden fazla çalıştırılabilir görevi gösterir. Her iki programlayıcı için de geçerlidir work_queue_count0 .

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  

Ayrıca bakınız

SQL Server İşletim Sistemiyle İlgili Dinamik Yönetim Görünümleri (Transact-SQL)