SQL Server belleği
SQL Server belleğiyle ilgilidir. Sunucunun belleği tükendiğinde, CPU kullanım sorunlarının üstesinden gelmek için donanıma ek bellek eklemenizi öneririz.
Ancak bellek yükseltmesine geçmeden önce, sorun gidermenin bir parçası olarak, örnekte halihazırda tüketilen SQL belleğini nasıl kontrol edeceğiz / hesaplayacağız.
Örneğin:
SUNUCU ADI: XXXXXXXXXXXXX
Yüklü Fiziksel Bellek (RAM): 64.0 GB
Şu anda ayrılmış SQL Server belleği: 58982 MB -> 58.982 GB
Bu durumda, sunucuda yalnızca bir örneğimiz (MSSQLSERVER) var ve standarda göre örneğe% 80 bellek ayrıldı. Ve% 20'si Uygulama ve İşletim Sistemine ayrılmıştır.
Kaynak Monitörünü kontrol ettiğimizde, SQL Server Belleğini buna ayarladığımız için% 80 dolu olarak görünecektir.
Ancak bu, SQL'in arka uçta arabellekte biraz yer tutacağından, SQL'in% 80'inin tamamen kullanıldığı anlamına gelmez. Sörf yaptığımda, örnek üzerinde tüketilen SQL Belleğini hesaplamak için aşağıdaki formülü aldım ancak bu parametreler performans izleme aracından çok önce kaldırıldı.
Kontrol etmenin bir yolu var mı, şu anda SQL'in% 80'den (OR) ne kadarını bellek yükseltmesiyle devam edebileceğimiz ölçümler üzerinde kullandı.
SQL BELLEĞİNİ HESAPLAMAK İÇİN FORMÜL: (Aşağıdaki parametreler Performans İzleyicisi'nden kaldırılmıştır)
*Database Usage(GB) = (Totalpages-Freepages-Stolenpages)8/1024=MB/1024=GB
Yanıtlar
Örnekte şu anda tüketilen SQL belleğini nasıl kontrol ederiz / hesaplarız.
Bunu yapmak oldukça basit. Size bilgi verecek DMV sys.dm_os_process_memory'ye sahipsiniz . Sana verecek physical memory usedvetotal memory used (RAM+Page file)
select (physical_memory_in_use_kb/1024) as Phy_Mem_used_MB, (virtual_address_space_committed_kb/1024) as Total_mem_Used_MB
from sys.dm_os_process_memory
Ancak, SQL arka uçta arabellekte biraz yer tutacağından, SQL'in% 80'inin tamamen kullanıldığı anlamına gelmez
SQL Server maksimum sunucu bellek değerine ulaştığında, düşük bellek bildirimi belleği serbest bırakmasını istemediği sürece bu belleği tutacaktır. Yani evet, hepsini kullanmıyor olabilir ama yine de tutacaktır. Buna önbelleğe alma adı verilir çünkü bu, sayfa hatalarını önlemeye yardımcı olur.
Kontrol etmenin bir yolu var mı, şu anda SQL'in% 80'den (OR) ne kadarını bellek yükseltmesiyle devam edebileceğimiz ölçümler üzerinde kullandı.
Bir kez kullanıldığında söylediğim gibi, sorgu işlemede o sayfalara ihtiyaç duymadığında bile tüm belleği kullanılan haliyle gösterecektir. Yeni istek geldiğinde, bu sayfalar yeni sayfalar için alan oluşturmak üzere taşınacaktır.
"Kullanılmış" ı nasıl tanımlarsınız? Bir saniye önce önbelleğe okunan bir sayfa, kullanılmış olarak sayılır mı? Bir dakika önce? Bir saat? Bir hafta?
Mesele şu ki, "yararlanılmış" diye bir şey yok. SQL sunucusu sayfaları (ve diğer şeyleri) bellekte tutar. Bellek baskısı (dahili veya harici) olduğunda, en son kullanılan şeyleri kaldırmak için geleneksel bir önbellek yaşlandırma mekanizması (temelde) kullanılır. Tabii ki bellek (önbellek) işlemesi hakkında çok daha fazla ayrıntı var, ancak prensipte herhangi bir önbelleğe alma mekanizması gibi ele alınır.
Dolayısıyla, "kullanılan" veya en uygun yapılandırma gibi kavramlar mevcut değildir. Tabii ki SQL sunucusu tarafından kullanılmayan bir sürü bellek olup olmadığını görebilirsiniz. Ancak SQL sunucusu bellek ayırdığında, bellek baskısı olmadıkça ona takılır. Kim bilir, belki birinin sonraki saniye o sayfaya ihtiyacı olacaktır?
Örneğin, maksimum sunucu belleğini azaltabilir ve performansınızın ne zaman bozulmaya başladığını görebilirsiniz.
Burada bulunan MemoryManagerInfosaklı yordamı kullanın :
https://github.com/aleksey-vitsko/Database-Administrator-Tools
SQL Server'ın şu anda belleği nasıl kullandığına dair güzel bir döküm sağlar :
Aşağıdaki bu resimdeki örneğe bakın - sunucumun şu anda tükettiği şey bu:
Kabaca, Total Server Memory= Database Cache Memory+ Free Memory+ Stolen Server Memory(Çalınan Sunucu Belleği Plan Önbelleği, Kilitler vb. İçerir)