SQL Server 2008 R2 «Память-призрак»?

12

У нас есть выделенная машина SQL Server 2008 R2, которая испытывает некоторые странные проблемы с памятью. Сама машина имеет много ресурсов, включая два четырехъядерных процессора, 16 ГБ ОЗУ и 64-разрядную Windows Server 2008 R2 Enterprise (это Dell PowerEdge 2950) ,

Странная проблема заключается в том, что система сообщает о 82% используемой памяти, но sqlservr.exe сообщает об использовании только 155 МБ. Причина, по которой я подозреваю SQL Server, заключается в том, что, если я перезапущу процесс sqlservr.exe, потребление памяти нормализуется на некоторое время.

У кого-нибудь есть идеи о том, как я могу начать отслеживать эту проблему?

Спасибо Джейсон

typefragger
источник
3
Вы используете блокировку страниц в памяти, верно? В этом случае диспетчер задач не сообщит о заблокированной памяти. См. Blogs.technet.com/b/askperf/archive/2008/03/25/… для получения дополнительной информации.
Марк С. Расмуссен
У нас есть право пользователя «Блокировка страниц в памяти» на «Нет». У нас также есть параметр «Максимальная память сервера (в МБ)» по умолчанию int.MaxValue - как вы думаете, это может вызвать проблему?
typefragger
4
Единственное, о чем я буду беспокоиться, это когда мой sql-сервер использует МЕНЬШЕ 82%!
SqlACID

Ответы:

15

Вы не получите истинную картину использования памяти в диспетчере задач, если учетная запись, под которой работает служба, имеет блокировку страниц в привилегии памяти (редактирование: согласно комментарию / ссылке Марка Расмуссена). Чтобы определить, сколько памяти используется, вы можете посмотреть:

  • SQLServer: диспетчер памяти \ счетчик перфмонов общей памяти сервера
  • DMVs

Я не могу вспомнить, если есть DMV или комбинация, которая даст вам общее выделение памяти, но следующее покажет большую часть этого.

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

Вторым наиболее интересным обычно является распределение пула буферов по базе данных. Здесь будет использоваться львиная доля, и может быть полезно понять, какие из ваших баз данных являются самыми крупными потребителями.

Марк Стори-Смит
источник
Вау, спасибо большое! Это (особенно второе) сделало это совершенно ясным для меня!
typefragger
8

В недавней статье от нашего собственного Brent Ozar рассматривается этот случай, когда диспетчер задач неправильно показывает память, потребляемую SQLServer и его дополнительными службами. Вы можете найти его здесь: Руководство системного администратора по памяти Microsoft SQL Server .

Цитата: « Почему SQLServer.exe не использует много памяти?

Когда вы подключаетесь к серверу и просматриваете диспетчер задач, использование Mem в sqlservr.exe всегда выглядит странно. Это не ошибка SQL Server. Диспетчер задач - грязный, грязный лжец. (Я знаю, это звучит так, как будто парень SQL перекладывает вину, но потерпите меня на секунду.) На 64-битных блоках это число несколько точнее, но на 32-битных блоках оно просто совершенно не основано , Чтобы действительно получить точную картину того, сколько памяти использует SQL Server, вам нужен инструмент, такой как Process Explorer, и вам нужно идентифицировать все процессы SQL Server. На сервере, который я показываю справа, есть два экземпляра SQL Server (показаны sqlservr.exe), а также средства резервного копирования агента SQL Agent, SQL Browser и SQL Server. Нет ничего необычного в том, что службы SQL Server Analysis Services, службы Integration Services и службы Reporting Services также работают на одном сервере - все они потребляют память.

Так сколько памяти использует SQL? Я сделаю это легко для вас. SQL Server использует всю память. Период «.

Поэтому я бы посоветовал вам попробовать запрос Марка и использовать лучший инструмент для отчета о памяти. Или просто доверьтесь Perfmon сообщить память, а не диспетчер задач.

Мэриан
источник
-2

Объем памяти, используемый SQL, как показано в диспетчере задач, будет в основном соответствовать параметру max-memory. Вот как работает настройка min / max:

Когда SQL-сервер запускается, он начинает загружать память до значения минимальной памяти. По мере того, как ваш SQL-запрос будет увеличиваться, SQL начнет использовать больше памяти, вплоть до значения max-memory. Затем память остается в этой (максимальной) точке, даже когда использование SQL снижается. Это создает впечатление, что SQL выполняет огромные задачи и использует столько памяти. На самом деле эта память зарезервирована SQL.

Когда на сервере возникает нехватка памяти, отличная от SQL, SQL освобождает память до минимальной точки установки памяти. Вот как используются настройки памяти. Вы можете использовать сценарии Марка, чтобы увидеть, как SQL использует эту память.

StanleyJohns
источник
1
Мин / макс управляет распределением буферного пула, ничего более. Это первая строка в описании параметров памяти сервера в BOL. Настройки абсолютно не связаны с тем, что отображается в диспетчере задач. Описание Брентом taskmgr как «грязного, грязного лжеца» суммирует ситуацию так же, как и все, что я читал.
Марк Стори-Смит
@ MarkStorey-Smith, пожалуйста, прочитайте содержание ниже в ссылке в вашем собственном комментарии, это только объясняет мою точку зрения. Диспетчер задач показывает использование системных ресурсов. Буферный пул не является системным ресурсом. Я объясняю, что означает использование памяти SQL, показанное в диспетчере задач. Вы заявляете об очевидном, упоминая пул буферов, но это все равно не доказывает, что я не прав.
СтэнлиДжонс
Не уверен, как лучше это поставить ... "Объем памяти, используемый SQL, как показано в диспетчере задач, в основном будет параметром max-memory. Так работает параметр min / max" .. нет, это не так «т.
Марк Стори-Смит
«Вот как работают настройки min / max:« В конце стоит двоеточие, означающее, что следует объяснение, а не утверждение предыдущего предложения. :)
StanleyJohns
1
Я с Марком. Читайте блог Славы Окс : он был частью команды MS, которая написала менеджер памяти. Перейти к заголовку «буферный пул». Я цитирую «Помните, что в SQL Server есть две настройки памяти, которыми вы можете управлять с помощью sp_conifigure. Это максимальная и минимальная память сервера. Я не уверен, что вы знаете, но эти две настройки действительно контролируют размер буферного пула. Они не контролируют в целом объем физической памяти, потребляемой SQL Server "
gbn 22.10.11