¿Cómo puedo solucionar problemas de poca memoria libre en una base de datos de Amazon RDS para MySQL?

10 minutos de lectura
0

Estoy ejecutando una instancia de Amazon Relational Database Service (Amazon RDS) para MySQL. Veo que mi memoria disponible es baja, mi base de datos no tiene memoria o la poca memoria está causando problemas de latencia en mi aplicación. ¿Cómo identifico el origen de la utilización de la memoria y cómo puedo solucionar problemas con poca memoria libre?

Descripción breve

En Amazon RDS para MySQL, puede supervisar cuatro estados de memoria:

  • Activo: La memoria que consumen activamente los procesos o subprocesos de la base de datos.
  • Búfer: Un búfer es un espacio temporal en la memoria que se usa para almacenar un bloque de datos.
  • Memoria libre: La memoria que está disponible para su uso.
  • Caché: El almacenamiento en caché es una técnica en la que los datos se almacenan temporalmente en la memoria, lo que permite una recuperación rápida de los datos.

De forma predeterminada, al crear una instancia de Amazon RDS para MySQL, se asignan búfers y cachés para mejorar las operaciones de la base de datos. Amazon RDS para MySQL también tiene un componente de memoria interna (como key_buffers_size o query_cache_size) que crea tablas temporales internas para realizar determinadas operaciones.

Cuando utilice Amazon RDS para MySQL, asegúrese de entender cómo MySQL usa y asigna la memoria. Tras identificar los componentes que utilizan memoria, puede buscar cuellos de botella a nivel de instancia y base de datos. A continuación, supervise esas métricas específicas y configure sus sesiones para obtener un rendimiento óptimo.

Resolución

Cómo usa MySQL la memoria

En Amazon RDS para MySQL, entre el 80 y el 90 % de la memoria disponible en una instancia se asigna con los parámetros predeterminados. Esta asignación es óptima para el rendimiento, pero si establece parámetros que utilizan más memoria, modifique otros parámetros para utilizar menos memoria a fin de compensar.

Puede calcular el uso aproximado de memoria de su instancia de base de datos de RDS para MySQL de la siguiente manera:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + ((read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size) X max_connections)

Grupos de búfers

Los búfers y cachés globales incluyen componentes como Innodb_buffer_pool_size, Innodb_log_buffer_size, key_buffer_size,y query_cache_size. El parámetro innodb_buffer_pool_size es el área de memoria de la RAM donde innodb almacena en caché las tablas de la base de datos y los datos relacionados con el índice. Un grupo de búfers más grande requiere que se desvíen menos operaciones de E/S al disco. De forma predeterminada, innodb_buffer_pool_size utiliza un máximo del 75 % de la memoria disponible asignada a la instancia de base de datos de Amazon RDS:

innodb_buffer_pool_size = {DBInstanceClassMemory*3/4}

Asegúrese de revisar primero este parámetro para identificar el origen del uso de la memoria. A continuación, considere reducir el valor de innodb_buffer_pool_size modificando el valor del parámetro en su grupo de parámetros personalizado.

Por ejemplo, el predeterminado DBInstanceClassMemory*3/4 se puede reducir a***5/8o*1/2**. Asegúrese de que el valor de la instancia BufferCacheHitRatio no sea demasiado bajo. Si el valor de BufferCacheHitRatio es bajo, es posible que tenga que aumentar el tamaño de la instancia para obtener más RAM. Para obtener más información, consulte Prácticas recomendadas para configurar los parámetros de Amazon RDS para MySQL, parte 1: Parámetros relacionados con el rendimiento.

Subprocesos de MySQL

También se asigna memoria para cada subproceso de MySQL que esté conectado a una instancia de base de datos de MySQL. Los siguientes subprocesos requieren memoria asignada:

  • thread_stack
  • net_buffer_length
  • read_buffer_size
  • sort_buffer_size
  • join_buffer_size
  • max_heap_table_size
  • tmp_table_size

