La memoria del servidor robado del motor DB es demasiado alta

8

Recibo un error de System Center Operations Manager (SCOM).

¿Cómo resolver este error?

La memoria del servidor robado del motor SQL DB 2012 es demasiado alta.

Ejecuto query y obtengo estos 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
fuente

Respuestas:

10

¿Cuántas veces ves esos mensajes? Si es una o dos veces, puede ignorarse.

'Memoria robada' como se describe en este artículo de soporte anterior y Cómo usar el DBCC MEMORYSTATUS es:

La memoria robada describe las memorias intermedias que se utilizan para ordenar o para operaciones de hash (memoria del espacio de trabajo de consulta), o para las memorias intermedias que se utilizan como un almacén de memoria genérico para asignaciones para almacenar estructuras de datos internas como bloqueos, contexto de transacción e información de conexión . El proceso de escritura diferida no puede eliminar búferes robados del grupo de búferes.

La memoria generalmente se toma de Buffer Pool. Si ejecuta DBCC MEMORYSTATUSy la salida muestra páginas robadas altas , esto significa que algún proceso está robando memoria de la agrupación de almacenamiento intermedio más de lo que es necesario y necesita encontrar ese proceso.

Es muy probable que haya alguna operación en ejecución que realizó una operación de clasificación enorme y, al mismo tiempo, SQL Server estaba consumiendo mucha memoria, lo que condujo a este mensaje. A menos que se enfrente a algún problema OOM, este mensaje se consideraría más como una advertencia .

Shanky
fuente
-1

Lo vi en la búsqueda de Google, ya que nos enfrentamos a un problema similar (la memoria robada es ~ 50% de la memoria total) pero no podemos

Por cierto, encontré el siguiente código

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

Lo modifiqué más para mostrar el% de robo como memoria 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
fuente