Saltar al contenido

¿Cómo soluciono los problemas de falta de memoria libre en mi instancia de RDS para SQL Server?

9 minutos de lectura
0

Quiero solucionar un problema de falta de memoria libre en mi instancia de base de datos relacional de Amazon (Amazon RDS) para SQL Server.

Resolución

Supervisión del uso de memoria en la instancia

Para supervisar el uso de la memoria, puedes utilizar las métricas de Amazon CloudWatch o la supervisión mejorada.

Uso de las métricas de CloudWatch

Para identificar la falta de memoria, utiliza la consola de Amazon RDS para supervisar la métrica FreeableMemory de CloudWatch.

Para identificar un aumento en la carga de trabajo cuando la memoria disponible es baja, supervisa las siguientes métricas:

  • DatabaseConnections
  • CPUUtilization
  • ReadIOPS
  • ReadThroughput
  • WriteIOPS
  • WriteThroughput

Para obtener información sobre las métricas anteriores, consulta Métricas a nivel de instancia de Amazon CloudWatch para Amazon RDS.

Activación de la supervisión mejorada

Para supervisar las métricas del sistema operativo (SO) de Microsoft SQL Server, utiliza la supervisión mejorada. Al activar la supervisión mejorada, puedes establecer el intervalo de recopilación de métricas en 1, 5, 10, 15, 30 o 60 segundos. El valor predeterminado es una granularidad de 60 segundos, pero se recomienda establecer la granularidad en 1 o 5 segundos.

También puedes utilizar la supervisión mejorada para crear alarmas de CloudWatch a fin de supervisar el uso de memoria de la instancia de base de datos de Amazon RDS para SQL Server.

Limitar la memoria que usa la instancia de Amazon RDS

Determina el valor de max_server_memory para tu instancia y, a continuación, establece el valor de max_server_memory en un valor que no cause presión de memoria en todo el sistema.

Determinar el valor de max_server_memory

Usa el siguiente cálculo para determinar el valor de max_server_memory para tu instancia:

max_server_memory = total_RAM - (1 GB para el SO + memory_basis_amount_of_RAM_on_the_server)

total_RAM es igual al total de la memoria del tipo de instancia.

memory_basis_amount_of_RAM_on_the_server se determina de la siguiente manera:

  • Si la RAM del servidor está entre 4 GB y 16 GB, conserva 1 GB por cada 4 GB de RAM. Por ejemplo, conserva 4 GB para un servidor con 16 GB de RAM.

  • Si la RAM del servidor supera los 16 GB, conserva 1 GB por cada 4 GB de RAM hasta 16 GB. Conserva 1 GB por cada 8 GB de RAM que superen los 16 GB.

Por ejemplo, si un servidor tiene 64 GB de RAM, el cálculo de max_server_memory es el siguiente:

  • 1 GB para el sistema operativo
  • Hasta 16 GB de RAM: 16/4 = 4 GB
  • RAM restante de más de 16 GB: (64-16)/8 = 6 GB
  • (1 GB para el SO + memory_basis_amount_of_RAM_on_the_server) = 1 + 4 + 6 = 11 GB
  • max_server_memory: 64 - 11 = 53 GB

Establecer max_server_memory

Para cambiar max_server_memory, usa un grupo de parámetros personalizado para configurar el valor. Proporciona el valor de max_server_memory en max server memory (MB). Como max_server_memory es un parámetro dinámico, no es necesario reiniciar para que los cambios surtan efecto.

Nota: Después de configurar max_server_memory, debes supervisar continuamente FreeableMemory para determinar si debes aumentar o disminuir la memoria asignada.

Comprobación del uso de las opciones de SSIS, SSAS o SSRS en la instancia de base de datos

Comprueba el grupo de opciones de RDS para determinar si utiliza las opciones de SQL Server Integration Services (SSIS), SQL Server Analysis Services (SSAS) o SQL Server Reporting Services (SSRS) en la instancia de base de datos. La memoria que utilizan las opciones existe fuera de la configuración max_server_memory y aumenta el consumo de memoria de la instancia. Si no usas estas opciones, modifica el grupo de opciones para eliminarlas.

Nota: Si usas SSIS, SSAS o SSRS en la instancia, debes ajustar max_server_memory para que se adapte a las opciones.

Por ejemplo, si usas SSRS, define el valor de Max memory del SSRS en el 10 % de la memoria total de la instancia de base de datos. Por ejemplo, el 10 % en una instancia que tiene 64 GiB de memoria equivale a aproximadamente 6,4 GiB. Por lo tanto, ajusta el valor de max_server_memory a aproximadamente 46 GiB (64 - 11 - 6.4 = 46 GiB).

Comprobación de las conexiones a bases de datos

Cada conexión de base de datos que realices a la instancia requiere una asignación de memoria fuera del grupo de búferes para los subprocesos de trabajo. Por lo tanto, un aumento en DatabaseConnections puede provocar una caída en la memoria libre.

Supervisión de la instancia de base de datos con Información de rendimiento

Puedes usar Información de rendimiento para analizar el rendimiento de la base de datos e identificar posibles cuellos de botella que ralentizan la instancia. Utiliza el panel de Información de rendimiento para supervisar la carga de la base de datos, las esperas, las consultas, los hosts y los usuarios.

Realización de un mantenimiento regular de la instancia de base de datos

