बफ़र पूल के बाहर SQL सर्वर 2012 मेमोरी की खपत


10

मुझे SQL सर्वर 2012 SP2 एंटरप्राइज़ संस्करण का एक उदाहरण मिला है जो अधिकतम से अधिक 20GB मेमोरी का उपभोग करता है। स्मृति की सीमा। उदाहरण 65GB तक सीमित है, लेकिन नीचे की क्वेरी से उपयोग में आने वाली भौतिक मेमोरी 86GB है

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

सर्वर 2 NUMA नोड्स के साथ भौतिक है। क्या कोई ऐसा तरीका है जो मुझे पता लगा सकता है कि बफर पूल के बाहर मेमोरी की खपत क्या है (मैं मान रहा हूं कि क्या हो रहा है)?

यहां देखें DBCC MEMORYSTATUS का आउटपुट: -

DBCC मेमोरी का उत्पादन

और यहाँ सेट स्मृति सीमा है: -

मेमोरी सीमा का स्क्रीन शॉट

अग्रिम में धन्यवाद।

अद्यतन: - मैं हारून द्वारा सुझाई गई क्वेरी चला रहा हूँ

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

यहाँ उत्पादन है: -

MemoryClerkOutput

Pages_kb का SUM ~ 60GB आता है

अद्यतन 2: - DBCC MEMORYSTATUS का पूर्ण उत्पादन यहाँ है: - http://pastebin.com/nGn6kXEc

अद्यतन 3: - यहाँ एक्सेल फाइल में शैंकी की स्क्रिप्ट का आउटपुट: - http://jmp.sh/LKRlH4N

अद्यतन 4: - के उत्पादन का स्क्रीनशॉट: -

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

PhysMemInUse स्क्रीनशॉट

तो यह इंगित करता है कि SQL सर्वर 65GB सेट से अधिक उपयोग कर रहा है।


यह उपज क्या है? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
हारून बर्ट्रेंड

हाय हारून, जवाब देने के लिए धन्यवाद। मैं अब आउटपुट के साथ सवाल अपडेट
करूंगा

जवाबों:


11

मैक्स सर्वर मेमोरी बफर पूल और सभी पेज आकार के आवंटन को नियंत्रित करता है , लेकिन फिर भी प्रत्यक्ष विंडोज आवंटन (जुड़े सर्वर, sp_OA, XPs), थ्रेड / थ्रेड स्टैक के लिए आवश्यक मेमोरी आदि जैसी चीजों को नियंत्रित नहीं करता है

आप शायद NUMA पर अधिक होने की उम्मीद कर सकते हैं (हालांकि मुझे यकीन नहीं है कि 20 जीबी सामान्य है); बिंदु यह है, आप SQL सर्वर के उदाहरण द्वारा उपयोग की जाने वाली मेमोरी को पूरी तरह से नियंत्रित करने के लिए अधिकतम सर्वर मेमोरी की उम्मीद नहीं कर सकते। यदि आप पूरे उदाहरण (न केवल बफर पूल, प्लान कैश और सीएलआर) का उपयोग करना चाहते हैं, तो 64 जीबी से अधिक का उपयोग करने के लिए, आपको अधिकतम सर्वर मेमोरी को कुछ कम पर सेट करना चाहिए।

इसे नीचे ट्रैक करने के लिए कुछ संभावित विचार (मैं एमबी को सब कुछ सामान्य कर दूंगा):

  • प्रदर्शन काउंटर

    देखें कि क्या कुछ भी यहाँ से निकलता है और अधिक बड़े:

    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;
  • शीर्ष 20 क्लर्क

    आपने पहले ही ऐसा कर लिया है, लेकिन पूर्णता के लिए:

    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;
  • थ्रेड स्टैक का आकार

    पहले, सुनिश्चित करें कि यह शून्य है, और कुछ कस्टम संख्या नहीं है (यदि यह 0 नहीं है, तो पता करें कि क्यों, और इसे ठीक करें):

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

    लेकिन आप यह भी देख सकते हैं कि थ्रेड स्टैक का उपयोग करके कितनी मेमोरी ली जा रही है:

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
  • 3 पार्टी मॉड्यूल लोड किए गए

    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
  • मेमोरी से संबंधित डीएमवी

    आप इन DMV को देखने में साधारण से कुछ भी देख सकते हैं:

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

यह आलेख SQL सर्वर 2012 से पहले लिखा गया था, इसलिए कुछ कॉलम के नाम और गणना को समायोजित करना पड़ सकता है, लेकिन साथ ही साथ प्रयास करने के लिए कुछ अन्य रास्ते भी दे सकते हैं:

उस साइट पर एक अन्य लेख में कुछ अच्छी पृष्ठभूमि:

चीजों के प्रकारों के बारे में कुछ अच्छी जानकारी जो स्मृति का उपयोग करती हैं max server memory(लेकिन वास्तविक उपयोग कैसे एकत्र करें, इसके बारे में कोई अच्छा डेटा नहीं):


धन्यवाद हारून, सर्वर के पास बहुत सारी मेमोरी उपलब्ध है मैं सिर्फ यह देखना चाहता था कि क्या मैं यह पता लगा सकता हूं कि उस 20 जीबी का उपयोग क्या था। क्या प्रत्यक्ष विंडोज आवंटन या थ्रेड स्टैक की मेमोरी खपत की पहचान करने का एक तरीका है?
dbafromthecold

मेरे पास रन स्क्रिप्ट्स हैं और स्टोल सर्वर मेमोरी (KB) काउंटर 14GB पर है। यह देखने के लिए कि क्या मुझे कोई और जानकारी मिल सकती है खुदाई करने जा रहे हैं
dbafromthecold

चोरी सर्वर स्मृति मुद्दा नहीं लगता है। अभी भी देख रहे हैं
dbafromthecold

यहाँ समस्या नहीं है, लेकिन यह उल्लेख के लायक है कि Columnstore Object Pool (CACHESTORE_COLUMNSTOREOBJECTPOOL मेमोरी क्लर्क प्रकार) बफर पूल aswell के बाहर है। देखें निको न्यूगेबार को इस ब्लॉग पोस्ट
Blaz Dakskobler

@ BlažDakskobler हाँ, धन्यवाद, इन-मेमोरी भी। जब मैं एक मौका है मैं पोस्ट से अपडेट कर देंगे
हारून बर्ट्रेंड

3

मुझे SQL सर्वर 2012 में अधिकतम सर्वर मेमोरी को नियंत्रित करने के बारे में बॉब डोर से परिभाषा मिली। अधिक विवरण के लिए आप पुस्तकें ऑनलाइन भी पढ़ सकते हैं

अधिकतम सर्वर मेमोरी SQL सर्वर मेमोरी आवंटन को नियंत्रित करती है, जिसमें बफर पूल, मेमोरी, सभी कैश, क्यू मेमोरी मेमोरी, लॉक मैनेजर मेमोरी, और सीएलआर मेमोरी (मूल रूप से किसी भी "क्लर्क" जैसे dm_os_memory_cnks) शामिल हैं। थ्रेड स्टैक के लिए मेमोरी, मेमोरी ढेर, SQL सर्वर के अलावा अन्य लिंक किए गए सर्वर प्रदाता, या "गैर SQL सर्वर" DLL द्वारा आवंटित किसी भी मेमोरी को अधिकतम सर्वर मेमोरी द्वारा नियंत्रित नहीं किया जाता है।

थ्रेड स्टैक, थर्ड पार्टी DLL, लिंक्ड सर्वर प्रदाता के लिए आवंटित की गई मेमोरी जो Microsoft (MySQL.PostgreSQL आदि) या SQL सर्वर एड्रेस स्पेस में लोड किए गए किसी भी DLL के अलावा अन्य है जो गैर SQL सर्वर अधिकतम सर्वर मेमोरी के बाहर आवंटित किया गया है। SQL सर्वर 2012 में IIRC बैकअप ऑपरेशन अभी भी बफर पूल के बाहर मेमोरी आवंटित किया गया है।

क्या आप अन्य RDBMS को क्वेरी करने के लिए लिंक किए गए सर्वर का उपयोग कर रहे हैं? एक ही विंडोज़ मशीन पर कोई अन्य सॉफ़्टवेयर स्थापित किया गया है। क्या आप कुछ साझा स्थानों पर निम्न प्रश्नों का आउटपुट पोस्ट कर सकते हैं

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 MMEMORYSTATUSकुछ साझा स्थान पर पूर्ण आउटपुट अपलोड कर सकते हैं और यहां लिंक पोस्ट कर सकते हैं। यह समझने में मदद करेगा कि कौन सा घटक मेमोरी ले रहा है

संपादित करें: dbcc मेमोरीस्टैटस आउटपुट के अनुसार मैं 2 NUMA नोड्स देख सकता हूं और प्रत्येक नोड द्वारा उपयोग की जाने वाली मेमोरी रिक्त है

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

फिर अगर आप मेमोरीस्टैटस आउटपुट में मेमोरी मैनेजर देखते हैं

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

वीएम प्रतिबद्ध वास्तव में वर्चुअल मेमोरी SQL सर्वर द्वारा प्रतिबद्ध है और चूंकि यह मेमोरी प्रतिबद्ध है physical memory backing it। यह फिर से जो मुझे लगता है कि SQL सर्वर अधिकतम सर्वर स्मृति में सेट के रूप में 65 G का उपयोग कर रहा है

यह वह है जो अधिकतम सर्वर मेमोरी है। तो मेमोरी दोनों नोड्स के बीच अच्छी तरह से वितरित की जाती है आप जाँच करने के लिए नीचे क्वेरी जूट का आउटपुट भी जोड़ सकते हैं। कृपया स्क्रीनशॉट जोड़ें

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

@DBAFromTheCold: इसके देर से लेकिन क्या आप अभी भी उत्तर की तलाश में हैं, अगर हाँ मैं एक और कोशिश देना चाहता हूं :) क्या आप पूरा आउटपुट पोस्ट कर सकते हैंselect * from sys.dm_so_process_memory
Shanky

हाय Shanky, प्रतिक्रिया के लिए धन्यवाद, लेकिन इस मुद्दे को स्वयं हल किया है। मेरी ओर से कुछ भी नहीं, एसक्यूएल ने अपने दम पर मेमोरी जारी की। मैं सर्वर की निगरानी कर रहा हूं और अगर यह फिर से होता है, तो मैं एक अपडेट पोस्ट करूंगा। वास्तव में इस की तह तक जाना चाहते हैं।
dbafromthecold
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.