SQL Server’da CLR_SEMAPHORE, SQL Server içinde çalışan Common Language Runtime (CLR) nesnelerinin (procedure, trigger veya kullanıcı tanımlı fonksiyonlar) yönetilen bellek (managed memory) üzerinde bir işlem yapmak için “izin” (semaphore) beklediği durumlarda oluşur.
Basitçe ifade etmek gerekirse: “SQL Server’ın içine gömülü olan .NET çalışma ortamında bellek veya işlem limiti doldu, yeni bir .NET işlemi başlatmak için sıra bekleniyor.”
SQL Server, CLR işlemlerinin tüm sunucu belleğini sömürmemesi için bir sınırlama mekanizmasına sahiptir. Bu bekleme tipi şu durumlarda artar:
- Yoğun CLR Kullanımı: Veritabanı üzerinde çok fazla .NET tabanlı kod (DLL) çalıştırılıyorsa.
- Bellek Baskısı (Memory Pressure): SQL Server’ın toplam belleği azaldığında, CLR için ayrılan güvenli alan da daralır.
- Garbage Collection (Çöp Toplama) Gecikmeleri: .NET’in kendi içindeki bellek temizleme mekanizması (GC) yetişemediğinde, yeni nesne oluşturma talepleri beklemeye alınır.
- Kötü Yazılmış CLR Kodu: Belleği düzgün serbest bırakmayan veya çok büyük veri yapılarını bellekten çekmeye çalışan .NET kodları.
Eğer bu bekleme tipi sisteminizde ciddi bir performans kaybına yol açıyorsa, şu adımları izleyerek sorunu daraltabilirsiniz:
A. CLR Kodunu İnceleyin
Bu bir SQL sorunu değil, aslında bir kod sorunudur.
- .NET kodunuzda statik değişkenlerin aşırı kullanımı var mı?
- Büyük veri kümelerini belleğe (DataTable veya devasa List yapıları gibi) mi çekiyorsunuz?
- CLR kodunuzun içinde belleği manuel olarak yönetmeniz gereken yerler (Disposing) ihmal edilmiş mi?
B. SQL Server Bellek Yapılandırması
SQL Server’ın CLR için ayırdığı alanı kontrol edin.
- Max Server Memory: Eğer bu ayar çok yüksekse ve işletim sistemine yer bırakmıyorsa, CLR (ki SQL’in “bütünleşik olmayan” belleğinden de beslenebilir) sıkışabilir.
- Sisteme ek RAM eklemek çoğu zaman CLR kaynaklı semafor beklemelerini doğrudan çözer.
C. Sorgu Optimizasyonu
CLR fonksiyonlarını bir WHERE şartı içinde veya milyonlarca satır üzerinde döngü kuracak şekilde mi kullanıyorsunuz?
- CLR fonksiyonlarını mümkünse sadece gerekli olan küçük veri setleri üzerinde çalışacak şekilde çağırın.
Özetle
| Durum | Olası Sebep | Aksiyon |
| Sürekli yüksek değer | CLR bellek limiti dolmuş. | Sunucu RAM miktarını veya max server memory ayarını kontrol edin. |
| Anlık zirveler | Ağır bir .NET işlemi çalışıyor. | O an çalışan CLR nesnelerini (sys.dm_clr_appdomains) izleyin. |
| İşlem sırasında donma | .NET Garbage Collection (GC) yükü. | Kodu optimize edin, büyük nesneleri bellekten temizleyin. |
Eğer sisteminizde hiç CLR (C# veya VB.NET ile yazılmış DLL’ler) kullanmıyorsanız ama bu beklemeyi görüyorsanız, sisteminizde yüklü olan bazı üçüncü parti araçlar (yedekleme yazılımları, izleme araçları vb.) arka planda CLR kullanarak SQL Server’a bağlanıyor olabilir.
Başka makalede görüşmek dileğiyle..
Eğer onlar tevbe edip namazı kılarlarsa ve zekatı verirlerse, artık onlar sizin dinde kardeşlerinizdir. Bilen bir topluluk için ayetleri böyle birer birer açıklarız. Tevbe Suresi, 11. Ayet