Además, MySQL crea tablas temporales internas para realizar algunas operaciones. Estas tablas se crean inicialmente como tablas basadas en memoria. Cuando las tablas alcancen el tamaño especificado por tmp_table_size o max_heap_table_size (lo que tenga el valor más bajo), la tabla se convierte en una tabla basada en disco. Cuando varias sesiones crean tablas temporales internas, es posible que observe un aumento en el uso de la memoria. Para reducir el uso de memoria, evite utilizar tablas temporales en las consultas.

**Nota:**Al aumentar los límites tmp_table_size y max_heap_table_size, las tablas temporales más grandes pueden permanecer en la memoria. Para confirmar si se ha creado una tabla temporal implícita, utilice la variable created_tmp_tables. Para obtener más información sobre esta variable, consulte created_tmp_tables en el sitio web de MySQL.

Operaciones JOIN y SORT

El uso de memoria aumentará si se asignan varios búfers del mismo tipo, como join_buffer_size o sort_buffer_size, durante una operación JOIN o SORT. Por ejemplo, MySQL asigna un búfer JOIN para ejecutar JOIN entre dos tablas. Si una consulta incluye JOIN de varias tablas y todas las consultas requieren un búfer JOIN, MySQL asigna un búfer JOIN menos que el número total de tablas. Configurar las variables de sesión con un valor demasiado alto puede causar problemas si las consultas no están optimizadas. Puede asignar la memoria mínima a variables de nivel de sesión, como join_buffer_size y join_buffer_size ysort_buffer_size. Para obtener más información, consulte Trabajar con grupos de parámetros de base de datos.

Si realiza inserciones masivas en tablas MYISAM, se utilizan bytes de memoria bulk_insert_buffer_size. Para obtener más información, consulte Prácticas recomendadas para trabajar con motores de almacenamiento de MySQL.

El esquema de rendimiento

La memoria puede ser consumida por el Esquema de rendimiento si ha activado el Esquema de rendimiento para Performance Insights en Amazon RDS para MySQL. Cuando el Esquema de rendimiento está activado, MySQL asigna búfers internos cuando se inicia la instancia y durante las operaciones del servidor. Para obtener más información sobre cómo el Esquema de rendimiento usa la memoria, consulte la documentación de MySQL para ver El modelo de asignación de memoria del Esquema de rendimiento.

Junto con las tablas del Esquema de rendimiento, también puede utilizar el esquema de sistema de MySQL. Por ejemplo, puede usar el evento performance_schema para mostrar la cantidad de memoria asignada a los búfers internos que usa el Esquema de rendimiento. O bien, puede ejecutar una consulta como esta para ver cuánta memoria está asignada:

SELECT * FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%';

Los instrumentos de memoria se enumeran en la tabla setup_instruments, siguiendo el formato «memory/code_area/instrument_name». Para activar la instrumentación de memoria, actualice la columna ENABLED de los instrumentos pertinentes de la tabla setup_instruments:

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'memory/%';

Supervisar el uso de memoria en su instancia

Métricas de Amazon CloudWatch

Supervise las métricas de Amazon CloudWatch para DatabaseConnections, CPUUtilization, ReadIOPS, y WriteIOPS cuando la memoria disponible sea baja.

En DatabaseConnections, es importante tener en cuenta que cada conexión que se realice a la base de datos necesita que se le asigne cierta cantidad de memoria. Por lo tanto, un aumento en las conexiones a las bases de datos puede provocar una caída en la memoria libre. En Amazon RDS, el límite flexible para max_connections se calcula de la siguiente manera:

{DBInstanceClassMemory/12582880}

Supervise si está superando este límite flexible consultando la métrica de DatabaseConnections en Amazon CloudWatch.

