¿Cómo soluciono el uso elevado de la CPU en mi instancia de Amazon RDS para MySQL o Amazon Aurora MySQL?

10 minutos de lectura
0

Estoy experimentando un uso elevado de la CPU en mi Amazon Relational Database Service (Amazon RDS) para instancias de bases de datos de MySQL o en mis instancias de la edición de Amazon Aurora compatible con MySQL. ¿Cómo puedo solucionar problemas y resolver el uso elevado de la CPU?

Breve descripción

El aumento del uso de la CPU puede deberse a varios factores, como las grandes cargas de trabajo iniciadas por los usuarios, las múltiples consultas simultáneas o las transacciones de larga duración.

Para identificar el origen del uso de la CPU en su instancia de Amazon RDS para MySQL, revise los siguientes enfoques:

  • Supervisión mejorada
  • Información de rendimiento
  • Consultas que detectan la causa del uso de la CPU en la carga de trabajo
  • Registros con supervisión activada

Tras identificar la fuente, puede analizar y optimizar la carga de trabajo para reducir el uso de la CPU.

Solución

Uso de la supervisión mejorada

La supervisión mejorada proporciona una vista a nivel del sistema operativo (SO). Esta vista puede ayudar a identificar la causa de una carga elevada de la CPU con mayor nivel de detalle. Por ejemplo, puede revisar el promedio de carga, la distribución de la CPU (System% o Nice%) y la lista de procesos del sistema operativo.

Con la supervisión mejorada, puede comprobar los datos de loadAverageMinute en intervalos de 1, 5 y 15 minutos. Un promedio de carga superior al número de vCPU indica que la instancia está sometida a una carga elevada. Además, si el promedio de carga es inferior al número de vCPU de la clase de instancia de base de datos, es posible que la limitación de la CPU no provoque la latencia de la aplicación. Al diagnosticar la causa de la utilización de la CPU, compruebe el promedio de carga para evitar falsos positivos.

Por ejemplo, si tiene una instancia de base de datos que usa una clase de instancia db.m5.2xlarge con 3000 E/S por segundo aprovisionadas que alcanza el límite de CPU, puede revisar las siguientes métricas de ejemplo para identificar la causa principal del uso elevado de la CPU. En el siguiente ejemplo, la clase de instancia tiene ocho vCPU asociadas. Para el mismo promedio de carga, superar 170 indica que la máquina está sometida a una carga pesada durante el período medido:

Minuto y promedio de carga

Quince170,25
Cinco391,31
Uno596,74

Utilización de la CPU

Usuario (%)0,71
Sistema (%)4,9
Nice (%)93,92
Total (%)99,97

Nota: Amazon RDS otorga a su carga de trabajo una prioridad más alta que a otras tareas que se ejecutan en la instancia de base de datos. Para priorizar estas tareas, las tareas de carga de trabajo tienen un valor Nice más alto. Como resultado, en la supervisión mejorada, Nice% representa la cantidad de CPU que utiliza su carga de trabajo en la base de datos.

Tras activar la supervisión mejorada, también puede consultar la lista de procesos del sistema operativo asociada a la instancia de base de datos. La supervisión mejorada muestra un máximo de 100 procesos. Esto puede ayudar a identificar qué procesos tienen el mayor impacto en el rendimiento en función del uso de la CPU y la memoria.

En la sección de lista de procesos del sistema operativo (SO) de supervisión mejorada, revise los procesos del sistema operativo y los procesos de RDS. Confirme el porcentaje de utilización de la CPU de un proceso de mysqld o Aurora. Estas métricas pueden ayudar a confirmar si el aumento en la utilización de la CPU se debe a los procesos del sistema operativo o de RDS. O bien, puede usar estas métricas para supervisar cualquier aumento en el uso de la CPU provocado por mysqld o Aurora. También puede ver la división de la utilización de la CPU revisando las métricas de cpuUtilization. Para obtener más información, consulte Supervisión de las métricas del sistema operativo con Supervisión mejorada.

