Bu makalede mssql server üzerinde bazı durumlarda non yielding scheduler hatası sonucu sistemde çok fazla sayıda eş zamanlı bağlantı varsa, worker thread sınırına ulaşılmış olabilir ve bu durumda sql server’ın çalışmasında sıkıntı ya sebep verebilir. Bu gibi durumlarda sistemde üzerinde bulunan thread sayısının sistem ihtiyacını karşılayacağı seviyede olup olmadığını görmüş olacağız.
SQL Server sürümüne ve işlemci mimarisine (32-bit / 64-bit) göre otomatik hesaplama formülü değişebilir. Modern 64-bit sistemler için standart tablo şöyledir:
| CPU Sayısı | Max Worker Threads (64-bit) |
| <= 4 CPU | 512 |
| 8 CPU | 576 |
| 16 CPU | 704 |
| 32 CPU | 960 |
| 64 CPU | 1472 |
Formül: 512 + ((İşlemci Sayısı – 4) * 16) (Bu formül 4 CPU üzerindeki makineler için geçerlidir).
Aşağıdaki sorgu, SQL Server’ın o anki konfigürasyonuna göre izin verdiği maksimum thread sayısını ve şu an aktif olarak kaç tanesinin kullanımda olduğunu gösterir:
SELECT
max_workers_count AS [Max_Thread_Siniri],
(SELECT COUNT(*) FROM sys.dm_os_workers) AS [Aktif_Worker_Sayisi],
(SELECT COUNT(*) FROM sys.dm_os_threads) AS [Sistemdeki_Toplam_Thread],
max_workers_count - (SELECT COUNT(*) FROM sys.dm_os_workers) AS [Kalan_Kapasite]
FROM sys.dm_os_sys_info;
Thread sınırı aşıldığında, yeni talepler CPU’ya çıkamaz ve beklemeye başlar. Eğer aşağıdaki sorguda work_queue_count değeri 0’dan büyükse, bu doğrudan bir thread darboğazı işaretidir. Aynı zamanda sistemde THREADPOOL beklemeleri yaşanıyor demektir.
SELECT
scheduler_id,
current_workers_count,
active_workers_count,
work_queue_count -- Bu değer 0'dan büyükse thread yetmiyor demektir.
FROM sys.dm_os_schedulers
WHERE status = 'VISIBLE ONLINE';
Max worker tread sayısını ve önerilen worker tread sayısını aşağıdaki komut ile görebiliriz.
SELECT
cpu_count,
hyperthread_ratio,
scheduler_count,
max_workers_count,
-- Otomatik hesaplama formülü:
CASE
WHEN cpu_count <= 4 THEN 512
ELSE 512 + ((cpu_count - 4) * 16)
END AS [Önerilen Max Worker Thread]
FROM sys.dm_os_sys_info;

Tread sayısının fazla olması performans anlamında sıkıntıya sebebiyet verir. Çünkü her tread 2 mb bellek tüketir. Buda memory overhead(bellek yükü) oluşturmaktadır. Cpu treadlar arasında geçiş yaparken zaman kaybeder. Buda context switching oluşmasına sebebiyet verir.
Bazı kullanıcılar thread beklemeye başlar, ve bu da sistemde THREADPOOL wait olarak görünür. Aşağıdaki komut ile yeni değer set edilebilir.
-- Gelişmiş ayarları aktif hale getir
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
-- max worker threads ayarını değiştir
EXEC sp_configure 'max worker threads', 2048;
RECONFIGURE;
Bu ayarı gereksiz yere yükseltmek önerilmez! Çünkü:
- Fazla thread → fazla context switching → CPU yükü artar → performans düşer.
- Önce THREADPOOL beklemeleri analiz edilmeden değişiklik yapılmamalıdır.
Şu sorgu ile sistemde THREADPOOL beklemeleri var mı, görebilirsin:
SELECT wait_type, waiting_tasks_count, wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type = 'THREADPOOL';
Ayrıca aktif thread sayısını görmek için:
SELECT COUNT(*) AS [Active_Worker_Threads]
FROM sys.dm_os_workers
WHERE state =
Eğer bir thread sınırına ulaşıldıysa, SQL Server Error Log içerisine şu hatayı yazar:
“All worker threads for the user scheduler are in use. This may cause performance degradation…”
Bu logları kontrol etmek için şu komutu kullanabilirsin:
EXEC xp_readerrorlog 0, 1, 'worker threads';
Worker Thread sınırın aşılmasına sebep olan işlemeler
- Parallelism (MAXDOP): Bir sorgu çok fazla paralel işlem yapıyorsa (örneğin MAXDOP 64 ise), tek bir sorgu 64 thread birden tüketebilir.
- Blocking: Uzun süren kilitlenmeler (locks), threadlerin serbest kalmasını engelleyerek zincirleme bir birikmeye yol açar.
- Aşırı Bağlantı Sayısı: Uygulama tarafından çok fazla “open connection” bırakılması.
Bu gibi durumlarda yapılması gerekeneler
- MAXDOP Ayarı: Genellikle bir NUMA node üzerindeki çekirdek sayısını geçmeyecek şekilde (genelde 8 idealdir) ayarlanmalıdır.
- CTFP (Cost Threshold for Parallelism): Bu değeri 5’ten 50 gibi daha yüksek bir rakama çekerek, küçük sorguların thread tüketmesini engelleyebilirsiniz.
- Donanım: Eğer iş yükü gerçekten çok fazlaysa, işlemci sayısını artırmak max_worker_threads sayısını otomatik olarak yükseltecektir.
Başka makalede görüşmek dileğiyle..
Gıybet etmeyin. Hucurat-12
