SQL Server, iş parçacıklarını (threads) yönetmek için Non-Preemptive (işbirlikçi) bir çizelgeleme yapısı olan SQLOS‘u kullanır. Normal şartlarda SQL Server, bir görevin ne kadar süre çalışacağını kendisi kontrol eder.
Ancak, SQL Server işletim sistemine ait bir fonksiyonu (Windows API) çağırmak zorunda kaldığında, kontrolü Windows’a devreder. Windows bu görevi Preemptive (öncelikli) olarak yönetir; yani SQL Server bu işlemin ne zaman biteceğini kontrol edemez, sadece sonucun dönmesini bekler. Bu süreçte kaydedilen bekleme süresi PREEMPTIVE_OS_CALLS olarak adlandırılır.
Bu bekleme tipi oldukça genel bir “çatı” terimdir. Genellikle aşağıdaki senaryolarda tetiklenir:
- Dosya Sistemi İşlemleri: Veritabanı dosyalarının (mdf, ldf) oluşturulması, genişletilmesi (Auto-grow) veya silinmesi sırasında Windows API’leri çağrılır.
- Active Directory Sorguları: SQL Server üzerinden yapılan LDAP sorguları veya Windows kimlik doğrulama süreçlerindeki gecikmeler.
- Extended Stored Procedures: xp_cmdshell, xp_fixeddrives gibi işletim sistemi seviyesinde komut çalıştıran prosedürler.
- CLR (Common Language Runtime) Kodları: SQL Server içinde koşan özel .NET kodlarının harici kaynaklara erişimi.
- Log Yazma ve Yedekleme: Disk alt yapısındaki darboğazlar nedeniyle I/O taleplerinin işletim sistemi tarafından yavaş karşılanması.
- DNS Çözümleme: Bağlantı istekleri sırasında DNS sunucusuna gidip gelme süreleri.
Hangi Durumlarda Görülür?
| Durum | Açıklama |
|---|---|
| Linked Server çağrıları | Özellikle uzak sunucudan veri çekerken |
| File system işlemleri | Dosya okuma/yazma (örneğin xp_cmdshell, BULK INSERT, OPENROWSET) |
| Active Directory istekleri | Kullanıcı kimlik doğrulaması, grup sorguları |
| CLR (Common Language Runtime) işlemleri | .NET ile yazılmış SQL Server uzantıları |
| Ağ üzerinden yavaş işlem | Örneğin DFS paylaşımları veya SMB protokolleriyle dosya okuma |
Bu bekleme tipini azaltmak için odağımızı SQL dışındaki bileşenlere çevirmeliyiz:
- Anında Dosya Başlatma (Instant File Initialization): SQL Server’ın veri dosyalarını genişletirken diski sıfırlarla doldurmasını engelleyerek bu beklemeyi ciddi oranda azaltabilirsiniz.
- Disk Performansı: I/O alt yapısını kontrol edin. Disk gecikmeleri (Latency) Windows API çağrılarının uzamasına neden olur.
- Ağ ve DNS: Eğer bekleme tipi PREEMPTIVE_OS_LOOKUPNAMES gibi alt kırılımlardaysa, ağ yapılandırmasını ve DNS hızlarını kontrol edin.
- Antivirüs Ayarları: Antivirüs yazılımının SQL Server veri ve log dosyalarını taramadığından emin olun. Tarama işlemi, her dosya erişiminde SQL’i “beklemeye” alır.
Bu bekleme tipini incelerken sys.dm_os_waiting_tasks ve sys.dm_os_wait_stats DMV’lerini (Dynamic Management Views) kullanarak hangi alt API çağrısının (örneğin GetFileAttributes veya CreateFile) gecikmeye neden olduğunu tespit etmek, asıl sorunu bulmanızı sağlar.
Başka makalede görüşmek dileğiyle..
Kötülüğe iyilikle karşılık verin.Fussilet-34
