Optimizar el uso elevado de memoria en las instancias

Es común que las instancias consuman mucha memoria o presenten problemas de falta de memoria (OOM). Una instancia de base de datos que se ejecuta con un alto consumo de memoria suele causar problemas de rendimiento, bloqueos o incluso tiempo de inactividad de la base de datos.

Algunos bloques de memoria de MySQL se utilizan globalmente. Esto significa que todas las cargas de trabajo de consultas comparten ubicaciones de memoria, están ocupadas constantemente y se liberan solo cuando se detiene el proceso de MySQL. Algunos bloques de memoria se basan en sesiones, lo que significa que, al cerrar una sesión, la memoria utilizada por ella también se libera al sistema.

Cuando una instancia de Cloud SQL para MySQL utiliza mucha memoria, Cloud SQL recomienda identificar la consulta o el proceso que consume mucha memoria y liberarlo. El consumo de memoria de MySQL se divide en tres partes principales:

  • Consumo de memoria de subprocesos y procesos
  • Consumo de memoria intermedia
  • Consumo de memoria caché

Consumo de memoria de subprocesos y procesos

Cada sesión de usuario consume memoria según las consultas, los búferes o la caché que utiliza, y se controla mediante los parámetros de sesión de MySQL. Los principales parámetros incluyen:

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

Si hay N número de consultas ejecutándose en un momento particular, entonces cada consulta consume memoria de acuerdo con estos parámetros durante la sesión.

Consumo de memoria intermedia

Esta parte de la memoria es común para todas las consultas y está controlada por parámetros como Innodb_buffer_pool_size , Innodb_log_buffer_size y key_buffer_size .

Consumo de memoria caché

La memoria caché incluye una caché de consultas, que se utiliza para guardar las consultas y sus resultados, lo que permite una recuperación más rápida de los datos de las mismas consultas subsiguientes. También incluye la caché binlog , que almacena los cambios realizados en el registro binario durante la ejecución de la transacción. Esta caché se controla mediante binlog_cache_size .

Otro consumo de memoria

La memoria también se utiliza en operaciones de unión y ordenación. Si sus consultas utilizan operaciones de unión o ordenación, estas utilizan memoria según join_buffer_size y sort_buffer_size .

Además, si habilita el esquema de rendimiento, este consume memoria. Para comprobar el uso de memoria según el esquema de rendimiento, utilice la siguiente consulta:

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

MySQL cuenta con numerosas herramientas que puedes configurar para monitorizar el uso de memoria mediante el esquema de rendimiento. Para obtener más información, consulta la documentación de MySQL .

El parámetro relacionado con MyISAM para la inserción masiva de datos es bulk_insert_buffer_size .

Para obtener más información sobre cómo MySQL utiliza la memoria, consulte la documentación de MySQL .

Recomendaciones

Utilice el Explorador de métricas para identificar el uso de memoria

Puede revisar el uso de memoria de una instancia con la métrica database/memory/components.usage en el Explorador de métricas .

Si tiene menos del 5 % de memoria en database/memory/components.cache y database/memory/components.free combinados, el riesgo de un evento OOM es alto. Para supervisar el uso de memoria y prevenir eventos OOM, le recomendamos configurar una política de alertas con un umbral de métrica del 95 % o más en database/memory/components.usage .

La siguiente tabla muestra la relación entre la memoria de su instancia y el umbral de alerta recomendado:

Memoria de instancia Umbral de alerta recomendado
Hasta 100 GB 95%
100 GB a 200 GB 96%
200 GB a 300 GB 97%
Más de 300 GB 98%

Calcular el consumo de memoria

Calcule el uso máximo de memoria de su base de datos MySQL para seleccionar el tipo de instancia adecuado. Utilice la siguiente fórmula:

