У меня есть экземпляр 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: -
А вот и установленный предел памяти:
Заранее спасибо.
ОБНОВЛЕНИЕ: - Я выполнил запрос, который предложил Аарон
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
Вот вывод:
Сумма 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
Так что это, кажется, указывает на то, что SQL Server использует больше, чем набор 65 ГБ.
источник
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;
?Ответы:
Максимальная память сервера контролирует пул буферов и все размеры страниц, но все же не контролирует такие вещи, как прямое распределение Windows (связанные серверы, sp_OA, XPs), память, необходимая для потоков / стеков потоков и т . Д.
Вы, вероятно, можете ожидать, что это будет выше на NUMA (хотя я не уверен, что 20 ГБ это нормально); Дело в том, что нельзя ожидать, что максимальная память сервера полностью контролирует память, используемую экземпляром SQL Server. Если вы хотите, чтобы весь экземпляр (не только пул буферов, кэши планов и CLR) использовал не более 64 ГБ, вам следует установить максимальное значение памяти сервера на более низкое значение.
Некоторые потенциальные идеи для отслеживания этого (я приведу все в МБ):
счетчики производительности
Посмотрим, не выпадет ли здесь что-нибудь слишком большое
20 лучших клерков
Вы уже сделали это, но для полноты:
размер стека потока
Во-первых, убедитесь, что это ноль, а не какой-то пользовательский номер (если это не 0, выясните почему и исправьте его):
Но вы также можете увидеть, сколько памяти занимают стеки потоков, используя:
Загружены сторонние модули
DMV, связанные с памятью
Вы также можете заметить что-то необычное, глядя на эти DMV:
Эта статья была написана до SQL Server 2012, поэтому некоторые имена столбцов и расчеты, возможно, придется скорректировать, но также можно попробовать и другие способы:
Немного хорошего фона в другой статье на этом сайте:
Немного полезной информации о типах вещей, которые используют память вне
max server memory
(но нет хороших данных о том, как собрать фактическое использование):источник
Я получил ниже определение от Боба Дорра о том, что контролирует память Max server в SQL Server 2012. Вы также можете прочитать Книги онлайн для более подробной информации
Память, выделенная для стека потоков, сторонней библиотеки DLL, поставщика связанного сервера, отличного от Microsoft (например, MySQL.PostgreSQL и т. Д.) Или любой библиотеки DLL, загруженной в адресное пространство SQL Server, отличной от SQL Server, выделяется за пределами максимальной памяти сервера. Операция резервного копирования IIRC в SQL Server 2012 также все еще выделяется из памяти вне пула буферов.
Используете ли вы связанный сервер для запроса других СУБД? Любое другое программное обеспечение, установленное на той же машине Windows. Можете ли вы опубликовать в каком-либо общем месте результаты следующих запросов?
Можете ли вы также загрузить полный
DBCC MMEMORYSTATUS
вывод в какое-либо общедоступное место и опубликовать ссылку здесь. Это поможет понять, какой компонент занимает памятьРедактировать: Согласно выводу dbcc memorystatus я могу видеть 2 узла NUMA, и память, используемая каждым узлом, составляет приблизительно
Опять же, если вы видите диспетчер памяти в memorystatus, выведите его
Зафиксированная виртуальная машина фактически является виртуальной памятью, зафиксированной SQL Server, и поскольку эта память фиксируется, она имеет
physical memory backing it
. Это снова заставляет меня думать, что SQL Server использует 65 G, как установлено в максимальной памяти сервераЭто то, что является максимальной памятью сервера. Таким образом, память хорошо распределяется между обоими узлами. Вы также можете добавить вывод нижеприведенного запроса для проверки. Пожалуйста, добавьте скриншот
источник
select * from sys.dm_so_process_memory