Потребление памяти 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

Сервер физический с двумя узлами NUMA. Есть ли способ узнать, что потребляет память за пределами пула буферов (я предполагаю, что это происходит)?

Вот вывод DBCC MEMORYSTATUS: -

вывод DBCC MEMORYSTATUS

А вот и установленный предел памяти:

снимок экрана ограничения памяти

Заранее спасибо.

ОБНОВЛЕНИЕ: - Я выполнил запрос, который предложил Аарон

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

Вот вывод:

MemoryClerkOutput

Сумма pages_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 ГБ.

dbafromthecold
источник
Что это дает? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Аарон Бертран
Привет Аарон, спасибо за ответ. Я
обновлю

Ответы:

11

Максимальная память сервера контролирует пул буферов и все размеры страниц, но все же не контролирует такие вещи, как прямое распределение Windows (связанные серверы, sp_OA, XPs), память, необходимая для потоков / стеков потоков и т . Д.

Вы, вероятно, можете ожидать, что это будет выше на 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 Windows Allocations или Thread Stacks?
dbafromthecold
У меня есть сценарии запуска и счетчик украденной серверной памяти (КБ) составляет 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 Server, выделяется за пределами максимальной памяти сервера. Операция резервного копирования IIRC в SQL Server 2012 также все еще выделяется из памяти вне пула буферов.

Используете ли вы связанный сервер для запроса других СУБД? Любое другое программное обеспечение, установленное на той же машине 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 memorystatus я могу видеть 2 узла NUMA, и память, используемая каждым узлом, составляет приблизительно

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

Опять же, если вы видите диспетчер памяти в memorystatus, выведите его

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

Зафиксированная виртуальная машина фактически является виртуальной памятью, зафиксированной 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
Shanky
источник
@DBAFromTheCold: уже поздно, но вы все еще ищете ответ, если да, я хочу дать еще одну попытку :) Можете ли вы опубликовать полный выводselect * from sys.dm_so_process_memory
Shanky
Привет Шанки, спасибо за ответ, но проблема решилась сама собой. Ничего с моей стороны, SQL освободил память самостоятельно. Я наблюдаю за сервером, и если это произойдет снова, я опубликую обновление. Очень хочется докопаться до этого.
dbafromthecold