Solución de problemas de memoria insuficiente de bases de datos Aurora MySQL
Cuando una instancia de base de datos de Aurora MySQL tiene un nivel de memoria extremadamente bajo, el sistema operativo puede terminar el proceso de base de datos y provocar un reinicio imprevisto. Para evitar estos reinicios, Aurora MySQL incluye capacidades de administración de memoria que supervisan la memoria del sistema y realizan acciones de recuperación automáticas cuando hay poca memoria. Estas acciones ayudan a evitar que la base de datos no esté disponible debido al agotamiento de la memoria.
Los siguientes parámetros controlan este comportamiento:
-
aurora_enable_memory_management: solo disponible en Aurora MySQL 8.4.-
Cuando
ON(valor predeterminado), Aurora administra automáticamente las acciones de recuperación de memoria y el parámetroaurora_oom_responsese ignora. -
Establezca
OFFpara controlar manualmente las acciones de recuperación a través deaurora_oom_response.
-
-
aurora_oom_response: una lista separada por comas de acciones de recuperación. Una cadena vacía deshabilita todas las acciones. Disponible en la versión 3 de Aurora MySQL. También está disponible en Aurora MySQL 8.4, pero solo se tiene en cuenta cuando la opciónaurora_enable_memory_managementse encuentra establecida enOFF.
Acciones de respuesta de OOM
Se pueden incluir las siguientes acciones en aurora_oom_response, ordenadas de las menos a las más agresivas.
| Action | ¿Qué hace? | Notas |
|---|---|---|
print |
Registra las consultas y conexiones que consumen mucha memoria en el registro de errores. No se finaliza ninguna consulta ni conexión. | Disponible en las versiones 3 y 8.4 de Aurora MySQL. |
tune |
Reduce las cachés de tablas internas (table_open_cache, table_definition_cache) para liberar memoria. Los tamaños de las cachés se restauran cuando la memoria vuelve a la normalidad. Las entradas previamente almacenadas en caché no se restauran; las nuevas entradas solo se añaden a medida que las consultas posteriores acceden a ellas. |
Disponible en las versiones 3 y 8.4 de Aurora MySQL. Solo instancias aprovisionadas: no compatibles con Serverless v2. |
tune_buffer_pool |
Reduce el grupo de búferes de InnoDB para liberar memoria. El tamaño del grupo de búferes se restaura cuando la memoria vuelve a la normalidad. Las páginas previamente almacenadas en caché que se expulsaron no se vuelven a cargar automáticamente; las páginas nuevas solo se almacenan en caché cuando las consultas posteriores acceden a ellas. | Solo en la versión 3 de Aurora MySQL (3.06 y versiones posteriores) y la versión 8.4 de Aurora MySQL. Solo se admite en instancias aprovisionadas con dos vCPU. No es compatible con Serverless v2. |
decline |
Rechaza las consultas nuevas con un error cuando hay poca memoria. | Disponible en las versiones 3 y 8.4 de Aurora MySQL. |
kill_query |
Finaliza la ejecución de las consultas de SELECT, empezando por las que consumen más memoria, hasta que la memoria vuelva a la normalidad. No se ven afectados DDL, otro DML ni las transacciones. |
Disponible en las versiones 3 y 8.4 de Aurora MySQL. Mutuamente excluyentes con kill_connect: si ambas opciones se encuentras configuradas, solo se activa kill_connect. |
kill_connect |
Finaliza las conexiones de los usuarios, reduce sus transacciones activas y finaliza las instrucciones de DDL. | Consulte a continuación el comportamiento específico de la versión. |
importante
Debe emparejar tune_buffer_pool con kill_query o kill_connect en el valor del parámetro aurora_oom_response. Sin una de estas opciones, el cambio de tamaño del grupo de búferes no se produce incluso cuando se incluye tune_buffer_pool.
Comportamiento específico de la versión de kill_connect
| Aurora MySQL version | Comportamiento |
|---|---|
| De la versión 3.04 a la versión 3.10 de Aurora MySQL | Finaliza las conexiones de los usuarios para liberar suficiente memoria para que la base de datos se recupere de la presión de memoria. |
| Aurora MySQL 3.11+, Aurora MySQL 8.4 | Finaliza las conexiones de los usuarios para liberar suficiente memoria para que la base de datos se recupere de la presión de memoria. También finaliza cualquier conexión de usuario que intente asignar memoria en situaciones de presión de memoria. |
En Serverless v2, Aurora responde a la presión de la memoria escalando verticalmente primero las ACU para proporcionar memoria adicional. Si la presión de la memoria persiste mientras se realiza el escalado, Aurora puede finalizar las conexiones existentes para recuperar la memoria. La finalización de las conexiones que intentan asignar memoria solo se produce cuando la instancia ha alcanzado el límite máximo de ACU configurado y ya no puede seguir escalando.
Valores predeterminados por versión
Aurora MySQL configura automáticamente aurora_oom_response en función de la versión del motor, el tipo de instancia y la memoria disponible.
En Aurora MySQL 8.4, cuando la opción aurora_enable_memory_management es ON (el valor predeterminado), Aurora administra automáticamente las acciones de recuperación de memoria y no se utiliza el valor aurora_oom_response. Cuando se encuentra establecida en OFF, Aurora usa el valor aurora_oom_response directamente, que está vacío de forma predeterminada, lo que significa que no se realizan acciones de recuperación a menos que las configure de forma explícita. La siguiente tabla de valores predeterminados se aplica únicamente a la versión 3 de Aurora MySQL.
Umbral pequeño de instancia: ≤2 GiB para las versiones 3.04 y 3.05. ≤4 GiB para la versión 3.06 y versiones posteriores.
Umbral grande de instancia: >2 GiB para las versiones 3.04 y 3.05. >4 GiB para la versión 3.06 y versiones posteriores.
| Versión | Tamaño de instancia | Aprovisionada | Serverless v2 |
|---|---|---|---|
| De la versión 3.04 a la versión 3.05 de Aurora MySQL | Small | print,tune | print |
| Large | deshabilitado | deshabilitado | |
| Aurora MySQL 3.06 | Small | print,tune,decline,kill_connect | print |
| Large | deshabilitado | deshabilitado | |
| Aurora MySQL 3.07 | Small | print,tune,decline,kill_connect | print |
| Large | print | print | |
| Aurora MySQL 3.08 | Small | print,tune,tune_buffer_pool,decline,kill_connect | print |
| Large | print | print | |
| De la versión 3.09 a la versión 3.10 de Aurora MySQL | Small | print,tune,tune_buffer_pool,decline,kill_connect | print |
| Large | print,decline,kill_connect | print,decline,kill_connect | |
| Aurora MySQL 3.11+ | Small | print,tune,tune_buffer_pool,decline,kill_connect | print,decline,kill_connect |
| Large | print,decline,kill_connect | print,decline,kill_connect |
Aurora Serverless v2
Las acciones tune y tune_buffer_pool no se admiten en Aurora Serverless v2. Todas las demás acciones funcionan igual que en las instancias aprovisionadas.
Los umbrales de memoria se ajustan de forma dinámica a medida que la instancia escala sus ACU. En la columna Serverless 2 de la tabla de valores predeterminados anterior se muestran los valores predeterminados efectivos de cada versión.
Supervisión
Puede supervisar la actividad de evasión de OOM mediante los siguientes métodos.
Registro de errores
Cuando se realizan acciones de recuperación de memoria, Aurora MySQL escribe mensajes en el registro de errores de la base de datos. El prefijo del mensaje varía según la versión y puede cambiar en futuras versiones:
Versión 3 de Aurora MySQL: los mensajes llevan el prefijo
OOM crash avoidance:.Versión 8.4 de Aurora MySQL: los mensajes llevan el prefijo
Aurora memory management:.
Estos mensajes incluyen:
La presión de la memoria detectada y las notificaciones recuperadas con la memoria total y disponible
Detalles de las consultas o conexiones finalizadas para recuperar la memoria
Consultas candidatas identificadas por la acción
print
Para ver el registro de errores, consulte Registros de errores de Aurora MySQL.
Métricas de Amazon CloudWatch
Las siguientes métricas de CloudWatch realizan un seguimiento de la actividad de evasión de OOM de la instancia.
| Métrica | Descripción | Disponible en | Unidad |
|---|---|---|---|
AuroraMemoryHealthState | Indica el estado de la memoria. 0 significa buen estado (sin presión de memoria), 5 significa presión de memoria moderada y 10 significa presión de memoria crucial. | Aurora MySQL 3.06.1+, Aurora MySQL 8.4 | Calibre |
AuroraMemoryNumDeclinedSqlTotal | Número incremental de consultas rechazadas como parte de las estrategias para evitar el problema de memoria insuficiente (OOM). | Aurora MySQL 3.06.1+, Aurora MySQL 8.4 | Recuento |
AuroraMemoryNumKillConnTotal | Número incremental de conexiones cerradas como parte de las estrategias para evitar el problema de memoria insuficiente (OOM). | Aurora MySQL 3.06.1+, Aurora MySQL 8.4 | Recuento |
AuroraMemoryNumKillQueryTotal | Número incremental de consultas finalizadas como parte de las estrategias para evitar el problema de memoria insuficiente (OOM). | Aurora MySQL 3.06.1+, Aurora MySQL 8.4 | Recuento |
AuroraMillisecondsSpentInOomRecovery | El tiempo transcurrido desde que el estado de la memoria se situara por debajo del estado normal. | Aurora MySQL 3.08.0+, Aurora MySQL 8.4 | Milisegundos |
AuroraNumOomRecoverySuccessful | El número de veces que se ha restablecido el estado normal de la memoria. | Aurora MySQL 3.08.0+, Aurora MySQL 8.4 | Recuento |
AuroraNumOomRecoveryTriggered | El número de veces que el estado de la memoria se ha situado por debajo del estado normal. | Aurora MySQL 3.08.0+, Aurora MySQL 8.4 | Recuento |
Las siguientes métricas generales de CloudWatch también son útiles para supervisar la presión de la memoria:
| Métrica | Descripción | Unidad |
|---|---|---|
FreeableMemory | La cantidad de memoria disponible. Indica el valor MemAvailable de /proc/meminfo. | Bytes |
SwapUsage | La cantidad de espacio de intercambio utilizada. | Bytes |
Para ver la lista completa de las métricas de instancia de Aurora MySQL, consulte Métricas de nivel de instancia para Amazon Aurora.
Variables de estado globales
Las siguientes variables de estado proporcionan información sobre el estado de OOM. Disponible en la versión 3.06.0 de Aurora MySQL y versiones posteriores.
| Variable | Descripción |
|---|---|
Aurora_oom_response | Las acciones de respuesta de OOM actualmente activas para esta instancia de base de datos. |
aurora_oom_avoidance_recovery_state | Si la recuperación de OOM es ACTIVE o INACTIVE. |
aurora_oom_status | Estado actual de la memoria de la base de datos: buen estado (sin presión de memoria), presión de memoria moderada o presión de memoria crucial. Disponible únicamente en la versión 3. |
Para realizar una consulta: SHOW GLOBAL STATUS LIKE 'aurora_oom%';
Para ver la lista completa de variables de estado global de Aurora MySQL, consulte Variables de estado globales de Aurora MySQL.
Información de rendimiento
Si la opción Información de rendimiento se encuentra habilitada, puede usar métricas de memoria del sistema operativo para supervisar la presión de la memoria y detectar eventos OOM. Las siguientes métricas están disponibles en los contadores os.memory y os.swap:
| Métrica | Descripción |
|---|---|
os.memory.outOfMemoryKillCount | El número de terminaciones de OOM durante el último intervalo de recopilación. Un valor distinto de cero indica que el sistema operativo ha finalizado un proceso debido al agotamiento de la memoria, lo que suele provocar el reinicio de la base de datos. |
os.memory.total | La cantidad total de memoria, en kilobytes. |
os.memory.free | La cantidad de memoria no asignada, en kilobytes. |
os.memory.active | La cantidad de memoria asignada, en kilobytes. |
os.memory.cached | La cantidad de memoria utilizada para almacenar en la caché las E/S del sistema de archivos, en kilobytes. |
os.memory.dirty | La cantidad de páginas de memoria modificadas, pero aún no escritas en el almacenamiento, en kilobytes. |
os.memory.inactive | La cantidad de páginas de memoria utilizadas con menor frecuencia, en kilobytes. |
os.memory.db.residentSetSize | La cantidad de memoria utilizada por el proceso de base de datos (sin incluir la memoria compartida), en bytes. |
os.memory.db.cache | La cantidad de memoria utilizada por el proceso de base de datos para la caché de páginas, en bytes. |
os.memory.db.swap | La cantidad de memoria de intercambio utilizada por el proceso de base de datos, en bytes. |
os.swap.in | La cantidad de memoria intercambiada desde disco, en kilobytes. |
os.swap.out | La cantidad de memoria intercambiada al disco, en kilobytes. |
Puede supervisar os.memory.outOfMemoryKillCount para detectar cuándo el sistema operativo interrumpió el proceso de la base de datos por falta de memoria. Para ver la lista completa de contadores del sistema operativo, consulte Métricas del sistema operativo de Información de rendimiento.
Performance Schema
Si la opción performance_schema se encuentra habilitada, puede usar tablas de resumen de memoria para identificar qué componentes y conexiones consumen más memoria. Para obtener más información, consulte Solución de problemas de uso de memoria de bases de datos Aurora MySQL.