Слишком высокая память сервера украдена ядром БД

8

Я получаю ошибку от System Center Operations Manager (SCOM).

Как решить эту ошибку?

SQL DB 2012 Engine Украденная память сервера слишком высока.

Я запускаю запрос и получаю следующие счетчики:

╔═══════════════════════════════╦═════════════╗
║ Stolen Server Memory (MB)     ║ 7354.773437 ║
║ Lock Memory (MB)              ║ 106.195312  ║
║ Free Memory (MB)              ║ 64.632812   ║
║ Connection Memory (MB)        ║ 24.203125   ║
║ Log Pool Memory (MB)          ║ 14.085937   ║
║ Optimizer Memory (MB)         ║ 2.351562    ║
║ Granted Workspace Memory (MB) ║ 1.296875    ║
║ Cursor memory usage           ║ 0.000000    ║
║ Cursor memory usage           ║ 0.000000    ║
║ Cursor memory usage           ║ 0.000000    ║
╚═══════════════════════════════╩═════════════╝
Дарко Милич
источник

Ответы:

10

Сколько раз вы видите такие сообщения? Если это один или два раза, его можно игнорировать.

«Украденная память», как описано в этой более ранней статье поддержки и как использовать DBCC MEMORYSTATUS :

Украденная память описывает буферы, которые используются для сортировки или для операций хеширования (память рабочей области запроса), или для тех буферов, которые используются в качестве общего хранилища памяти для выделений для хранения внутренних структур данных, таких как блокировки, контекст транзакции и информация о соединении , Процессу lazywriter не разрешено удалять украденные буферы из пула буферов.

Память обычно берется из Buffer Pool. Если вы запускаете, DBCC MEMORYSTATUSи в результате вы видите много украденных страниц , это означает, что какой-то процесс крадет память из пула буферов больше, чем нужно, и вам нужно найти этот процесс.

Вполне вероятно, что выполнялась какая-то операция, которая выполняла огромную операцию сортировки, и в то же время SQL Server занимал много памяти, что приводило к этому сообщению. Если вы не столкнулись с проблемой OOM, это сообщение будет рассматриваться как предупреждение .

Shanky
источник
-1

Увидел это в поиске Google, когда мы столкнулись с похожей проблемой (украденная память составляет ~ 50% от общей памяти), но мы не можем

Кстати, я нашел ниже код

select type, name, sum((pages_kb*1024)/8192) as stolen_pages
from sys.dm_os_memory_clerks
where pages_kb > 0
group by type, name
order by stolen_pages desc;

type    name    stolen_pages
MEMORYCLERK_SQLBUFFERPOOL   Default 1710360

Я изменил это больше, чтобы показать% украденных как общий объем памяти

SELECT Now = GETDATE()
    ,StolenMemory = (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Stolen Server Memory (KB)')
        )
    ,StolenMemoryPercent = 100.0 * (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Stolen Server Memory (KB)')
        ) / (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Total Server Memory (KB)')
        )
Джерри Хунг
источник