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, споживання пам'яті протягом періоду часу повертається до норми.

Хтось має ідеї, як я можу почати відслідковувати цю проблему?

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


3
Чи правильно ви користуєтеся Сторінками блокування в пам'яті користувача? Якщо це так, менеджер завдань не повідомить про заблоковану пам'ять. Докладнішу інформацію див. У blogs.technet.com/b/askperf/archive/2008/03/25/… .
Марк С. Расмуссен

У нас для сторінок блокування в пам'яті право встановлено значення "None". У нас також є налаштування "Максимальна пам'ять сервера (у МБ)" за замовчуванням int.MaxValue - ви вважаєте, що це може спричинити проблему?
typefragger

4
Єдиний раз, коли мене турбує, коли мій сервер sql використовує менше 82%!
SqlACID

Відповіді:


15

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

  • SQLServer: Менеджер пам'яті \ Лічильник перфмонів пам'яті сервера
  • ДМВ

Я не можу згадати, чи є 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 не використовує багато пам'яті?

Коли ви віддаляєте робочий стіл на сервер і дивитесь на диспетчер завдань, користування meml 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, послуги інтеграції та служби звітів, які також працюють на одному сервері - всі вони споживають пам'ять.

То скільки пам'яті використовує SQL? Я вам це полегшу. SQL Server використовує всю пам'ять. Період ».

Тому я б радив спробувати запит Марка та скористатися кращим інструментом для звіту про пам'ять. Або просто довіряйте Perfmon повідомляти про пам'ять, а не диспетчеру завдань.


-2

Обсяг пам'яті, використовуваний SQL, як показано в диспетчері завдань, здебільшого буде параметром максимальної пам'яті. Ось як працює настройка min / max:

Коли запускається SQL-сервер, він починає займати пам'ять до налаштування мінімальної пам'яті. Коли ваші потреби в SQL збільшуватимуться, SQL почне використовувати більше пам’яті до налаштування максимальної пам’яті. Потім пам'ять залишається в цій (максимальній) точці навіть тоді, коли використання SQL знижується. Це створює враження, що SQL виконує величезні завдання та використовує стільки пам'яті. Насправді ця пам'ять зберігається за допомогою SQL.

Коли на сервері виникає тиск пам’яті, що не належить до SQL, SQL звільнить пам'ять до точки встановлення мінімальної пам’яті. Так використовуються налаштування пам'яті. Ви можете використовувати сценарії Марка, щоб побачити, як SQL використовує цю пам'ять.


1
Min / max регулює розподіл пулових буферів, нічого більше. Це перший рядок в описі параметрів пам'яті сервера в BOL. Налаштування абсолютно не мають відношення до тих, що відображаються в диспетчері завдань. Опис Брента Taskmgr як "брудного, брудного брехуна" резюмує ситуацію, як і будь-який я читав.
Марк Сторі-Сміт

@ MarkStorey-Smith, будь ласка, прочитайте вміст далі за посиланням у вашому власному коментарі, це просто ще більше пояснює мою думку. Диспетчер завдань показує використання системних ресурсів. Буферний пул не є системним ресурсом. Я пояснюю, що означає використання пам'яті в SQL, показаному в диспетчері завдань. Ви констатуєте очевидне, згадуючи буферний пул, але це все ще не доводить мене неправильно.
StanleyJohns

Не впевнений, як краще це поставити ... "Об'єм пам'яті, використовуваний SQL, як показано в диспетчері завдань, здебільшого буде налаштуванням максимальної пам'яті. Так працює настройка min / max". 'т.
Марк Сторі-Сміт

"Ось як працюють налаштування min / max:" Є двокрапка в кінці, тобто пояснення випливає, а не те, що воно стверджує попереднє речення. :)
StanleyJohns

1
Я з Марком. Читайте блог Slava Oks : він був частиною команди MS, яка написала менеджер пам'яті. Перейдіть до заголовка "буферний пул". Я цитую "Пам'ятайте, що на SQL Server є два налаштування пам'яті, якими можна керувати за допомогою sp_conifigure. Вони є максимальною та мінімальною пам'яттю сервера. Я не впевнений, чи знаєте ви, але ці два налаштування дійсно керують розміром буферного пулу. Вони не контролюють загальний кількість фізичної пам'яті, спожитої SQL Server "
gbn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.