Realiza un mantenimiento regular de los índices y mantén las estadísticas actualizadas. Los índices muy fragmentados pueden aumentar la actividad de E/S y provocar un mayor uso de la memoria. Además, las estadísticas desactualizadas pueden provocar una estimación de cardinalidad inexacta y hacer que la base de datos seleccione un plan de consulta subóptimo. Para obtener más información, consulta Optimización del mantenimiento de índices para mejorar el rendimiento de las consultas y reducir el consumo de recursos en el sitio web de Microsoft. Consulta también UPDATE STATISTICS (Transact-SQL) en el sitio web de Microsoft. 

Nota: Se recomienda realizar el mantenimiento de los índices y las estadísticas durante las horas de menor actividad o durante un periodo de mantenimiento.

Supervisión del PLE y el BCHR

Para identificar la presión de la memoria, controla la expectativa de vida de la página (PLE) y la tasa de aciertos de la caché del búfer (BCHR). Para un rendimiento óptimo, comprueba que los valores de PLE y BCHR sean lo más altos posible. Si los valores de PLE y BCHR son consistentemente bajos durante un periodo de tiempo, ajusta las consultas que acceden a los datos o aumenta la clase de instancia para proporcionar más memoria.

Para usar Información de rendimiento para supervisar las métricas, sigue estos pasos:

  1. Abre la consola de Amazon RDS.
  2. En el panel de navegación selecciona Información de rendimiento.
  3. Utiliza el campo de búsqueda Filtrar una instancia de base de datos para seleccionar la instancia que deseas supervisar.
  4. Establece el intervalo de tiempo para el que deseas revisar las métricas. 
  5. En el panel de métricas, selecciona Panel personalizado: base de datos de SQL Server y, a continuación, elige Agregar primer widget.
  6. En el campo de búsqueda Filtrar métricas por nombre, categoría o ID, busca la expectativa de vida de la página y, a continuación, selecciónala.
  7. Selecciona Agregar widget.
  8. Repite los pasos 6 y 7 para seleccionar la tasa de aciertos de la caché del búfer para el panel personalizado.

Para obtener más información acerca de PLE y BCHR, consulta Objetos de rendimiento del administrador de búferes en el sitio web de Microsoft.

Cuando hay presión de memoria en la instancia y un PLE y un BCHR bajos, la espera de PAGEIOLATCH aumenta. Microsoft SQL Server está esperando que se cargue una página del disco a la memoria. También es posible que veas que la espera de RESOURCE_SEMAPHORE cuando se realiza la solicitud de memoria de una consulta produce un error debido a la falta de memoria. El uso de la CPU aumenta entonces porque las páginas de datos no se almacenan en caché el tiempo suficiente en la memoria. Cuando esto ocurre, Microsoft SQL Server debe acceder repetidamente a los datos del disco.

Selección del tamaño de instancia correcto para la carga de trabajo

La cantidad de memoria de una instancia depende del tipo de instancia. Asegúrate de seleccionar una clase de instancia con recursos suficientes para que la instancia de base de datos tenga suficientes recursos para la carga de trabajo. Cuando una instancia tiene menos recursos, se producen problemas de rendimiento. Una instancia sobredimensionada desperdicia recursos.

Por ejemplo, la clase de instancia db.r5.8xlarge proporciona 32 vCPU y 256 GiB de memoria. Al aprovisionar una instancia de Amazon RDS con db.r5.8xlarge, los siguientes recursos comparten los 256 GiB de memoria de la clase de instancia:

  • Sistema operativo
  • Procesos de Amazon RDS
  • El motor de base de datos
  • Subprocesos de trabajo
  • Aplicaciones del conjunto de inteligencia empresarial, como SSIS, SSAS y SSRS.

Para obtener más información acerca de cómo Microsoft SQL Server usa la memoria, consulta la guía de arquitectura de administración de memoria en el sitio web de Microsoft.

Establecimiento del valor de referencia del uso de los recursos

Para establecer el valor de referencia del uso de los recursos en la instancia, supervisa métricas como FreeableMemory, Page Life Expectancy y Buffer Cache Hit Ratio. Si el volumen de datos aumenta significativamente en la instancia, aumenta el valor de max_server_memory. Asegúrate de aumentar el valor de max_server_memory en proporción al cambio del volumen de datos para mantener el mismo nivel de rendimiento en la instancia.

Nota: Para identificar los componentes que utilizan memoria en SQL Server, puedes usar las herramientas de SQL Server, como los informes y los DMV.

Para usar SQL Server Management Studio (SSMS) para revisar el uso de la memoria de SQL Server, sigue estos pasos:

  1. Abre SSMS y, a continuación, conéctate a tu instancia de Amazon RDS para SQL Server.
  2. En el Explorador de objetos, haz clic con el botón derecho en el nombre del punto de enlace de la instancia de Amazon RDS.
  3. Elige InformesInformes estándar, Consumo de memoria.

Para descargar SSMS, consulta Descargar SQL Server Management Studio (SSMS) en el sitio web de Microsoft. 

También puedes consultar sys.dm_os_memory_clerks para identificar los componentes que utilizan la memoria máxima en SQL Server. Para obtener más información, consulta sys.dm_os_memory_clerks (Transact-SQL) y Uso de memoria interna por parte del motor de SQL Server en el sitio web de Microsoft.