Consumo de memoria de SQL Server 2012 fuera del grupo de búferes

10

Tengo una instancia de SQL Server 2012 SP2 Enterprise Edition que consume ~ 20 GB de memoria por encima del máximo. limite de memoria. La instancia está limitada a 65 GB, pero la memoria física en uso de la consulta a continuación muestra 86 GB

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

El servidor es físico con 2 nodos NUMA. ¿Hay alguna manera de averiguar qué está consumiendo la memoria fuera del grupo de búferes (supongo que eso es lo que está sucediendo)?

Aquí está la salida de DBCC MEMORYSTATUS: -

salida de DBCC MEMORYSTATUS

Y aquí está el límite de memoria establecido: -

captura de pantalla del límite de memoria

Gracias por adelantado.

ACTUALIZACIÓN: - Ejecuté la consulta que Aaron sugirió

SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC

Aquí está la salida: -

MemoryClerkOutput

La SUMA de pages_kb llega a ~ 60GB

ACTUALIZACIÓN 2: - La salida completa de DBCC MEMORYSTATUS está aquí: - http://pastebin.com/nGn6kXEc

ACTUALIZACIÓN 3: - Salida de los scripts de Shanky en el archivo de Excel aquí: - http://jmp.sh/LKRlH4K

ACTUALIZACIÓN 4: - Captura de pantalla de la salida de: -

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

Captura de pantalla de PhysMemInUse

Entonces, esto parece indicar que SQL Server está utilizando más del conjunto de 65 GB.

dbafromthecold
fuente
¿Qué rinde esto? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Aaron Bertrand
Hola Aaron, gracias por responder. Actualizaré la pregunta con la salida ahora
dbafromthecold

Respuestas:

11

Max controles de memoria del servidor búfer piscina y todas las asignaciones de tamaño de página, pero todavía no controla cosas como las asignaciones directas de Windows (servidores vinculados, sp_OA, XPS), la memoria requerida por hilos / pilas de subprocesos, etc .

Probablemente pueda esperar que esto sea más alto en NUMA (aunque no estoy seguro de que 20 GB sea normal); El punto es que no puede esperar que la memoria máxima del servidor controle completamente la memoria utilizada por una instancia de SQL Server. Si desea que toda la instancia (no solo el grupo de búferes, las memorias caché de planes y el CLR) no use más de 64 GB, debe configurar la memoria máxima del servidor en algo más bajo.

Algunas ideas potenciales para rastrear esto (normalizaré todo a MB):

  • contadores de rendimiento

    Vea si algo salta aquí como excesivamente grande:

    SELECT counter_name, instance_name, mb = cntr_value/1024.0
      FROM sys.dm_os_performance_counters 
      WHERE (counter_name = N'Cursor memory usage' and instance_name <> N'_Total')
      OR (instance_name = N'' AND counter_name IN 
           (N'Connection Memory (KB)', N'Granted Workspace Memory (KB)', 
            N'Lock Memory (KB)', N'Optimizer Memory (KB)', N'Stolen Server Memory (KB)', 
            N'Log Pool Memory (KB)', N'Free Memory (KB)')
      ) ORDER BY mb DESC;
  • 20 mejores empleados

    Ya has hecho esto, pero para completar:

    SELECT TOP (21) [type] = COALESCE([type],'Total'), 
      mb = SUM(pages_kb/1024.0)
    FROM sys.dm_os_memory_clerks
    GROUP BY GROUPING SETS((type),())
    ORDER BY mb DESC;
  • tamaño de la pila de hilos

    Primero, asegúrese de que sea cero y no un número personalizado (si no es 0, averigüe por qué y corríjalo):

    SELECT value_in_use
      FROM sys.configurations 
      WHERE name = N'max worker threads';

    Pero también puede ver cuánta memoria están ocupando las pilas de hilos usando:

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
  • Módulos de terceros cargados

    SELECT base_address, description, name
      FROM sys.dm_os_loaded_modules 
      WHERE company NOT LIKE N'Microsoft%';
    
    -- you can probably trace down memory usage using the base_address
  • DMV relacionados con la memoria

    También puede detectar algo fuera de lo común mirando estos DMV:

    SELECT * FROM sys.dm_os_sys_memory;
    SELECT * FROM sys.dm_os_memory_nodes WHERE memory_node_id <> 64;

Este artículo fue escrito antes de SQL Server 2012, por lo que algunos nombres de columna y cálculos pueden tener que ajustarse, pero también pueden dar algunas otras vías para probar:

Algunos buenos antecedentes en otro artículo en ese sitio también:

Alguna buena información sobre los tipos de cosas que usan memoria fuera de max server memory(pero no hay buenos datos sobre cómo recopilar el uso real):

