Arabellek havuzu dışında SQL Server 2012 bellek tüketimi


10

Ben maksimum 20GB daha yüksek bellek tüketen bir SQL Server 2012 SP2 Enterprise Edition örneği var. bellek sınırı. Örnek 65 GB ile sınırlıdır, ancak aşağıdaki sorgudan kullanılan fiziksel bellek 86 GB gösterir

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

Sunucu 2 NUMA düğümü ile fizikseldir. Arabellek havuzu dışında bellek tüketen ne bulmak bir yolu var mı (ne olduğunu varsayalım)?

İşte DBCC MEMORYSTATUS çıktı: -

DBCC MEMORYSTATUS çıktısı

Ve işte ayarlanan bellek sınırı: -

bellek sınırının ekran görüntüsü

Şimdiden teşekkürler.

GÜNCELLEME: - Aaron'un önerdiği sorguyu çalıştırdım

SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC

İşte çıktı: -

MemoryClerkOutput

Pages_kb toplamı ~ 60GB

GÜNCELLEME 2: - DBCC MEMORYSTATUS'un tam çıktısı burada: - http://pastebin.com/nGn6kXEc

GÜNCELLEME 3: - Shanky komut dosyalarının excel dosyasındaki çıktısı: - http://jmp.sh/LKRlH4K

GÜNCELLEME 4: - Çıktı ekran görüntüsü: -

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

Önizleme Oyun PhysMemInUse

Bu, SQL Server'ın 65GB'den fazla set kullandığını gösteriyor gibi görünüyor.


Bu ne verir? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Aaron Bertrand

Merhaba Aaron, cevapladığınız için teşekkürler. Soruyu şimdi
çıktıyla

Yanıtlar:


11

Maksimum sunucu belleği, arabellek havuzunu ve tüm sayfa boyutu ayırmalarını kontrol eder, ancak yine de doğrudan Windows ayırmaları (bağlı sunucular, sp_OA, XP'ler), iş parçacıkları / iş parçacığı yığınları için gereken bellek vb .

Muhtemelen NUMA'da daha yüksek olmasını bekleyebilirsiniz (20 GB'ın normal olduğundan emin değilim); nokta, maksimum sunucu belleğinin bir SQL Server örneği tarafından kullanılan belleği tam olarak kontrol etmesini bekleyemezsiniz. Tüm örneğin (yalnızca arabellek havuzu, plan önbellekleri ve CLR değil) 64 GB'den fazla kullanılmasını istemiyorsanız, maksimum sunucu belleğini daha düşük bir değere ayarlamanız gerekir.

Bunu izlemek için bazı potansiyel fikirler (her şeyi MB olarak normalleştireceğim):

  • performans sayaçları

    Burada aşırı büyük bir şey olup olmadığını görün:

    SELECT counter_name, instance_name, mb = cntr_value/1024.0
      FROM sys.dm_os_performance_counters 
      WHERE (counter_name = N'Cursor memory usage' and instance_name <> N'_Total')
      OR (instance_name = N'' AND counter_name IN 
           (N'Connection Memory (KB)', N'Granted Workspace Memory (KB)', 
            N'Lock Memory (KB)', N'Optimizer Memory (KB)', N'Stolen Server Memory (KB)', 
            N'Log Pool Memory (KB)', N'Free Memory (KB)')
      ) ORDER BY mb DESC;
  • üst 20 katip

    Bunu zaten yaptınız, ancak tamlık için:

    SELECT TOP (21) [type] = COALESCE([type],'Total'), 
      mb = SUM(pages_kb/1024.0)
    FROM sys.dm_os_memory_clerks
    GROUP BY GROUPING SETS((type),())
    ORDER BY mb DESC;
  • iplik yığını boyutu

    İlk olarak, bunun özel bir sayı değil sıfır olduğundan emin olun (0 değilse, nedenini öğrenin ve düzeltin):

    SELECT value_in_use
      FROM sys.configurations 
      WHERE name = N'max worker threads';

    Ancak aşağıdakileri kullanarak iş parçacığı yığınları tarafından ne kadar bellek alındığını da görebilirsiniz:

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
  • 3. taraf modülleri yüklendi

    SELECT base_address, description, name
      FROM sys.dm_os_loaded_modules 
      WHERE company NOT LIKE N'Microsoft%';
    
    -- you can probably trace down memory usage using the base_address
  • bellekle ilgili DMV'ler

    Ayrıca, bu DMV'lere bakarak normalden bir şey tespit edebilirsiniz:

    SELECT * FROM sys.dm_os_sys_memory;
    SELECT * FROM sys.dm_os_memory_nodes WHERE memory_node_id <> 64;

Bu makale SQL Server 2012'den önce yazılmıştır, bu nedenle bazı sütun adlarının ve hesaplamaların ayarlanması gerekebilir, ancak denemek için başka yollar da verebilir:

Bu sitedeki başka bir makalede de iyi bir arka plan:

Dışında bellek kullanan şeyler hakkında bazı iyi bilgiler max server memory(ancak gerçek kullanımın nasıl toplanacağı hakkında iyi veri yok):


Teşekkürler Aaron, sunucu kullanılabilir boş bellek bol var Ben sadece bu 20GB ne kullandığını öğrenmek olabilir görmek istedim. Doğrudan Windows Tahsisleri veya İş Parçacığı Yığınlarının bellek tüketimini tanımlamanın bir yolu var mı?
dbafromthecold

