SQL Server’ın kendi işletim sistemi gibi davranan yapısı (SQLOS), CPU kaynaklarını yönetmek için “Schedulers” (Zamanlayıcılar) mekanizmasını kullanır. Performans sorunlarını teşhis ederken, sorguların CPU üzerinde nasıl dağıldığını ve bir darboğaz olup olmadığını anlamak için bu yapıyı analiz etmek hayati önem taşır.
Aşağıdaki sorgularla, SQL Server’ın işlemci çekirdeklerini ne kadar verimli kullandığını ve anlık iş yükü dağılımını takip edebilirsiniz.
Bu sorgu, her bir CPU çekirdeğinin anlık yükünü ve kuyruk durumunu listeler.
SELECT
scheduler_id,
cpu_id,
current_tasks_count,
runnable_tasks_count,
active_workers_count
FROM sys.dm_os_schedulers
WHERE status = 'VISIBLE ONLINE'
ORDER BY cpu_id;

SQL Server, yeni bir bağlantı veya sorgu geldiğinde bunu en az yükü olan Scheduler’a atamaya çalışır. Tablonuzdaki current_tasks_count değerlerin birbirine yakın olması (örneğin 12 ile 21 arasında değişmesi), yük dengeleme (load balancing) mekanizmasının çalıştığını gösterir.
Karşımıza çıkan temel sütunların ne ifade ettiğini netleştirelim:
- cpu_id: İşletim sistemi düzeyindeki fiziksel veya mantıksal çekirdek numarasıdır. 0’dan başlayarak sistemdeki toplam çekirdek sayısına kadar gider. Sunucu üzerindeki core sayısına tamamlayacak seviyededir.
- scheduler_id: SQL Server’ın iç yönetiminde her bir zamanlayıcıya verdiği benzersiz kimlik numarasıdır. Sunucu üzerinde 192 core bulunmaktadır.
- current_tasks_count: İlgili scheduler üzerinde o an itibarıyla bulunan (çalışan veya bekleyen) toplam görev sayısıdır. Değerin 0 olması, o çekirdeğin tamamen boşta olduğunu gösterir.
- active_workers_count: Görevleri yerine getiren aktif “işçi” (thread) sayısıdır. Her aktif worker, bir task’ı işlemekle görevlidir.
- runnable_tasks_count: İşte burası “darboğaz”ın (bottleneck) kilit noktasıdır! CPU çekirdeğine girmek için kuyrukta bekleyen iş sayısını gösterir. Kritik Not: Bu değerin sürekli olarak 5-10 bandının üzerinde olması, CPU’nun gelen taleplere yetişemediğinin ve sistemde işlemci darboğazı oluştuğunun kesin kanıtıdır.
Bu değerlerin dağılımı aslında SQL Server’ın toplam iş yükünün (Worker Threads) işlemciler (Scheduler’lar) arasındaki dengesini temsil eder.
current_tasks_count değerleriniz oldukça homojen. Eğer bir scheduler 100, diğeri 2 olsaydı, o zaman bir “işlemci darboğazı” veya “affinitization” (belirli bir CPU’ya takılı kalma) sorunundan bahsedebilirdik.
runnable_tasks_count sütunundaki değerlerin (örneğin 226 ID’li CPU’da 5 olması) sıfırdan büyük olması, o CPU’da çalışmak için kuyrukta bekleyen işler olduğunu gösterir. Bu değer sürekli yüksekse CPU yetersizliği söz konusu olabilir.
SQL Server’ın toplam bir Max Worker Threads kapasitesi vardır. Buradaki active_workers_count toplamı, sunucu genelindeki limitinize yaklaşıyorsa “Thread Starvation” (thread açlığı) yaşanabilir.
Çekirdek bazında mevcut ve aktif worker sayılarını gruplayarak görmek için bu yapıyı kullanabilirsiniz. Yukarıdaki kodun daha da minimize edilmiş halidir.
SELECT
scheduler_id AS CPU_NO,
current_tasks_count AS Mevcut_Worker,
SUM(active_workers_count) AS Aktif_Worker
FROM sys.dm_os_schedulers
WHERE status = 'VISIBLE ONLINE'
GROUP BY scheduler_id, current_tasks_count, active_workers_count
ORDER BY scheduler_id;

Sistem genelinde o anda kaç worker’ın aktif olarak çalıştığını hızlıca kontrol etmek için:
SELECT
SUM(active_workers_count) AS Toplam_Aktif_Worker
FROM sys.dm_os_schedulers
WHERE status = 'VISIBLE ONLINE';

Mevcutta bulunan worker sayısını göstermektedir.
select SUM(current_workers_count) AS Mevcut_Toplam_Worker from sys.dm_os_schedulers

Aşağıdaki ekran görüntüsünde görüldüğü üzere, her bir cpu_id için görevlerin dağılımını izliyoruz:
Gözlem:
- Eğer current_tasks_count değerleri tüm scheduler’larda birbirine yakınsa, SQL Server iş yükünü çekirdeklere dengeli dağıtıyor demektir.
- runnable_tasks_count sütununda yüksek rakamlar görüyorsanız (örneğin görseldeki gibi 0 veya 1 değil de 15-20 gibi), CPU kaynaklarınızı artırmayı veya pahalı sorguları (Execution Plan) optimize etmeyi düşünmelisiniz.
SQL Server performansını izlerken sadece “CPU kullanım yüzdesi”ne bakmak yanıltıcı olabilir. sys.dm_os_schedulers üzerinden yapacağınız bu analiz, size sorunun kaynağının donanımsal yetersizlik mi yoksa işlenmeyi bekleyen yoğun bir sorgu kuyruğu mu olduğunu net bir şekilde gösterecektir.
Başka makalede görüşmek dileğiyle..
Gıybet etmeyin. Hucurat-12
