SQL volcando todas las páginas de la memoria caché del búfer cada pocos minutos

9

Tengo un único nodo SQL2012 SP4 que ejecuta varias bases de datos.

El servidor tiene 20 GB de memoria disponible, 14 GB asignados a SQL (nada más se ejecuta en la caja).

Cada pocos minutos, SQL vuelca todo el caché del búfer. La esperanza de vida de la página llega a cero, los descriptores de la memoria caché del búfer muestran que no hay nada en la memoria caché.

Eché un vistazo a las notificaciones del monitor de recursos y las notificaciones rebotan desde alta / constante / baja cada pocos milisegundos:

RESOURCE_MEMPHYSICAL_HIGH RESOURCE_MEM_STEADY RESOURCE_MEMPHYSICAL_LOW

Con marcas de tiempo que están separadas por varios milisegundos. El PLE es esencialmente un patrón de diente de sierra.

He visto esto suceder antes con SQL2012 SP1 y esta pregunta:

No se utilizan páginas gratuitas de SQL Server 2012 en la memoria caché del búfer

Parece ser un problema similar, aunque ya he actualizado a SP4.

He intentado activar LPIM para la cuenta de servicio y he intentado jugar con la configuración de memoria máxima. La disminución de la memoria máxima parece haber causado que la memoria caché del búfer se vacíe con más frecuencia.

¿Alguna idea de qué verificar a continuación?

La carga de trabajo del servidor es literalmente nada (estoy desplazándome por las listas de elementos en un sistema ERP y llega a unos 40-50 MB antes de que el caché simplemente vuelva a caer).

Es interesante porque actualicé desde SP1 para tratar de solucionar esto: el caché estaba llegando a alrededor de 500 MB. Desde entonces, bajé la configuración de memoria máxima a 14 GB, lo que parece haber empeorado las cosas.

Me pregunto si Windows está entrando en pánico y arrojando notificaciones incorrectas para la presión de la memoria en SQL; se deduce que el servidor con la memoria máxima configurada como ilimitada parecía ejecutarse correctamente, pero nunca llenó el caché más de unos pocos cientos de MB, pero ahora apenas llega a 50 ...

Más información: para los que preguntaron

Número de núcleos: 4

Tamaño de la base de datos: 80 GB

El registro de errores muestra: A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 seconds. Working set (KB): 247928, committed (KB): 495656, memory utilization: 50%.

Resultados de ejecutar scripts desde este enlace: https://www.sqlskills.com/blogs/jonathan/identifying-external-memory-pressure-with-dm_os_ring_buffers-and-ring_buffer_resource_monitor/

Resultados de la consulta de presión de memoria

No estoy seguro de cómo interpretar esto: parece que hay presión de memoria interna y externa en varios momentos.

Aún más información:

Este es un invitado de Hyper-V sentado en un host con 96 GB de RAM total, de los cuales aproximadamente la mitad se asigna a los invitados.

Los síntomas parecen similares a esto:

SQL Server 2012 x64: no se puede asignar de forma segura más del 50% de RAM

Sin embargo, cuando asigné 14 GB a SQL, los síntomas aparecieron de inmediato (apenas se confirmaron 3 GB de la memoria del servidor)

Anoche superé la memoria del invitado a 32 GB y el problema desapareció, pero solo veo 14 GB de memoria total del servidor (y el negocio que ejecuta el DB está ocupado esta mañana y es cuando generalmente tienen sus problemas de rendimiento).

Alrededor de 8-9 GB de datos en el caché en este momento, parece ser estable.

Parece sugerir que 20 GB son suficientes para la carga de trabajo en este cuadro. Estoy feliz de dejarlo con 32 GB por ahora, pero realmente me gustaría llegar al fondo de esto para poder configurar mejor las VM / SQL.

¡Seguiré cavando y actualizando si encuentro la respuesta!

Aún más más información:

No reinicié SQL después de encender LPIM (sin darme cuenta de que era un requisito), pero dejé esta configuración y reinicié para actualizar la memoria, así que ahora no estoy seguro de si el aumento de memoria o LPIM ha aliviado los problemas.

Saltará esta noche cuando el servidor esté inactivo y verificará nuevamente cómo se ve a 20 GB.

Aún más Más información:

Actualmente, el servidor está funcionando bien con 32 GB asignados y no hemos visto el problema desde entonces. Si esto vuelve a aparecer, volveré a esta pregunta y seguiré investigando.

Actualmente sigue siendo un misterio, pero supongo que solo estoy enmascarando los problemas en este momento.

