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: -
Y aquí está el límite de memoria establecido: -
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: -
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
Entonces, esto parece indicar que SQL Server está utilizando más del conjunto de 65 GB.
fuente
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;
?Respuestas:
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:
20 mejores empleados
Ya has hecho esto, pero para completar:
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):
Pero también puede ver cuánta memoria están ocupando las pilas de hilos usando:
Módulos de terceros cargados
DMV relacionados con la memoria
También puede detectar algo fuera de lo común mirando estos DMV:
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):fuente
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 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?
¿También puede cargar la
DBCC MMEMORYSTATUS
salida completa en alguna ubicación compartida y publicar el enlace aquí? Esto ayudaría a comprender qué componente está tomando memoriaEditar: según la salida dbcc memorystatus, puedo ver 2 nodos NUMA y la memoria utilizada por cada nodo es aprox.
Nuevamente, si ve el Administrador de memoria en la salida de estado de memoria, su
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 servidorEsto 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
fuente
select * from sys.dm_so_process_memory