Además, compruebe la presión de memoria supervisando las métricas de CloudWatch para SwapUsage además de FreeableMemory. Si observa que se utiliza una gran cantidad de intercambios y tiene poca memoria libre, es posible que su instancia tenga una gran presión de memoria. La alta presión de memoria afecta al rendimiento de la base de datos. Se recomienda mantener los niveles de presión de la memoria por debajo del 95 %. Para obtener más información, consulte ¿Por qué mi instancia de Amazon RDS utiliza memoria de intercambio cuando tengo suficiente memoria?

Supervisión mejorada

Para supervisar la utilización de los recursos en una instancia de base de datos, active la Supervisión mejorada. A continuación, defina una granularidad de uno o cinco segundos (el valor predeterminado es 60 segundos). Con la Supervisión mejorada, puede supervisar la memoria libre y activa en tiempo real.

También puede supervisar los subprocesos que consumen la máxima cantidad de CPU y memoria enumerando los subprocesos de su instancia de base de datos:

mysql> select THREAD_ID, PROCESSLIST_ID, THREAD_OS_ID from performance_schema.threads;

A continuación, asigne el thread_OS_ID al thread_ID:

select p.* from information_schema.processlist p, performance_schema.threads t
where p.id=t.processlist_id and t.thread_os_id=<Thread ID from EM processlist>;

Solución de problemas de poca memoria libre

Si tiene problemas de poca memoria libre, tenga en cuenta los siguientes consejos de solución de problemas:

  • Asegúrese de tener suficientes recursos asignados a la base de datos para ejecutar las consultas. Con Amazon RDS, la cantidad de recursos asignados depende del tipo de instancia. Además, ciertas consultas, como los procedimientos almacenados, pueden ocupar una cantidad ilimitada de memoria mientras se ejecutan.
  • Evite las transacciones de larga duración dividiendo las consultas grandes en consultas más pequeñas.
  • Para ver todas las conexiones y consultas activas de la base de datos, utilice el comando SHOW FULL PROCESSLIST. Si observa una consulta de larga ejecución con operaciones JOIN o SORTS, necesita suficiente RAM para que el optimizador calcule el plan. Además, si identifica una consulta que necesita una tabla temporal, debe disponer de memoria adicional para asignarla a la tabla.
  • Para ver las transacciones de larga ejecución, las estadísticas de utilización de memoria y los bloqueos, utilice el comando SHOW ENGINE INNODB STATUS. Revise la salida y compruebe las entradas BUFFER POOL AND MEMORY. La entrada BUFFER POOL AND MEMORY proporciona información sobre la asignación de memoria para InnoDB, como la «memoria total asignada», las «tablas de hash internas» y el «tamaño del grupo de búfers». El estado de InnoDB también ayuda a proporcionar información adicional sobre latches, locks y deadlocks.
  • Si su carga de trabajo encuentra deadlocks con frecuencia, modifique el parámetro innodb_lock_wait_timeout en su grupo de parámetros personalizado. InnoDB se basa en la configuración innodb_lock_wait_timeout para anular las transacciones cuando se produce un deadlock.
  • Para optimizar el rendimiento de la base de datos, asegúrese de que las consultas estén ajustadas correctamente. De lo contrario, podría experimentar problemas de rendimiento y tiempos de espera prolongados.
  • Utilice Amazon RDS Performance Insights para supervisar las instancias de base de datos e identificar cualquier consulta problemática.
  • Supervise las métricas de Amazon CloudWatch, como la utilización de la CPU, las IOPS, la memoria y el uso de intercambios, para que la instancia no se acelere.
  • Configure una alarma de CloudWatch en la métrica FreeableMemory para recibir una notificación cuando la memoria disponible alcance el 95 %. Se recomienda mantener libre al menos el 5 % de la memoria de la instancia.
  • Actualice periódicamente su instancia a una versión menor más reciente de MySQL. Es más probable que las versiones menores antiguas contengan errores relacionados con la pérdida de memoria.

Información relacionada

Descripción general de la supervisión de Amazon RDS

¿Por qué mi instancia de base de datos de Amazon RDS utiliza memoria de intercambio cuando tengo memoria suficiente?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años