MS SQL Server - Ayrılan belleği artırın

Oct 15 2020

Benim sorunum, SQL Server'ın TB değerinde RAM içeren örnekler için bellek kullanımını arttırması uzun zaman alıyor, bu arada MEMORY_ALLOCATION_EXT için aralıklı beklemeler alıyoruz, bu da SQL Server maksimum belleğine ulaşana kadar işlememizi yavaşlatıyor.

Düğümlerde terabayt değerinde belleğe sahip SQL Server 2019 Enterprise Edition'ın Yük Devretme Kümelenmiş Örneklerine (FCI) sahibiz. Genel kullanım durumlarında, düğüm başına yalnızca 1 SQL Server örneğine izin veririz ve bu nedenle, düğümdeki belleğin ~% 85'ine yakın bir maksimum sunucu belleği ayarlarız, ancak SQL Server'ın devre dışı kalması durumunda min. Sunucu belleğini nispeten düşük olarak ayarladık başka bir düğüme bağlanır ve aksamak için daha az bellek ayak iziyle çevrimiçi duruma getirilmesi gerekir.

  • Min. Belleği daha yükseğe ayarlarsam, SQL Server'ın belleği bir kerede tüketeceğinin oldukça farkındayım. SQL Server'ın başlangıçta minimum bellek ayırmadığı ortaya çıktı.
  • SQL Server'ın ihtiyaç duyduğu için işletim sisteminden dinamik olarak daha fazla bellek tüketeceğinin ve sonunda maksimum sunucu belleğine ulaşacağının farkındayım.
  • Çok fazla veri çeken büyük bir sorgu veya DBCC checkdb çalıştırmanın SQL Server'ı işletim sisteminden daha fazla bellek tüketmeye zorlayacağının farkındayım.

SQL Server'ı bellek kullanımını hızla artırmaya zorlamanın başka yolları var mı?

Yanıtlar

1 Shanky Oct 15 2020 at 14:18

Min. Belleği daha yükseğe ayarlarsam, SQL Server'ın belleği bir kerede tüketeceğinin oldukça farkındayım.

Hayır, bu doğru değil, minimum sunucu belleğinin, ayarlandığında SQL Server'ın onu ne kadar hızlı tüketeceği ile ilgisi yoktur. Minimum sunucu belleği, tüketilirse, minimum bellek miktarını belirtir; bundan sonra SQL Server, istenirse normal koşullar altında bu değerin altındaki belleği serbest bırakmaz. Minimum sunucu değerine ulaşıldığında, SQL Server önbelleklerini kırpmayacak ve bu değerin altındaki belleği serbest bırakmayacaktır.

SQL Server'ın ihtiyaç duyduğu için işletim sisteminden dinamik olarak daha fazla bellek tüketeceğinin ve sonunda maksimum sunucu belleğine ulaşacağının farkındayım.

Evet doğru, sadece belirli koşullarda SQl Sunucusu eklemek, maksimum sunucu belleğinde belirtilen değerden daha fazla bellek tüketebilir. Bellek Yönetimi Kılavuzunu okumalısınız

SQL Server'ı bellek kullanımını hızla artırmaya zorlamanın başka yolları var mı?

SQL Server'ı başlangıç ​​sırasında daha fazla bellek ayırmaya zorlamanın başka bir yolu vardır ve buna " büyük sayfalar " denir . Bu, kurumsal sürüm özellikleridir ve SQL Server'ın başlatma sırasında hızlı bir şekilde biraz boş bellek ayırmasına izin verir; SQL Server hizmet hesabında, büyük sayfaların tahsisi , Windows OS ve OS'nin VirtualAlloc () işlevi tarafından yapıldığından, bellek ayrıcalığında kilitli sayfalar olmalıdır. 8 GB'den fazla RAM, bu koşullar otomatik olarak karşılanırsa Büyük sayfa ayırma etkinleştirilir. Etkinleştirildikten sonra hata günlüğünde aşağıdaki gibi görünecektir

2009-06-04 12:21:08.16 Server      Large Page Extensions enabled.
2009-06-04 12:21:08.16 Server      Large Page Granularity: 2097152
2009-06-04 12:21:08.21 Server      Large Page Allocated: 32MB

X64 sistemde belleğin normal sayfa boyutu 4 KB'dir, ancak büyük sayfa etkinleştirildiğinde boyut 2 MB olacaktır. Ayrıca, 834 izleme bayrağını etkinleştirmeseniz bile, LargePageSupport'un etkinleştirildiğini ve motor tarafından kullanıldığını unutmayın. Ancak bunun için fazla bellek kullanılmaz ve izleme bayrağı 834 etkinleştirilmedikçe arabellek havuzu belleği kullanılmaz. Paylaşılan bloga bakın.

5 DavidSpillett Oct 15 2020 at 00:20

SQL Server, referans alındığı için sayfaları depodan yüklemesi gerekene kadar arabellek havuzu (en büyük kullanımı) için bellek kullanmayacaktır. Bellek ayırmayı yavaşlatmak için tuhaf bir şey yapmadığınız sürece [†] , gecikmeniz muhtemelen o kadar olmayacaktır, ancak tutmak için ayrılan verileri okuyunuz. Bu bellek tahsisi beklerken aynı zamanda GÇ ile ilgili bekleme sürelerine sahip olduğunuzdan şüpheleniyorum.

SQL sunucusunu belleğe bir şeyler yüklemeye zorlamak ve bu nedenle, varsa ve gerekirse bellek ayırmak için, yüklenmesi gereken şeylere erişin. SQL örneğinizi başlattıktan sonra, uygulamanızın normal ortak çalışma kümesinin arabellek havuzuna yüklenmesi için salt okunur bir iş yükü çalıştırın.

Bunun SELECT * FROM HugeTablekötü bir veri dengesi yüklemesi (uygulamaların temel çalışma kümesini değil) olması nedeniyle, çekirdek çalışma kümesinin bir sonraki erişimde yine de diskten / ağdan yüklenmesi gerekecek, böylece aynı GÇ'ye sahip olacaksınız gecikmeler. Ayrıca HugeTable, gerçekten çok büyük bir SQL Server ise , her şeyin sığmayacağını ve önemli bir miktarını bellekte tutmaya zahmet etmeyeceğini görebilir [‡].

[†] Aşırı yüklenmiş bir ana bilgisayarda bir sanal makinede çalıştırılıyor, bu nedenle gerçek RAM gibi görünen şey gerçekten disk üzerindeki sayfalar ?!

[‡] Normal şartlar altında, büyük bir nesne üzerinde beklenmedik bir tablo / dizin taramasının, diğer her şeyi bellekten çıkarmasını istemezsiniz. Bir sorgu için bir nesneden ne kadar tutulacağına ilişkin bir sınır, bunun olmasını durdurmaya çalışmak için yapılan bir optimizasyondur).