Memory modules with a limit line next to a server, representing the SQL Server max server memory setting

SQL Server Max Server Memory: Nasıl Hesaplanır, Nasıl Ayarlanır, Nasıl Kontrol Edilir?

SQL Server max server memory gerçekte neyi sınırlar, başlangıç değeri nasıl hesaplanır, min server memory ve Lock Pages in Memory ne zaman kullanılır, VM ve çok instance’lı sunucularda nelere dikkat edilir.

Mayıs 26, 2021

SQL Server belleği agresif kullanmak üzere tasarlanmıştır. Buffer pool’da zaten bulunan veri sayfalarının diskten yeniden okunması gerekmez; dolayısıyla SQL Server’ın belleği ne kadar fazlaysa o kadar az I/O’ya ihtiyaç duyar. Ancak varsayılan ayarında bırakıldığında Windows’un kendisi sıkışana kadar bellek almaya devam eder; ardından işletim sistemi, yedekleme ajanları, izleme araçları ve hatta uzak masaüstü oturumları kalan bellek için yarışmaya başlar.

max server memory bu sınırı çizen ayardır. Bu rehberde ayarın gerçekte neyi sınırladığını, mantıklı bir başlangıç değerinin nasıl hesaplanacağını, min server memory ve Lock Pages in Memory’nin ne zaman kullanılacağını, sanal makinelerin ve birden fazla instance’ın nasıl ele alınacağını ve değerin fazla mı yoksa az mı olduğunu gösteren metrikleri anlatıyoruz.

SQL Server Performans Danışmanlığı

Bellek ayarlarınız iş yükünüze uygun mu?

Aryasoft, SQL Server bellek kullanımını, işletim sistemi baskısını ve bekleme türlerini ölçerek max server memory, LPIM ve VM bellek ayarlarını doğru boyutlandırır.

Destek Alın

Varsayılan Değerler ve Neden Değiştirilmeleri Gerekir?

Ayar Varsayılan Minimum Microsoft’un önerisi
min server memory (MB) 0 0 0 (yalnızca VM ve birden fazla instance gibi özel durumlarda artırın)
max server memory (MB) 2.147.483.647 (fiilen sınırsız) 128 Başlangıç noktası olarak, diğer süreçlerin kullanmadığı belleğin %75’i

max server memory’nin varsayılan değeri “sınır yok” demektir. 64 GB RAM’li bir sunucuda SQL Server zamanla 64 GB’ın tamamına doğru büyür. Windows’tan gelen düşük bellek bildirimlerine yanıt verip belleği geri bırakır; ancak bu, işletim sistemi zaten baskı altına girdikten sonra olur.

SQL Server 2019’dan bu yana Windows’taki kurulum sihirbazı, Memory sayfasında kurulum anındaki belleğe göre bir max server memory değeri önerir. Yine de birçok sunucu bu sayfa geçilerek kurulmuştur ya da varsayılanın değiştirilmediği eski sürümlerde kurulmuştur; bu yüzden her instance’ta kontrol etmeye değer:

SELECT name, value, value_in_use
FROM sys.configurations
WHERE name IN (N'max server memory (MB)', N'min server memory (MB)');

max server memory Gerçekte Neyi Sınırlar?

SQL Server 2012’den bu yana max server memory, SQL Server belleğinin büyük bölümünü yönetir: buffer pool, plan cache, sort ve hash işlemleri için memory grant’ler, lock manager ve diğer memory clerk’lerin çoğu. Ancak sqlservr.exe sürecinin kullandığı her şeyi kapsamaz. Sınırın dışında kalanlar şunlardır:

  • Thread stack’leri: 64 bit sistemlerde her worker thread için yaklaşık 2 MB.
  • Extended stored procedure’ler, COM nesneleri ve sp_OA otomasyonu.
  • Sürece yüklenen linked server provider’ları, örneğin Oracle ya da ODBC kaynakları için OLE DB sürücüleri.
  • Yedekleme buffer’ları ve doğrudan Windows’tan yapılan diğer ayırmalar.

Görev Yöneticisi’nde SQL Server sürecinin max server memory’den fazla bellek kullanabilmesinin ve ayarın işletim sisteminin yanı sıra bu ayırmalara da yer bırakması gerekmesinin nedeni budur.