Nota: Si activa Performance Schema, puede asignar el ID del subproceso del sistema operativo al ID del proceso de su base de datos. Para obtener más información, consulte ¿Por qué mi instancia de base de datos de Amazon RDS utiliza memoria de intercambio cuando tengo memoria suficiente?

Uso de información de rendimiento

Puede usar la información de rendimiento para identificar las consultas exactas que se están ejecutando en la instancia y que provocan un uso elevado de la CPU. En primer lugar, active la información de rendimiento para MySQL. A continuación, puede usar la información de rendimiento para optimizar su carga de trabajo. Asegúrese de consultar con su administrador de bases de datos.

Para ver los motores de bases de datos que puede usar con la información de rendimiento, consulte Monitoreo de la carga de base de datos con Performance Insights en Amazon RDS.

Uso de consultas para detectar la causa del uso de la CPU en la carga de trabajo

Antes de poder optimizar la carga de trabajo, debe identificar la consulta problemática. Puede ejecutar las siguientes consultas mientras se produce el problema del uso excesivo de la CPU para identificar la causa principal del uso de la CPU. A continuación, optimice la carga de trabajo para reducir el uso de la CPU.

El comando SHOW PROCESSLIST muestra los subprocesos que se están ejecutando actualmente en su instancia de MySQL. A veces, el mismo conjunto de instrucciones puede seguir ejecutándose sin completarse. Cuando esto ocurre, las instrucciones subsiguientes deben esperar a que termine la primera serie de instrucciones. Esto se debe a que el bloqueo a nivel de fila de InnoDB puede estar actualizando las mismas filas. Para obtener más información, consulte SHOW PROCESSLIST statement en el sitio web de MySQL.

SHOW FULL PROCESSLIST;

Nota: Ejecute la consulta SHOW PROCESSLIST como usuario principal del sistema. Si no es el usuario principal del sistema, debe tener privilegios de administración del servidor MySQL PROCESS para ver todos los subprocesos que se ejecutan en una instancia de MySQL. Sin privilegios de administrador, SHOW PROCESSLIST muestra solo los subprocesos asociados a la cuenta de MySQL que está utilizando.

La tabla INNODB_TRX proporciona información sobre todas las transacciones de InnoDB que se están ejecutando actualmente y que no son transacciones de solo lectura.

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

La tabla INNODB_LOCKS proporciona información sobre los bloqueos que una transacción de InnoDB ha solicitado pero no ha recibido.

Para MySQL 5.7 o anterior:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

Para MySQL 8.0:

SELECT * FROM performance_schema.data_locks;

La tabla INNODB_LOCK_WAITS proporciona una o más filas para cada transacción de InnoDB bloqueada.

Para MySQL 5.7 o anterior:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

Para MySQL 8.0:

SELECT * FROM performance_schema.data_lock_waits;

Puede ejecutar una consulta similar a la siguiente para ver las transacciones que están en espera y las transacciones que bloquean las transacciones en espera. Para obtener más información, consulte Using InnoDB transaction and locking information en el sitio web de MySQL.

Para MySQL 5.7 o anterior:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_trx_id;

Para MySQL 8.0:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_engine_transaction_id;

La consulta SHOW ENGINE INNODB STATUS proporciona información del monitor de InnoDB estándar sobre el estado del motor de almacenamiento InnoDB. Para obtener más información, consulte SHOW ENGINE statement en el sitio web de MySQL.

SHOW ENGINE INNODB STATUS;

La consulta SHOW\ [GLOBAL | SESSION] STATUS proporciona información sobre el estado del servidor. Para obtener más información, consulte SHOW STATUS statement en el sitio web de MySQL.

SHOW GLOBAL STATUS;

