MSSQL Server’da CLR_SEMAPHORE Bekleme Tipi

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

DurumOlası SebepAksiyon
Sürekli yüksek değerCLR bellek limiti dolmuş.Sunucu RAM miktarını veya max server memory ayarını kontrol edin.
Anlık zirvelerAğı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

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir