Споживання пам'яті SQL Server 2012 за межами буферного пулу


10

У мене є екземпляр SQL Server 2012 SP2 Enterprise Edition, що споживає ~ 20 Гб пам'яті, що перевищує макс. ліміт пам'яті. Екземпляр обмежений 65 ГБ, але фізична пам'ять, яка використовується у наведеному нижче запиті, показує 86 ГБ

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

Сервер фізичний з 2 NUMA-вузлами. Чи є спосіб, який я можу дізнатися, що споживає пам'ять поза буферним пулом (я припускаю, що саме це відбувається)?

Ось вихід DBCC MEMORYSTATUS: -

вихід DBCC MEMORYSTATUS

І ось встановлений ліміт пам’яті: -

знімок екрана обмеження пам'яті

Заздалегідь спасибі.

ОНОВЛЕННЯ: - Я запустив запит, який запропонував Аарон

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

Ось результат: -

MemoryClerkOutput

Сума сторінок_kb доходить до ~ 60 Гб

ОНОВЛЕННЯ 2: - Повний вихід DBCC MEMORYSTATUS знаходиться тут: - http://pastebin.com/nGn6kXEc

ОНОВЛЕННЯ 3: - Виведення скриптів Шенкі у файл excel тут: - http://jmp.sh/LKRlH4K

ОНОВЛЕННЯ 4: - Знімок екрана: -

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

Скріншот PhysMemInUse

Таким чином, це, схоже, вказує на те, що SQL Server використовує більше, ніж набір 65 Гб.


Що це дає? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Аарон Бертран

Привіт Аарон, дякую за відповідь. Я
оновлю

Відповіді:


11

Максимальна пам'ять сервера керує буферним пулом та розподілом усіх розмірів сторінки, але все ще не контролює такі речі, як прямі виділення Windows (пов'язані сервери, sp_OA, XP), пам'ять, необхідна для потоків / стеків потоків тощо .

Ви можете, напевно, очікувати, що це буде вище на NUMA (хоча я не впевнений, що 20 ГБ в нормі); справа в тому, що ви не можете очікувати, що максимальна пам'ять сервера повністю контролюватиме пам'ять, яку використовує екземпляр SQL Server. Якщо ви хочете, щоб весь екземпляр (а не лише буферний пул, кеші планів і CLR) використовував не більше 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;
    
  • Завантажені сторонні модулі

    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, пов'язані з пам'яттю

    Можливо, ви також зможете помітити щось незвичне, дивлячись на ці DMV:

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

Ця стаття була написана до SQL Server 2012, тому деякі назви стовпців та обчислення, можливо, доведеться скорегувати, але, можливо, спробуйте також деякі інші шляхи:

Деякі результати в іншій статті на цьому веб-сайті:

Деякі корисні відомості про типи речей, які використовують пам'ять поза межами max server memory(але немає гарних даних про спосіб збирання фактичного використання):


Дякую Аарону, у сервера є багато пам'яті, я просто хотів дізнатися, чи зможу я дізнатися, що використовує ці 20 Гб. Чи існує спосіб визначити споживання пам’яті Direct Allocations Direct або Thread Stacks?
dbafromthecold

У мене запущені сценарії, а лічильник вкраденої пам’яті сервера (KB) знаходиться на 14 ГБ. Збираюся копати, щоб дізнатися, чи можу я отримати додаткову інформацію
dbafromthecold

Викрадена пам'ять сервера, здається, не є проблемою. Ще дивлячись
dbafromthecold

Хоча тут не проблема, варто згадати, що об'єктний пул Columnstore (тип CACHESTORE_COLUMNSTOREOBJECTPOOL пам'яті) знаходиться також поза буферним пулом. Дивіться цю публікацію в блозі від Ніко
Неугебауер

@ BlažDakskobler так, спасибі, пам'ять теж. Я оновлю посаду, коли
Аарон Бертран

3

Я нижче отримав визначення від Боба Дорра про те, що управляє пам'яттю Max Server у SQL Server 2012. Ви також можете прочитати Книги в Інтернеті для отримання більш детальної інформації

Макс серверної пам’яті керує розподілом пам’яті SQL Server, включаючи пул буфера, компіляцію пам’яті, усі кеші, гранти qe, пам’ять менеджера блокування та пам’ять CLR (в основному будь-який «клерк», як знайдено в dm_os_memory_clerks). Пам'ять для стеків потоків, купи пам'яті, постачальників пов'язаних серверів, відмінних від SQL Server, або будь-якої пам'яті, виділеної DLL "не SQL Server", не контролюється максимальною пам'яттю сервера.

Пам'ять, виділена для стека потоків, стороннього DLL, постачальника пов'язаного сервера, який відрізняється від Microsoft (наприклад, MySQL.PostgreSQL тощо) або будь-якої DLL, завантаженої в адресний простір SQL Server, який не є сервером SQL, виділяється поза максимальною пам'яттю сервера. Операція резервного копіювання IIRC в SQL Server 2012 також все ще виділяється пам'яттю поза буферним пулом.

Ви використовуєте зв'язаний сервер для запиту інших RDBMS? Будь-яке інше програмне забезпечення, встановлене на цій же машині Windows. Чи можете ви розмістити в якомусь спільному розташуванні вихід із наступних запитів

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**

Виконаний VM - це фактично віртуальна пам'ять, здійснена SQL Server, і оскільки ця пам’ять здійснюється, вона є physical memory backing it. Це ще раз змушує мене думати, що SQL Server використовує 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

Привіт Шенкі, дякую за відповідь, але питання вирішилось само собою. Нічого з мого боку, SQL звільнив пам'ять самостійно. Я стежу за сервером, і якщо це повториться, я опублікую оновлення. Дуже хочеться дійти до цього.
dbafromthecold
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.