Uso máximo de memoria MySQL = innodb_buffer_pool_size + innodb_additional_mem_pool_size innodb + innodb_log_buffer_size + tmp_table_size + tamaño del búfer key_buffer_size + (( tamaño del búfer read_buffer_size + tamaño del read_rnd_buffer_size + sort_buffer_size + tamaño join_buffer_size ) x max_connections )

Estos son los parámetros utilizados en la fórmula:

  • innodb_buffer_pool_size : el tamaño en bytes del grupo de búferes, el área de memoria donde InnoDB almacena en caché los datos de tablas e índices.
  • innodb_additional_mem_pool_size : el tamaño en bytes de un grupo de memoria que InnoDB utiliza para almacenar información del diccionario de datos y otras estructuras de datos internas.
  • innodb_log_buffer_size : el tamaño en bytes del búfer que InnoDB utiliza para escribir en los archivos de registro en el disco.
  • tmp_table_size : el tamaño máximo de las tablas temporales internas en memoria creadas por el motor de almacenamiento MEMORY y, a partir de MySQL 8.0.28, el motor de almacenamiento TempTable.
  • Key_buffer_size : El tamaño del búfer utilizado para los bloques de índice. Los bloques de índice de las tablas MyISAM se almacenan en búfer y son compartidos por todos los subprocesos.
  • Read_buffer_size : cada hilo que realiza un escaneo secuencial de una tabla MyISAM asigna un búfer de este tamaño (en bytes) para cada tabla que escanea.
  • Read_rnd_buffer_size : esta variable se utiliza para lecturas de tablas MyISAM, para cualquier motor de almacenamiento y para la optimización de lectura de rango múltiple.
  • Sort_buffer_size : cada sesión que debe realizar una clasificación asigna un búfer de este tamaño. sort_buffer_size no es específico de ningún motor de almacenamiento y se aplica de manera general para la optimización.
  • Join_buffer_size : el tamaño mínimo del búfer que se utiliza para escaneos de índices simples, escaneos de índices de rango y uniones que no usan índices y, por lo tanto, realizan escaneos de tablas completas.
  • Max_connections : el número máximo permitido de conexiones de cliente simultáneas.

Solucionar problemas de alto consumo de memoria

  • Ejecute SHOW PROCESSLIST para ver las consultas en curso que consumen memoria. Muestra todos los subprocesos conectados y sus sentencias SQL en ejecución, e intenta optimizarlos. Preste atención a las columnas de estado y duración.

    mysql> SHOW [FULL] PROCESSLIST;
    
    
  • Marque SHOW ENGINE INNODB STATUS en la sección BUFFER POOL AND MEMORY para ver el uso actual del buffer pool y de la memoria, lo que puede ayudarle a configurar el tamaño de su buffer pool.

    mysql> SHOW ENGINE INNODB STATUS \G
    ----------------------
    BUFFER POOL AND MEMORY
    ----------------------
    Total memory allocated 398063986; in additional pool allocated 0
    Dictionary memory allocated 12056
    Buffer pool size 89129
    Free buffers 45671
    Database pages 1367
    Old database pages 0
    Modified db pages 0
    
  • Utilice el comando SHOW variables de MySQL para comprobar los valores del contador, que le brindan información como la cantidad de tablas temporales, la cantidad de subprocesos, la cantidad de cachés de tablas, páginas sucias, tablas abiertas y el uso del grupo de búfer.

    mysql> SHOW variables like 'VARIABLE_NAME'
    

Aplicar cambios

Después de analizar el uso de memoria de los diferentes componentes, configure el indicador correspondiente en su base de datos MySQL. Para cambiar el indicador en Cloud SQL para una instancia MySQL, puede usar Google Cloud Consola o CLI de gcloud . Para cambiar el valor del indicador usando Google Cloud consola, edite la sección Banderas , seleccione la bandera e ingrese el nuevo valor.

Por último, si el uso de memoria sigue siendo alto y cree que las consultas en ejecución y los valores de los indicadores están optimizados, considere aumentar el tamaño de la instancia para evitar OOM.

¿Qué sigue?