A memória do servidor roubado do DB Engine está muito alta

8

Eu recebo um erro do System Center Operations Manager (SCOM).

Como resolver este erro?

A memória do servidor roubado do SQL DB 2012 Engine está muito alta.

Eu executo a consulta e recebo esses contadores:

╔═══════════════════════════════╦═════════════╗
║ 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    ║
╚═══════════════════════════════╩═════════════╝
Darko Milic
fonte

Respostas:

10

Quantas vezes você vê essas mensagens? Se for uma ou duas vezes, pode ser ignorado.

'Memória roubada', conforme descrito neste artigo de suporte mais antigo e Como usar o DBCC MEMORYSTATUS, é:

A memória roubada descreve buffers que estão em uso para classificação ou para operações de hash (memória da área de trabalho de consulta) ou para aqueles que estão sendo usados ​​como um armazenamento de memória genérico para alocações para armazenar estruturas de dados internas, como bloqueios, contexto de transação e informações de conexão . O processo lazywriter não tem permissão para liberar buffers roubados do pool de buffers.

A memória é geralmente obtida do Buffer Pool. Se você executar DBCC MEMORYSTATUSe a saída mostrar páginas roubadas altas , isso significa que algum processo está roubando a memória do buffer pool mais do que o necessário e você precisa encontrar esse processo.

É bem provável que houvesse alguma operação em execução que executasse uma operação de classificação enorme e, ao mesmo tempo, o SQL Server estivesse consumindo muita memória, levando a essa mensagem. A menos que você esteja enfrentando algum problema de OOM, essa mensagem seria mais considerada um aviso .

Shanky
fonte
-1

Vi isso na pesquisa do Google, pois estamos enfrentando um problema semelhante (a memória roubada representa ~ 50% da memória total), mas não podemos

Aliás, encontrei o código abaixo

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

Modifiquei-o mais para mostrar% de roubado como memória total

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)')
        )
Jerry Hung
fonte