Charleh
fuente
3
¿Es esta una máquina virtual? Parece que el controlador de globo de VMware causa presión en la memoria.
Max Vernon
1
Si se trata de una VM que se ejecuta en VMWare, consulte este artículo: Solución de problemas de rendimiento de la CPU en VMware . Sé que dice CPU en el título, pero también hay información sobre contadores de memoria.
Erik Darling
Sí, es un host Hyper-V con 3 servidores. Gracias por la información. Lo
revisaré
He encontrado hasta ahora que el host tiene suficiente memoria para agregar otros 12 GB. Permití SQL 24 GB (llevando al invitado hasta 32 GB en total) y hasta ahora parece mucho más saludable, pero aún me gustaría entender lo que está sucediendo, ya que 14-16 GB parece más que suficiente para la carga de trabajo que consumirá SQL todos los días ..
Charleh
1
¿Investigaste el globo? Si VMWare bombea el controlador de globo, el sistema operativo indicará que hay poca memoria y SQL Server responderá en consecuencia. El primer paso es investigar si tienes globos o no.
Tibor Karaszi

Respuestas:

4

Aunque parezca haber resuelto el problema usted mismo, aquí hay un resumen de la información relevante que rodea la solución.

Opciones de configuración del servidor de memoria del servidor

Microsoft escribe en su artículo Opciones de configuración del servidor de memoria del servidor (Microsoft | SQL Docs) para la sección Configuración manual de las opciones de memoria

( énfasis mío)

Además, establecer un valor min_server_memory es esencial en un entorno virtualizado para garantizar que la presión de memoria del host subyacente no intente desasignar la memoria del grupo de búferes en una máquina virtual (VM) SQL Server más allá de lo necesario para un rendimiento aceptable.

La sección sobre Bloquear páginas en la memoria (mismo documento) tiene un párrafo convincente que dice:

( énfasis mío)

Esta política de Windows determina qué cuentas pueden usar un proceso para mantener los datos en la memoria física, evitando que el sistema pagine los datos a la memoria virtual en el disco . El bloqueo de páginas en la memoria puede hacer que el servidor responda cuando se produce la paginación de la memoria al disco. La opción Bloquear páginas en memoria está activada en instancias de SQL Server Standard edition y superior cuando la cuenta con privilegios para ejecutar sqlservr.exe tiene el derecho de usuario de Windows Lock Pages in Memory (LPIM).

La sección LPIM continúa explicando que:

( énfasis mío)

Establecer esta opción no afecta la administración de memoria dinámica de SQL Server, lo que le permite expandirse o reducirse a solicitud de otros empleados de memoria. Cuando se utiliza el derecho de usuario Bloquear páginas en memoria, se recomienda establecer un límite superior para la memoria máxima del servidor como se detalla anteriormente.

... y en un comentario importante que:

( énfasis mío)

Establecer esta opción solo debe usarse cuando sea necesario, es decir , si hay signos de que el proceso sqlservr se está paginando . En este caso, se informará el error 17890 en el registro de errores, similar al siguiente ejemplo:

A significant part of sql server process memory has been paged out. 
This may result in a performance degradation. Duration: #### seconds. 
Working set (KB): ####, committed (KB): ####, memory utilization: ##%.  

A partir de SQL Server 2012 (11.x), el indicador de traza 845 no es necesario para que Standard Edition use páginas bloqueadas.

Solución

Según los hallazgos anteriores y sus observaciones, la solución a su problema sería configurar las siguientes opciones:

  1. min_server_memory (5-10 GB?) Basado en su comentario:

    Alrededor de 8-9 GB de datos en el caché en este momento, parece ser estable.

    ... y la recomendación de Microsoft de establecer a min_server_memory.

  2. max_server_memory (20-32 GB) según su observación:

    Parece sugerir que 20 GB son suficientes para la carga de trabajo en este cuadro. Estoy feliz de dejarlo con 32 GB por ahora, pero realmente me gustaría llegar al fondo de esto para poder configurar mejor las VM / SQL.

    ... y la recomendación de Microsoft de establecer a max_server_memory.

  3. Bloquear páginas en la memoria: habilitado para la cuenta de servicio de SQL Server.
    Según la entrada ERRORLOG de su instancia de SQL Server que mencionó y la referencia de Microsoft en el artículo.

    Establecer esta opción solo debe usarse cuando sea necesario, es decir , si hay signos de que el proceso sqlservr se está paginando .

Antes de continuar ...

(Uno de) los beneficios de tener un entorno virtualizado es que los recursos pueden / deberían compartirse, y posiblemente incluso estar comprometidos en exceso. Sin embargo, activar Bloquear páginas en memoria (LPIM) podría tener un impacto negativo en su entorno Hyper-V, si su hardware aloja varias instancias. Un compromiso excesivo de RAM podría agotar otras instancias.

Antes de considerar cambiar todas las palancas, comience con las configuraciones 1. y 2. y si el ajuste fino de estas configuraciones de memoria no funciona, considere activar LPIM si tiene suficiente hardware .

John aka hot2use
fuente