SQL Server tüm belleği kullanmıyor


10

Maksimum bellek 6GB olarak ayarlanmış SQL Server 2014'üm var (fiziksel bellek 8GB).

Hedef Sunucu Belleği bazen 6GB ve daha sonra geri düşer Toplam Sunucu Belleği (yaklaşık 5.3GB, 6GB ulaşır asla). Kullandığım committed_kb içinde sys.dm_os_sys_info SQL Server tarafından kullanılan bellek kontrol etmek.

Sys.dm_os_buffer_descriptors'ı izlediğimde , sayfaların önbellekten düştüğünü görüyorum - ancak hala 700MB bellek kaldı. Belleğe hiçbir şey gerekmiyorsa, sayfaların önbellekten kaldırıldığını nasıl açıklarsınız? SQL Server'ın yalnızca bellek gerektiğinde sayfaları kaldırmasını beklerim.

Ayrılan geçici tablolar bu sunucuda bir sorun değildir. Benim PLE'im 3632. Prosedür önbelleği 2182 MB.

Sayfaların yalnızca bellek kalmadığında bırakılmasını beklerim, ancak 700MB boş alanım var mı yoksa yanlış anlıyor muyum?

Birisi lütfen bu davranışı açıklamaya çalışabilir mi?

SQL Server da diskten okuyor, bu yüzden gerekli tüm sayfaların bellekte olmadığı sonucuna varabilirim.

Biraz daha araştırma yaptım ve diskten belleğe büyük miktarda sayfa okudum ve okumalar sırasında taskmanager'de bir şey fark ettim:

  • Kullanılan bellek 7,0 GB -> 7,2 GB -> 7,0 GB -> 7,2 GB -> ...
  • Sqlservr.exe 5,3 GB -> 5,5 GB -> 5,3 GB -> 5,5 GB -> ...

Windows sanki sqlservr.exe dosyasının 6GB'a çıkmasına izin vermez .

Shanky tarafından sağlanan sorguyu çalıştırdım:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

Bu şu sonucu verdi:

Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0

Anlamıyorum ne Toplam_Memory_in_MB neden 6144 (maksimum bellek) eşit değil?

Gelen sys.dm_os_ring_buffers buldum RESOURCE_MEMPHYSICAL_LOWWindows bellek az düşünüyorum ve SQL Server bazı döndürmesi gerekir, böylece. Ama yaklaşık 1GB kullanılabilir bellek var => Windows neden bellekte azaldığını söylüyor?

<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">   
   <ResourceMonitor>
        <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
        <IndicatorsProcess>0</IndicatorsProcess>
        <IndicatorsSystem>2</IndicatorsSystem>
        <NodeId>0</NodeId>
        <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
        <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
        <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>   
   </ResourceMonitor>   
   <MemoryNode id="0">
        <TargetMemory>6050080</TargetMemory>
        <ReservedMemory>67208656</ReservedMemory>
        <CommittedMemory>5423548</CommittedMemory>
        <SharedMemory>0</SharedMemory>
        <AWEMemory>0</AWEMemory>
        <PagesMemory>4975656</PagesMemory>   
   </MemoryNode>   
   <MemoryRecord>
        <MemoryUtilization>100</MemoryUtilization>
        <TotalPhysicalMemory>8387608</TotalPhysicalMemory>
        <AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
        <TotalPageFile>11142348</TotalPageFile>
        <AvailablePageFile>2887916</AvailablePageFile>
        <TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
        <AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
        <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
   </MemoryRecord> 
</Record>

Güncelleme
Neden her zaman 1GB bellek bulunduğunu biraz daha araştırdıktan sonra, bir şey bulduğumu düşünüyorum.
SQL Server yalnızca boş bellek ayırabilir ve kullanılabilir bellek yok sayılabilir mi? Process Explorer'ı (Sysinternals) çalıştırırken boş belleğin 0 olduğunu gördüm.

Yanıtlar:


3

Başlamak için, maksimum sunucu belleğini 6 GB olarak ayarladığınızı ve toplam belleğin 8 GB olduğunu söylemeliyim , bu yüzden işletim sistemi için 2 GB bıraktınız, bu da bir Windows makinesinde SQL Server'dan başka bir şey yüklü olmasa bile , OS'ye çok az bellek sağlıyor. Düzgün çalışması için antivirüs kurulu bir sistemde işletim sistemine en az 4 GB verilmelidir. İşletim sistemi için 2 GB ve AV için 1,5 G bırakıyorum.

Hedef Sunucu Belleği bazen 6 GB'dir ve ardından Toplam Sunucu Belleğine geri döner (yaklaşık 5,3 GB, asla 6 GB'a ulaşmaz).

Hedef sunucu belleği , SQL Server'ın ideal durumda düzgün çalışması için ne kadar bellek gerektiğini gösterir. Maksimum sunucu belleği değerini 6 GB olarak ayarladığınızdan hedef sunucu belleği 6 GB olmaya çalışıyor . İzin verdiği tüm hafızayı tüketmeye çalışıyor.

Toplam sunucu belleği , SQL Server'ın şu anda gerçekten tüketebildiği şeydir. Bu hafızaya bağlıdır ve fiziksel RAM ile desteklenmektedir. Bu sizin durumunuzda maksimum 5,5 GB'dir.