Başlangıç Değeri Nasıl Hesaplanır?

Microsoft’un, ayrılmış bir sunucudaki tek instance için genel yaklaşımı şöyledir:

  1. Toplam fiziksel bellekten başlayın.
  2. Worker thread stack’leri için gereken belleği çıkarın: thread stack boyutu (x64’te 2 MB) çarpı hesaplanan max worker threads.
  3. Kalanın %25’ini, sınır dışındaki diğer ayırmalar ve işletim sistemi için çıkarın.
  4. Geriye kalan, max server memory için başlangıç değeridir.

64 bit SQL Server’da otomatik max worker threads değeri 4 mantıksal işlemciye kadar 512, 64’e kadar 512 + (mantıksal işlemci − 4) × 16, bunun üzerinde ise 512 + (mantıksal işlemci − 4) × 32‘dir.

Sunucu Worker thread Thread stack’leri %25 rezerv sonrası Başlangıç max server memory
32 GB, 8 mantıksal CPU 576 ~1,1 GB ~23,2 GB yaklaşık 23.700 MB
64 GB, 16 mantıksal CPU 704 ~1,4 GB ~47 GB yaklaşık 48.000 MB
256 GB, 32 mantıksal CPU 960 ~1,9 GB ~190,6 GB yaklaşık 195.000 MB

Aynı hesap, çalıştığı sunucunun değerleriyle bir sorgu olarak:

SELECT
    total_mb       = si.physical_memory_kb / 1024,
    max_workers    = si.max_workers_count,
    stacks_mb      = si.max_workers_count * 2,
    suggested_mb   = CAST(((si.physical_memory_kb / 1024) - si.max_workers_count * 2) * 0.75 AS int)
FROM sys.dm_os_sys_info AS si;

Not

%25’lik rezerv bilinçli olarak temkinlidir ve bir başlangıç noktasıdır. Belleği bol, ayrılmış bir sunucuda dörtte birini boş bırakmak çoğu zaman gerekenden fazladır. Başlangıç değerini ayarlayın, gerçek yük altında bir süre kullanılabilir belleği izleyin, ardından değeri adım adım artırın ya da azaltın. Her zaman önce sunucudaki diğer bileşenlerin kullandığı belleği çıkarın: diğer instance’lar, SSIS, SSAS, Power BI Report Server, antivirüs ve yedekleme ajanları.

max server memory’yi Değiştirmek

Değişiklik hemen geçerli olur ve yeniden başlatma gerektirmez:

EXEC sys.sp_configure N'show advanced options', 1;
RECONFIGURE;
EXEC sys.sp_configure N'max server memory (MB)', 48000;
RECONFIGURE;

Değeri belirgin şekilde düşürürseniz SQL Server cache’lerini kırparak belleği kademeli olarak bırakır; çalışma kümesi dengelenene kadar daha fazla disk okuması görürsünüz. Büyük düşüşleri yoğun saatlerin dışında yapın.

Kritik

Production’da max server memory’yi asla çok düşük bir değere ayarlamayın. Birkaç gigabaytın altında SQL Server yanıt vermez hale gelebilir ya da hiç başlamayabilir. Böyle bir durumda instance’ı -f startup seçeneğiyle (minimal yapılandırma) başlatıp değeri geri alın.

min server memory: Ne Zaman İşe Yarar?

min server memory açılışta ayrılmaz. Yalnızca, SQL Server bu değerin üzerine çıktıktan sonra baskı altında belleği bu değerin altına bırakmayacağı anlamına gelir. İki durumda işe yarar:

  • Sanal makineler: hypervisor’ın bellek geri alma mekanizmasının (örneğin balloon driver) buffer pool’u iş yükünün ihtiyacının altına sıkıştırmasını engeller.
  • Aynı sunucuda birden fazla instance: her instance’a bir taban garanti eder; böylece yoğun bir instance sakin olanı aç bırakamaz.

min ve max değerlerini aynı ya da birbirine çok yakın ayarlamayın. SQL Server bu durumda bellek baskısına uyum sağlama yeteneğini kaybeder; Microsoft da bunu açıkça önermez.

Lock Pages in Memory

