SQL Server’da MEMORY_ALLOCATION_EXT bekleme tipi, motorun işletim sisteminden (Windows) veya SQL Server’ın kendi bellek yöneticisinden bellek tahsis etmek için beklediği genel bir durumdur.
Bu bekleme tipi, RESOURCE_SEMAPHORE gibi doğrudan sorgu bazlı bir kısıtlamadan ziyade, SQL Server’ın iç bileşenlerinin (örneğin nesne oluşturma, bağlantı yönetimi veya iç yapılar) bellek taleplerinin karşılanması sırasındaki gecikmeleri temsil eder.
Bu bekleme tipi, SQL Server’ın “External Allocation” (Dış Tahsis) dediğimiz, genellikle küçük boyutlu ama çok sayıda olan bellek taleplerini ifade eder. SQL Server bu belleği rezerve etmeye çalışırken bir gecikme yaşarsa bu sayaç artar.
Neden Görülür?
- Yoğun Bağlantı Trafiği: Çok kısa sürede binlerce oturumun açılıp kapanması (Login/Logout fırtınası).
- Aşırı Sayıda Nesne Oluşturma: Geçici tabloların (#temp_table) veya değişkenlerin (@table) saniyede binlerce kez oluşturulup yok edilmesi.
- İşletim Sistemi Seviyesinde Bellek Baskısı: Windows’un SQL Server’a bellek vermekte nazlanması veya sayfalama (Paging) yapması.
- Büyük Sayıda Plan Cache Girdisi: Çok fazla ad-hoc (parametresiz) sorgunun plan cache’i şişirmesi ve SQL’in bu yapıyı yönetmek için sürekli yeni bellek alanları açması.
2. Bu Durum Görüldüğünde Ne Yapılmalıdır:
MEMORY_ALLOCATION_EXT genellikle tek başına bir performans darboğazı yaratmaz; ancak yüksek değerlere ulaşıyorsa sistemde bir “bellek yönetimi karmaşası” var demektir.
A. İşletim Sistemi ve Sürücü Kontrolü
- Lock Pages in Memory (LPIM): SQL Server servis hesabına “Lock Pages in Memory” yetkisinin verildiğinden emin olun. Bu, Windows’un SQL Server’ın belleğini diske yazmasını (paging) engeller ve tahsis işlemlerini hızlandırır.
- Güç Planı: Windows Güç Planı’nın “Yüksek Performans” (High Performance) modunda olduğundan emin olun. “Dengeli” modda işlemci hız değişimleri bellek tahsis hızını etkileyebilir.
B. Uygulama ve Sorgu Davranışını İnceleyin
- TempDB Kullanımını Optimize Edin: Eğer sorun geçici nesne oluşturma kaynaklıysa, TempDB üzerindeki baskıyı azaltın veya tablo değişkenleri yerine daha verimli yapılar kullanın.
- Bağlantı Havuzu (Connection Pooling): Uygulamanın her işlem için yeni bir bağlantı açıp kapatmadığından, bağlantı havuzunu (Pooling) doğru kullandığından emin olun.
- Ad-Hoc Sorguları Azaltın: Daha önce bahsettiğimiz optimize for ad hoc workloads ayarını kontrol edin.
C. Donanım ve Yapılandırma
- Max Server Memory: SQL Server’ın kendine ayırdığı belleğin, fiziksel RAM’in %80-%90’ını geçmediğinden emin olun. İşletim sistemine (OS) yeterli alan kalmazsa, OS bellek tahsis taleplerine geç yanıt verir.
Özet
| Durum | Olası Neden | Çözüm |
| Düşük Süreli Bekleme | Normal çalışma rutini. | Müdahale gerektirmez. |
| Yüksek Süreli Bekleme + Yüksek CPU | Çok fazla login/logout veya ad-hoc sorgu. | Connection Pooling ve Parametrizasyon. |
| Yüksek Süreli Bekleme + Düşük Performans | İşletim sistemi sayfalama yapıyor. | Lock Pages in Memory kontrolü ve RAM artırımı. |
MEMORY_ALLOCATION_EXT ile birlikte SOS_SCHEDULER_YIELD veya PAGELATCH_UP gibi beklemeler de görüyor musunuz? Bu, sorunun kaynağını (CPU mu yoksa TempDB mi) netleştirmemize yardımcı olur.
Başka makalede görüşmek dileğiyle..
“Onlar inanmışlar, kalpleri Allah’ı anmakla huzura kavuşmuştur. Dikkat edin, kalpler ancak Allah’ı anmakla huzura kavuşur. “ Ra’d Suresi; 28. Ayet
