SQL Server 2008 R2 "Memoria fantasma"?


12

Tenemos una máquina SQL Server 2008 R2 dedicada que está experimentando algunos problemas de memoria extraños. La máquina en sí tiene muchos recursos, incluidos dos procesadores de cuatro núcleos, 16 gb de RAM y 64 bits de Windows Server 2008 R2 Enterprise (es un Dell PowerEdge 2950) .

El extraño problema es que el sistema informa el 82% de la memoria en uso, pero sqlservr.exe solo informa 155mb en uso. La razón por la que sospecho que SQL Server es el problema es porque si reinicio el proceso sqlservr.exe, el consumo de memoria vuelve a la normalidad durante un período de tiempo.

¿Alguien tiene alguna idea sobre cómo puedo comenzar a rastrear este problema?

Gracias Jason


3
¿Está utilizando el derecho de usuario Bloquear páginas en memoria? Si es así, el administrador de tareas no informará la memoria bloqueada. Consulte blogs.technet.com/b/askperf/archive/2008/03/25/… para obtener más información.
Mark S. Rasmussen

Tenemos el derecho de usuario Bloquear páginas en memoria establecido en "Ninguno". También tenemos la configuración "Memoria máxima del servidor (en MB)" en su valor predeterminado int.MaxValue: ¿cree que podría causar un problema?
typefragger

44
¡La única vez que me preocuparía es cuando mi servidor sql usa MENOS del 82%!
SqlACID

Respuestas:


15

No obtendrá una imagen real del uso de memoria del Administrador de tareas si la cuenta con la que se ejecuta el servicio tiene las páginas bloqueadas en el privilegio de memoria (editar: según el comentario / enlace de Mark Rasmussen). Para determinar cuánta memoria se está utilizando, puede mirar:

  • SQLServer: Administrador de memoria \ Contador de rendimiento de memoria total del servidor
  • DMV

No recuerdo si hay un DMV o una combinación de eso que le dará la asignación total de memoria, pero lo siguiente mostrará la mayor parte.

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

El segundo es el más interesante, generalmente, las asignaciones de agrupaciones de almacenamiento intermedio por base de datos. Aquí es donde se utilizarán los leones compartidos y puede ser útil comprender cuáles de sus bases de datos son los mayores consumidores.


¡Vaya, muchas gracias! ¡Esto (particularmente el segundo) me lo dejó completamente claro!
typefragger

8

Hay un artículo reciente de nuestro propio Brent Ozar que trata este caso, cuando el Administrador de tareas no muestra correctamente la memoria consumida por SQLServer y sus servicios adicionales. Puede encontrarlo aquí: Una guía del administrador de sistemas para la memoria de Microsoft SQL Server .

Cita: " ¿Por qué SQLServer.exe no utiliza mucha memoria?

Cuando coloca un escritorio remoto en un servidor y mira el Administrador de tareas, el uso de memoria de sqlservr.exe siempre parece una locura. Eso no es culpa del servidor SQL. El Administrador de tareas es un mentiroso sucio y sucio. (Lo sé, parece que el tipo SQL está echando la culpa, pero tengan paciencia conmigo por un segundo). En las cajas de 64 bits, este número es algo más preciso, pero en las cajas de 32 bits, está completamente fuera de base . Para obtener una imagen precisa de la cantidad de memoria que está utilizando SQL Server, necesita una herramienta como Process Explorer y debe identificar todos los procesos de SQL Server. En el servidor que muestro a la derecha, hay dos instancias de SQL Server (mostradas por sqlservr.exe), además de las herramientas de copia de seguridad de SQL Agent, SQL Browser y SQL Server. No es inusual ver también que SQL Server Analysis Services, Integration Services y Reporting Services también se ejecutan en el mismo servidor, todo lo cual consume memoria.

Entonces, ¿cuánta memoria usa SQL? Te lo haré fácil. SQL Server está utilizando toda la memoria. Período."

Por lo tanto, le aconsejo que pruebe la consulta de Mark y utilice una herramienta mejor para el informe de memoria. O simplemente confíe en Perfmon para informar la memoria, no el Administrador de tareas.


-2

La cantidad de memoria utilizada por SQL, como se muestra en el administrador de tareas, será principalmente la configuración de memoria máxima. Así es como funciona la configuración mínima / máxima:

Cuando se inicia el servidor SQL, comienza a llevar la memoria a la configuración de memoria mínima. A medida que sus necesidades de SQL aumenten, SQL comenzará a usar más memoria hasta la configuración de memoria máxima. La memoria se queda en este punto (máximo) incluso cuando el uso de SQL disminuye. Esto da la impresión de que SQL realiza tareas enormes y usa tanta memoria. En realidad, esta memoria está reservada por SQL.

Cuando hay una presión de memoria no SQL en el servidor, SQL liberará la memoria hasta el punto de configuración de memoria mínima. Así es como se usan las configuraciones de memoria. Puede usar los scripts de Mark para ver cómo SQL está usando esta memoria.


1
Min / max gobierna las asignaciones de agrupaciones de almacenamiento intermedio, nada más. Esta es la primera línea en la descripción de las Opciones de memoria del servidor en BOL. La configuración no tiene absolutamente ninguna relación con la que se muestra en el administrador de tareas. La descripción de Brent de taskmgr como "un mentiroso sucio y sucio" resume la situación tan bien como cualquiera que haya leído.
Mark Storey-Smith

@ MarkStorey-Smith, lea el contenido más abajo en el enlace en su propio comentario, simplemente explica mi punto. El administrador de tareas muestra el uso de los recursos del sistema. La agrupación de almacenamientos intermedios no es un recurso del sistema. Estoy explicando qué significa el uso de memoria por SQL que se muestra en el administrador de tareas. Estás diciendo lo obvio al mencionar el grupo de búferes, pero eso aún no prueba que estoy equivocado.
StanleyJohns

No estoy seguro de qué mejor decir esto ... "La cantidad de memoria utilizada por SQL, como se muestra en el administrador de tareas, será principalmente la configuración de memoria máxima. Así es como funciona la configuración mínima / máxima" ... no, no es 't.
Mark Storey-Smith

'Así es como funcionan las configuraciones mín. / Máx.' Hay dos puntos al final, lo que significa que la explicación sigue, no que afirma la oración anterior. :)
StanleyJohns

1
Estoy con Mark Lea el blog Slava Oks : formó parte del equipo de MS que escribió el administrador de memoria. Vaya al encabezado "agrupación de almacenamiento intermedio". Cito: "Recuerde que SQL Server tiene dos configuraciones de memoria que puede controlar usando sp_conifigure. Son memoria de servidor máxima y mínima. No estoy seguro si sabe, pero estas dos configuraciones realmente controlan el tamaño de la agrupación de almacenamiento intermedio. No controlan en general cantidad de memoria física consumida por SQL Server "
gbn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.