Nota: Estas consultas se probaron en Aurora 2.x (MySQL 5.7); Aurora 1. x (MySQL 5.6) y MariaDB 10.x. Además, la tabla INFORMATION_SCHEMA.INNODB_LOCKS ya no es compatible a partir de MySQL 5.7.14 y se ha eliminado en MySQL 8.0. La tabla performance_schema.data_locks reemplaza a la tabla INFORMATION_SCHEMA.INNODB_LOCKS. Para obtener más información, consulte The data_locks table en el sitio web de MySQL.

Análisis de los registros y activación de la supervisión

Cuando analice los registros o desee activar la supervisión en Amazon RDS para MySQL, tenga en cuenta los siguientes enfoques:

  • Analice el registro de consultas generales de MySQL para ver qué está haciendo mysqld en un momento específico. También puede ver las consultas que se ejecutan en su instancia en un momento específico, incluida la información sobre cuándo se conectan o desconectan los clientes. Para obtener más información, consulte The General Query Log en el sitio web de MySQL.
    Nota: Cuando se activa el registro de consultas generales durante períodos prolongados, los registros consumen almacenamiento y pueden aumentar la sobrecarga de rendimiento.
  • Analice los registros de consultas lentas de MySQL para encontrar consultas que tarden más en ejecutarse que los segundos que estableció para long_query_time. También puede revisar la carga de trabajo y analizar las consultas para mejorar el rendimiento y el consumo de memoria. Para obtener más información, consulte The Slow Query Log en el sitio web de MySQL. Consejo: Cuando utilice el registro de consultas lentas o el registro de consultas generales, defina el parámetro log_output en FILE.
  • Utilice el complemento de auditoría de MariaDB para auditar la actividad de la base de datos. Por ejemplo, puede realizar un seguimiento de los usuarios que inician sesión en la base de datos o de las consultas que se ejecutan en la base de datos. Para obtener más información, consulte Compatibilidad con el complemento de auditoría de MariaDB para MySQL.
  • Si usa Aurora para MySQL, también puede usar la auditoría avanzada. La auditoría puede brindarle más control sobre los tipos de consultas que desea registrar. De este modo, se reduce la sobrecarga de registro.
  • Utilice el parámetro innodb_print_all_deadlocks para comprobar si hay interbloqueos y bloqueos de recursos. Puede usar este parámetro para registrar información sobre los interbloqueos en las transacciones de los usuarios de InnoDB en el registro de errores de MySQL. Para obtener más información, consulte innodb_print_all_deadlocks en el sitio web de MySQL.

Análisis y optimización de la carga de trabajo elevada de la CPU

Tras identificar la consulta que aumenta el uso de la CPU, optimice la carga de trabajo para reducir el consumo de la CPU.

Si ve una consulta que no es necesaria para la carga de trabajo, puede terminar la conexión con el siguiente comando:

CALL mysql.rds_kill(processID);

Para buscar el ID de proceso de una consulta, ejecute el comando SHOW FULL PROCESSLIST.

Si no desea finalizar la consulta, optimícela con EXPLAIN. El comando EXPLAIN muestra los pasos individuales necesarios para ejecutar una consulta. Para obtener más información, consulte Optimizing Queries with EXPLAIN en el sitio web de MySQL.

Para revisar los detalles del perfil, active PROFILING. El comando PROFILING puede indicar el uso de recursos para las instrucciones que se ejecutan durante la sesión actual. Para obtener más información, consulte SHOW PROFILE statement en el sitio web de MySQL.

Para actualizar las estadísticas de cualquier tabla, utilice ANALYZE TABLE. El comando ANALYZE TABLE puede ayudar al optimizador a elegir un plan apropiado para ejecutar la consulta. Para obtener más información, consulte ANALYZE TABLE statement en el sitio web de MySQL.


Información relacionada

Amazon RDS para MySQL

Amazon RDS para MariaDB

How do I activate and monitor logs for an Amazon RDS MySQL DB instance?

Tuning Amazon RDS for MySQL with Performance Insights