Ben çalışma komut dosyaları var ve Çalıntı Sunucu Belleği (KB) sayacı 14GB. Daha fazla bilgi alıp alamayacağımı görmek için kazı yapacak
dbafromthecold

Çalınan Sunucu Belleği sorun gibi görünmüyor. Hala bakıyor
dbafromthecold

Burada sorun olmasa da, Columnstore Nesne Havuzu'nun (CACHESTORE_COLUMNSTOREOBJECTPOOL bellek memuru türü) de arabellek havuzunun dışında olduğunu belirtmek gerekir. Niko Neugebauer
Blaž Dakskobler tarafından

@ BlažDakskobler evet, teşekkürler, bellekte de. Şansım olduğunda yazıyı güncelleyeceğim
Aaron Bertrand

3

Bob Dorr'dan SQL Server 2012'deki Max sunucu belleğinin ne hakkında tanımını aşağıda aldım. Daha fazla bilgi için Çevrimiçi Kitaplar'ı da okuyabilirsiniz

Maksimum sunucu belleği, arabellek havuzu, derleme belleği, tüm önbellekler, qe bellek hibeleri, kilit yöneticisi belleği ve CLR belleği (temel olarak dm_os_memory_clerks içinde bulunan herhangi bir “katip” dahil olmak üzere SQL Server bellek tahsisini kontrol eder. İş parçacığı yığınları, bellek yığınları, SQL Server dışındaki bağlantılı sunucu sağlayıcıları veya “SQL Server olmayan” bir DLL tarafından ayrılan herhangi bir bellek, maksimum sunucu belleği tarafından denetlenmez.

İş parçacığı yığını için ayrılan bellek, Üçüncü taraf DLL, Microsoft (MySQL.PostgreSQL vb.) Dışındaki bağlı sunucu sağlayıcısı veya SQL Server olmayan SQL Server adres alanına yüklenen herhangi bir DLL, maksimum sunucu belleği dışında tahsis edilir. SQL Server 2012'de IIRC yedekleme işlemi yine de arabellek havuzu dışında bellek tahsis edilmiştir.

Diğer RDBMS'yi sorgulamak için bağlantılı sunucu kullanıyor musunuz? Aynı windows makinesinde kurulu diğer tüm yazılımlar. Paylaşılan bir konuma aşağıdaki sorguların çıktısını gönderebilir misiniz?

select type,
sum(pages_kb)/1024 as [Memory utilized in MB],
sum(awe_allocated_kb)/1024 as [Memory allocated though Windows API]
 from sys.dm_os_memory_clerks
 group by type
 order by [Memory utilized in MB] desc
 Go
-------

 select (virtual_address_space_committed_kb/1024) as virtual_address_space_committed_MB,
 (locked_page_allocations_kb/1024) locked_page_allocations_MB,
 (pages_kb/1024) [memory allocated MB]
  from sys.dm_os_memory_nodes
  Go
-------
SELECT SUM (pages_in_bytes)/1024 as 'KB Used', type 
FROM sys.dm_os_memory_objects
GROUP BY type 
ORDER BY 'KB Used' DESC;
GO
--------
select name,
type,
sum(pages_kb)/1024 as [Mem MB],
sum(entries_count) as [Total Entry count] from sys.dm_os_memory_cache_counters
group by
type, name
order by [Mem MB] desc
Go
-----
select * from sys.dm_os_loaded_modules where company <> 'Microsoft Corporation'
go

DBCC MMEMORYSTATUSPaylaşılan bir konuma tam çıktı yükleyebilir ve bağlantıyı buraya gönderebilir misiniz ? Bu, hangi bileşenin bellek aldığını anlamaya yardımcı olur

Düzenleme: dbcc memorystatus çıkışına göre 2 NUMA düğüm görebilirsiniz ve her düğüm tarafından kullanılan bellek yaklaşık

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

Yine memorystatus bellek yöneticisi görürseniz onun

Memory Manager                           KB
---------------------------------------- -----------
VM Reserved                              260726964
VM Committed                             **67108820**

Gerçekleştirilen VM aslında SQL Server tarafından işlenen Sanal Bellek'dir ve bu bellek işlendiğinden beri vardır physical memory backing it. Bu da bana SQL Server'ın maksimum sunucu belleğinde ayarlandığı gibi 65 G kullandığını düşündürüyor

Bu, maksimum sunucu belleği. Bu nedenle bellek her iki düğüm arasında iyi dağıtılır, ayrıca kontrol etmek için aşağıdaki sorgu çıkıntısının çıktısını da ekleyebilirsiniz. Lütfen ekran görüntüsü ekleyin

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

@DBAFromTheCold: evet ben vermek istiyorum, Onun geç ama hala cevap arayan bir kez daha denemek :) sen tam çıkışını gönderebilir miyimselect * from sys.dm_so_process_memory
Shanky

Merhaba Shanky, cevap için teşekkürler ama sorun kendi kendine çözüldü. Benim açımdan hiçbir şey, SQL belleği tek başına serbest bıraktı. Sunucuyu izliyorum ve tekrar oluşursa bir güncelleme yayınlayacağım. Gerçekten bunun alt kısmına ulaşmak istiyorum.
dbafromthecold
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.