SQL Server servis hesabına Windows’un Lock pages in memory (LPIM) hakkını vermek, SQL Server’ın Windows’un diske sayfalayamayacağı bellek ayırmasını sağlar. Standard ve Enterprise sürümlerde trace flag gerekmeden kullanılabilir. En çok, Windows’un SQL Server belleğini sayfaladığı durumlarda işe yarar; bu, error log’da 17890 numaralı hata olarak görünür:

A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 seconds. Working set (KB): 1250000, committed (KB): 30500000, memory utilization: 4%.

-- CONVENTIONAL = LPIM yok, LOCK_PAGES = LPIM kullanılıyor, LARGE_PAGES = trace flag 834 ile LPIM
SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;

Uyarı

LPIM’i yalnızca doğru boyutlandırılmış bir max server memory ile birlikte kullanın. Kilitli sayfalar ve varsayılan “sınırsız” ayar birlikte olduğunda SQL Server, Windows’un asla geri alamayacağı belleği alabilir ve sunucunun tamamı kararsız hale gelir. Ne zaman ve nasıl açılacağını Lock Pages in Memory yazımızda anlatıyoruz.

Sanal Makineler

  • Hypervisor’da VM’in belleğini rezerve edin ya da en azından host’ta bellek overcommit yapmayın. Konuk SQL Server, “RAM”inin host tarafından geri alındığını göremez.
  • Production SQL Server VM’lerinde dinamik bellek kullanmayın (Hyper-V Dynamic Memory ya da benzerleri). Buffer pool kendini gördüğü belleğe göre boyutlandırır ve bir görünüp bir kaybolan belleğe kötü tepki verir.
  • Buffer pool’u balloon driver’lara karşı korumak için min server memory ayarlayın; max server memory’yi host’un değil, konuğun belleğine göre boyutlandırın.
  • VM’in NUMA düzenini host ile uyumlu tutun; CPU’lardaki kurallar burada da geçerlidir. Ayrıntılar SQL Server kaç CPU çekirdeği kullanabilir yazımızda.

Aynı Sunucuda Birden Fazla Instance

SQL Server, instance’lar arasında belleği dengelemeye çalışmaz. Varsayılan ayarlarla önce yoğunlaşan instance belleğin büyük kısmını alır, diğerleri aç kalır. Her instance’a iş yüküyle orantılı kendi max server memory değerini verin ve tüm max değerlerinin toplamı ile işletim sistemi rezervinin fiziksel belleğe sığdığından emin olun. Instance’ların her zaman bir minimumu koruması gerekiyorsa min server memory de ekleyin.

Sürüm Sınırları

Standard sürüm, instance başına buffer pool’u sınırlar: SQL Server 2025’te 256 GB, SQL Server 2016–2022’de 128 GB. Columnstore segment cache ve In-Memory OLTP verisinin bunun üzerine ayrı sınırları vardır (SQL Server 2025 Standard’da her biri 32 GB). Express’te buffer pool 1.410 MB ile sınırlıdır. Bu sınırların üzerine eklenen bellek buffer pool’u büyütmez; ama işletim sistemine, diğer cache’lere ve diğer süreçlere yine hizmet eder.

Değer Fazla mı, Az mı?

-- İşletim sistemi açısından: Windows'ta bellek sıkıntısı var mı?
SELECT total_physical_memory_kb / 1024     AS total_mb,
       available_physical_memory_kb / 1024 AS available_mb,
       system_memory_state_desc
FROM sys.dm_os_sys_memory;

-- SQL Server süreci açısından
SELECT physical_memory_in_use_kb / 1024 AS sql_in_use_mb,
       memory_utilization_percentage,
       process_physical_memory_low,
       process_virtual_memory_low
FROM sys.dm_os_process_memory;