Aaron Bertrand
fuente
Gracias Aaron, el servidor tiene mucha memoria disponible. Solo quería ver si podía averiguar qué estaba usando esos 20GB. ¿Hay alguna manera de identificar el consumo de memoria de las asignaciones directas de Windows o las pilas de subprocesos?
dbafromthecold
Tengo los scripts de ejecución y el contador de memoria de servidor robado (KB) tiene 14 GB. El ir a cavar para ver si puedo conseguir cualquier información adicional
dbafromthecold
La memoria del servidor robado no parece ser el problema. Sigue buscando
dbafromthecold
Si bien no es el problema aquí, vale la pena mencionar que el grupo de objetos del almacén de columnas (tipo de empleado de memoria CACHESTORE_COLUMNSTOREOBJECTPOOL) también está fuera del grupo de búferes. Vea esta publicación de blog de Niko Neugebauer
Blaž Dakskobler
@ BlažDakskobler sí, gracias, también en memoria. Actualizaré la publicación cuando tenga la oportunidad
Aaron Bertrand
3

Obtuve la siguiente definición de Bob Dorr sobre lo que controla la memoria máxima del servidor en SQL Server 2012. También puede leer Libros en línea para obtener más detalles.

La memoria máxima del servidor controla la asignación de memoria del servidor SQL, incluida la agrupación de almacenamiento intermedio, la memoria de compilación, todas las memorias caché, las concesiones de memoria qe, la memoria del administrador de bloqueos y la memoria CLR (básicamente cualquier "empleado" como se encuentra en dm_os_memory_clerks). La memoria para las pilas de subprocesos, los montones de memoria, los proveedores de servidores vinculados que no sean SQL Server o cualquier memoria asignada por una DLL "no SQL Server" no está controlada por la memoria máxima del servidor.

La memoria asignada a la pila de subprocesos, la DLL de terceros, el proveedor del servidor vinculado que no sea Microsoft (como MySQL.PostgreSQL, etc.) o cualquier DLL cargada en el espacio de direcciones de SQL Server que no sea SQL Server se asigna fuera de la memoria máxima del servidor. La operación de copia de seguridad de IIRC en SQL Server 2012 también tiene memoria asignada fuera del grupo de búferes.

¿Está utilizando un servidor vinculado para consultar otros RDBMS? Cualquier otro software instalado en la misma máquina Windows. ¿Puedes publicar en alguna ubicación compartida el resultado de las siguientes consultas?

select type,
sum(pages_kb)/1024 as [Memory utilized in MB],
sum(awe_allocated_kb)/1024 as [Memory allocated though Windows API]
 from sys.dm_os_memory_clerks
 group by type
 order by [Memory utilized in MB] desc
 Go
-------

 select (virtual_address_space_committed_kb/1024) as virtual_address_space_committed_MB,
 (locked_page_allocations_kb/1024) locked_page_allocations_MB,
 (pages_kb/1024) [memory allocated MB]
  from sys.dm_os_memory_nodes
  Go
-------
SELECT SUM (pages_in_bytes)/1024 as 'KB Used', type 
FROM sys.dm_os_memory_objects
GROUP BY type 
ORDER BY 'KB Used' DESC;
GO
--------
select name,
type,
sum(pages_kb)/1024 as [Mem MB],
sum(entries_count) as [Total Entry count] from sys.dm_os_memory_cache_counters
group by
type, name
order by [Mem MB] desc
Go
-----
select * from sys.dm_os_loaded_modules where company <> 'Microsoft Corporation'
go

¿También puede cargar la DBCC MMEMORYSTATUSsalida completa en alguna ubicación compartida y publicar el enlace aquí? Esto ayudaría a comprender qué componente está tomando memoria

Editar: según la salida dbcc memorystatus, puedo ver 2 nodos NUMA y la memoria utilizada por cada nodo es aprox.

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

Nuevamente, si ve el Administrador de memoria en la salida de estado de memoria, su

Memory Manager                           KB
---------------------------------------- -----------
VM Reserved                              260726964
VM Committed                             **67108820**

La máquina virtual comprometida es en realidad la memoria virtual comprometida por SQL Server y, como esta memoria está comprometida, lo ha hecho physical memory backing it. Esto nuevamente, lo que me hace pensar que SQL Server está usando 65 G como se establece en la memoria máxima del servidor

Esto es lo que es la memoria máxima del servidor. Entonces, la memoria está bien distribuida entre ambos nodos, ¿también puede agregar la salida de la consulta a continuación para verificar? Por favor agregue captura de pantalla

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Shanky
fuente
@DBAFromTheCold: Es tarde pero todavía estás buscando respuesta, si es así, quiero intentarlo una vez más :) ¿Puedes publicar la salida completa deselect * from sys.dm_so_process_memory
Shanky
Hola Shanky, gracias por la respuesta, pero el problema se ha resuelto solo. Nada de mi parte, SQL liberó la memoria por sí solo. Estoy monitoreando el servidor y si vuelve a ocurrir, publicaré una actualización. Realmente quiero llegar al fondo de esto.
dbafromthecold