SQL Server bellek tüketimini artırmaya çalışıyor, ancak 5.3 veya 5.5 GB'a ulaştıktan sonra işletim sistemi, SQL Server'dan bellek tüketimini daha fazla artırmamasını istiyor ve aslında düşük bellek bildirimini işaretliyor olabilir. Bu, işletim sisteminin yukarıda belirtildiği gibi düşük bellekle karşı karşıya kalabileceği için oluyor. SQLOS, Windows işletim sisteminin önbelleklerini tüketimini azaltmasını sorarak bellek baskısıyla karşılaşırsa yanıt verir. Sen edebilirsiniz Halka Tampon sorgula işaret düşük bellek bildirim olmadığını kontrol etmek. DMV sys.dm_os_ring_buffer belgesiz ama güvenli olduğunu eklemeliyim .

Sayfaların önbellekten düştüğünü görüyorum - ancak hala 700MB bellek kaldı. Belleğe hiçbir şey gerekmiyorsa, sayfaların önbellekten kaldırıldığını nasıl açıklarsınız? SQL Server'ın yalnızca bellek gerektiğinde sayfaları kaldırmasını beklerim.

Özgür bellek için arıyorsanız, ben ederim önermek değil sen DMV bakmak Sys.dm_os_buffer_descriptors . OS sayaç Available Mbytes size bilgisayarda çalışan işlemler için kullanılabilir bayt fiziksel bellek miktarını, söyleyecektir. Ayrıca , mantıklı bir tampon havuzu boyutunu değerlendirmek için deterministik bir yöntem nedir? ve ayrıca SQL Server'ın ne kadar RAM ihtiyacı olduğunu ve SQL Server'ın bellek baskısıyla karşı karşıya olup olmadığını öğrenmek için daha fazla RAM'e ihtiyacı var mı? başlıklı konuyu okuyun . Bahsettiğiniz şeylerden, sayfaların arabellek havuzundan kaldırıldığından eminseniz, evet SQL Server, yeni sayfaların yerleştirilmesi için alan gerektiğinden sayfaların taşınması gerektiğini hisseder. 700 MB boş alanı nasıl hesapladığınızdan emin değilim.

Başka bir şey, lütfen SQL Server bellek tüketimi için Görev Yöneticisi'ne bakmayın. Özellikle SQL Server hizmet hesabı kilit sayfaları bellek ayrıcalığına sahip olduğunda size her zaman doğru değeri vermez . Sizin durumunuzda, SQL Server maksimum 6 GB sunucu belleğine sahip olsa bile, işletim sistemine sadece 2 GB veriliyor, bu da SQL Server için 2 GB düşük olduğu için SQL Server'ı tüketimini artırmaya zorluyor. Sistemde çalışan SQL Server dışında bir şey var mı?

SQL Server bellek tüketimini hesaplamak istiyorsanız lütfen şunu kullanın:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Ne anlamıyorum neden Total_Memory_in_MB 6144 (maksimum bellek) eşit değil.

Total_Memory_in_MB sütunu , SQL Server (RAM + sayfa dosyası) tarafından kullanılan toplam belleği gösterir. RAM aslında kullanılan veya kaydedilen fiziksel bellektir. SQL Server işleminin bir kısmı da diske sayfalanır ve sanal bellek veya sayfa dosyası olarak oluşur ve bu nedenle SQL Server tarafından tüketilen TOPLAM belleği görecekseniz, fiziksel bellek ve Sayfa dosyasının toplamı olur.

Fiziksel_Memory_usedby_Sqlserver_MB sütunu sadece kullanılan fiziksel bellektir (fiziksel RAM veya yedek bellek tarafından desteklenen bellek). Her ikisinin de farklı olmasının nedeni budur. Gerçek sütunu görürseniz, ilk önce Fiziksel bellek kullanılır, diğeri Sanal bellek kullanılır.

Disk belleği olan belleği görmek istiyorsanız, Total_Memory_in_MB ve Physical_Memory_usedby_Sqlserver_MB arasındaki fark budur .

NOT: Kullanılan toplam bellek kullanılan fiziksel bellekten daha büyük olacaktır.


5

SQL Server, arabellek çok uzak olmasına rağmen çok daha fazla önbellek kullanır (açık bir örnek, plan önbelleğidir). Belleğe DBCC MEMORYSTATUSve çeşitli DMV'lere daha yakından bakabilirsiniz . Hedef bellek ve toplam bellek, özellikle Arabellek Havuzu / Önbellek ile ilgilidir.

Christian Bolton'un seminal Profesyonel SQL Server 2008 Internals ve Sorun Giderme bölümünden bir alıntı :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Bu, arabellek havuzunun geçerli boyutunu gösterir.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    Bu, arabellek havuzu için ideal boyutu gösterir. Toplam ve Hedef, bir süredir çalışan bellek baskısı olmayan bir sunucuda neredeyse aynı olmalıdır. Eğer toplam belirgin az olduğunu Target , o zaman SQL Server nedeniyle daha fazla araştırma; bu durumda bellek baskısı, tampon havuzu büyüyemez olasıdır.

Toplam ve hedef sunucu belleği aynı olsa bile , bellek baskısı olmadığından % 100 emin olamayız . Bu durumda, bir sonuca ulaşmak için daha fazla bellek sayacı ateşlememiz ve verilerini almamız gerekiyor.
Shanky

"Toplam ve Hedef, bir süredir çalışan bellek baskısı olmayan bir sunucuda neredeyse aynı olmalıdır." Bunu düşünelim. 128 GB RAM ile yeni bir SQL Server açıyorum ve 1 GB'lık tek bir veritabanı getiriyorum. Bir ay boyunca koşsun. Total ve Target'un o ayın sonunda neredeyse aynı olacağına gerçekten inanıyor muyum? Değilse, sunucunun bellek baskısı altında olduğuna inanıyor muyum? Buna inanmakta zorlanıyorum.
Mike Sherrill 'Cat Recall'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.