-- SQL Server içindeki en büyük bellek tüketicileri
SELECT TOP (10) type, SUM(pages_kb) / 1024 AS mb
FROM sys.dm_os_memory_clerks
GROUP BY type
ORDER BY mb DESC;
Değerin fazla olduğunun işaretleri Değerin az olduğunun işaretleri
Windows’taki kullanılabilir bellek sürekli çok düşük; system_memory_state_desc düşük bellek bildiriyor Windows’ta büyük miktarda boş bellek varken SQL Server sürekli diskten okuyor
Error log’da 17890 hatası (SQL Server belleği sayfalandı) Yüksek PAGEIOLATCH beklemeleri ve düşük, düşmeye devam eden page life expectancy
Uzak masaüstü, yedekleme ajanları ve izleme araçları yavaşlıyor ya da hata veriyor RESOURCE_SEMAPHORE beklemeleri ve sıfırın üzerinde Memory Grants Pending
Sunucudaki diğer instance’lar ya da servisler aç kalıyor Plan cache sürekli küçülüyor, çok sayıda yeniden derleme oluyor

Page life expectancy (PLE), bir sayfanın buffer pool’da ne kadar kaldığını gösterir. Bellek boyutuna ve iş yüküne bağlı olduğu için tek bir doğru eşik yoktur; önemli olan eğilimidir. Belirli bir job her çalıştığında sert düşen bir PLE, belleğin tutabileceğinden fazla veri okuyan job’ı size gösterir.

Sık Yapılan Hatalar

  • Production sunucularında max server memory’yi varsayılanda bırakmak.
  • SQL Server’ın yüksek bellek kullanımını sızıntı sanıp belleği “boşaltmak” için servisi yeniden başlatmak.
  • Aynı sunucudaki diğer instance’ları ve servisleri çıkarmadan max server memory ayarlamak.
  • max server memory’yi ayarlamadan Lock Pages in Memory’yi açmak.
  • min ve max server memory’yi aynı değere ayarlamak.
  • SQL Server VM’lerinde dinamik bellek kullanmak.
  • Migration sonrasında eski sunucunun değerini, belleği farklı olan yeni sunucuya aynen kopyalamak.

Bellek Kontrol Listesi

  • Her instance’ta max server memory ayarlı ve mevcut fiziksel belleğe uygun.
  • Diğer instance’ların ve servislerin kullandığı bellek düşülmüş.
  • Windows’taki kullanılabilir bellek yoğun yük altında izleniyor.
  • VM’lerde ve çok instance’lı sunucularda min server memory ayarlı.
  • LPIM yalnızca boyutlandırılmış bir max server memory ile birlikte kullanılıyor.
  • VM belleği dinamik değil, rezerve.
  • PLE, PAGEIOLATCH ve RESOURCE_SEMAPHORE beklemeleri zaman içinde takip ediliyor.
Microsoft’un yaklaşımıyla başlayın: toplam bellekten worker thread stack’lerini, işletim sistemi ve SQL Server sınırı dışındaki ayırmalar için %25’i ve sunucuda çalışan diğer her şeyi çıkarın. Ardından gerçek yük altında kullanılabilir belleği izleyip değeri adım adım ayarlayın.
Hayır. Yeni değer RECONFIGURE’dan hemen sonra geçerli olur. Değer düşürüldüğünde SQL Server belleği kademeli olarak bırakır.
Çünkü böyle tasarlanmıştır: disk okumalarından kaçınmak için veriyi ve planları bellekte tutar. max server memory sınırı yoksa Windows bellek baskısı bildirene kadar büyür. Bu bir bellek sızıntısı değil, beklenen davranıştır; çözüm servisi yeniden başlatmak değil, max server memory’yi ayarlamaktır.
Bazı ayırmalar sınırın dışındadır: worker thread stack’leri, extended stored procedure’ler, COM ve sp_OA nesneleri, linked server provider’ları ve yedekleme buffer’ları. Ayarın bunlara da yer bırakması gerekir.
Windows’un SQL Server belleğini sayfaladığı durumlarda (17890 hatası) ve yalnızca doğru boyutlandırılmış bir max server memory ile birlikte değerlendirin. Sayfalama yaşanmayan, doğru boyutlandırılmış bir sunucuda çoğu zaman gerekli değildir.

SQL Server Performans Danışmanlığı

Sunucunuzun belleğinden en iyi şekilde yararlanın

Aryasoft’un kıdemli DBA ekibi hem Windows hem SQL Server tarafında bellek baskısını ölçer, max ve min server memory’yi iş yükünüze göre boyutlandırır, Lock Pages in Memory ve VM ayarlarını güvenle yapılandırır ve sonucu gerçek yük altında takip eder.

4.7/5