THREADPOOL bekleme türü, SQL Server’ın yeni bir işi (task) yürütebilmek için boşta bir iş parçacığı (worker thread) bulamadığı durumlarda ortaya çıkar. SQL Server, her bir sorgu veya sistem görevi için bir “Worker” atar. Eğer tüm worker thread’ler meşgulse, yeni gelen talepler bir worker boşa çıkana kadar kuyrukta bekler.
SQL Server’da her worker thread için ayrılan Stack Size; 32-bit sistemlerde 512 KB, 64-bit sistemlerde ise 2 MB‘dır. Bu sabit bir değerdir. Çok yüksek thread sayısı, bu yüzden “Memory Overhead” oluşturarak tampon bellek (Buffer Pool) alanından çalar.
sp_configure üzerinden belirlenen max worker threads için üst limit 65535 olsa da, bu değere çıkılması sistemin “Context Switching” (bağlam değişimi) yükü altında ezilmesine ve çökmesine neden olur.
Sql server üzerinde worker treads sayısı, anlık çalışan thread sayısı ve bekleyen threads sayılarını sayfada bulunan ilgili makaleden okunabilir.
Sadece kullanıcı sayısının fazlalığı değil, şu durumlar da bu beklemeyi tetikler:
- Blocking (Engelleme): Bir sorgu bir kaynağı kilitler (Lock) ve bırakmazsa, onu bekleyen yüzlerce sorgu worker thread’leri işgal etmeye devam eder. Bu da “Thread Starvation” (Thread Açlığı) yaratır.
- Paralellik Patlaması (MAXDOP): Bir sorgu 64 thread birden kullanacak şekilde paralel çalışıyorsa, birkaç büyük sorgu tüm havuzu bitirebilir.
- Zayıf Donanım: CPU çekirdek sayısının iş yüküne göre yetersiz kalması.
Çözüm Önerileri (Sırasıyla)
- Blocking Analizi: sp_WhoIsActive veya sys.dm_os_waiting_tasks kullanarak uzun süren kilitlenmeleri bulun. Genelde sebep thread sayısı değil, bırakılmayan kilitlerdir.
- MAXDOP Ayarı: Sunucu düzeyindeki Max Degree of Parallelism ayarını kontrol edin. Genellikle bir NUMA node üzerindeki fiziksel çekirdek sayısını (ideal 8) geçmemelidir.
- Cost Threshold for Parallelism: Bu değeri varsayılan olan 5’ten 50’ye yükselterek, küçük sorguların çok sayıda thread tüketmesini engelleyin.
- Bağlantı Yönetimi: Uygulama tarafındaki “Connection Pooling” ayarlarını gözden geçirin.
- En Son Çare – Limit Artırımı: Eğer yukarıdakiler çözmüyorsa ve CPU kullanımın %100 değilse, max worker threads değerini formülün bir tık üzerine (örneğin 1024’e) çekebilirsiniz.
Max worker threads değerini çok yüksek bir sayıya (örn. 5000) set etmek, her thread için 2 MB bellek ayrılacağından (5000 * 2MB = 10GB RAM), SQL Server’ın bellek yönetimine ağır bir yük bindirir.
Worker Threads’lerle ilgili daha fazla bilgi almak için sayfada bulunan ilgili makale okunabilir.
Başka makalede görüşmek dileğiyle..
Alçak gönüllü şekilde yürüyün. Furkan-63
