¿Cómo soluciono el uso elevado de la CPU en mi instancia de base de datos de Amazon RDS para MySQL o de Aurora compatible con MySQL?
Estoy experimentando un uso elevado de la CPU en mis instancias de bases de datos de Amazon Relational Database Service (Amazon RDS) para MySQL o en mis instancias de Amazon Aurora compatibles con MySQL.
Descripción corta
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 la instancia de base de datos, consulta los siguientes recursos:
- 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 causa, analiza y optimiza la carga de trabajo para reducir el uso de la CPU.
Resolución
Uso de Supervisión mejorada
Supervisión mejorada proporciona una vista a nivel sistema operativo para identificar la causa de una carga elevada de la CPU. Por ejemplo, puedes revisar el promedio de carga, la lista de procesos del sistema operativo y la distribución de la CPU :System (%) o Nice (%).
Usa Supervisión mejorada para 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. 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, comprueba el promedio de carga para evitar falsos positivos.
Por ejemplo, supongamos que tienes una instancia de base de datos que utiliza una clase de instancia db.m5.2xlarge con 3000 E/S por segundo aprovisionadas que alcanza el límite de la CPU. La clase de instancia tiene 8 vCPU asociadas. Un promedio de carga superior a 170 indica que la máquina está sometida a una carga elevada durante el período de tiempo medido:
Minuto y promedio de carga
Quince | 170,25 |
Cinco | 391,31 |
Uno | 596,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 Supervisión mejorada, Nice% representa la cantidad de CPU que utiliza tu carga de trabajo en la base de datos.
Tras activar Supervisión mejorada, consulta la lista de procesos del sistema operativo asociada a la instancia de base de datos. 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, revisa los procesos del sistema operativo y los procesos de RDS. Confirma 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 el uso de la CPU se debe a los procesos del sistema operativo o de RDS. O bien, usa estas métricas para supervisar cualquier aumento en el uso de la CPU provocado por mysqld o aurora. Para ver la división del uso de la CPU, revisa las métricas de cpuUtilization. Para obtener más información, consulta Supervisión de las métricas del sistema operativo con Supervisión mejorada.
Nota: Si activas Esquema de rendimiento, puedes asignar el ID del subproceso del sistema operativo al ID del proceso de la base de datos. Para obtener más información, consulta ¿Por qué mi instancia de base de datos de Amazon RDS utiliza memoria de intercambio cuando tengo memoria suficiente?
Información de rendimiento
Puedes usar Información de rendimiento para identificar las consultas que se están procesando en la instancia de base de datos y que provocan un uso elevado de la CPU. En primer lugar, activa Información de rendimiento para MySQL. A continuación, usa Información de rendimiento para optimizar tu carga de trabajo. Si es necesario, colabora con el administrador de la base de datos para identificar la causa raíz del problema.
Para ver los motores de bases de datos que puedes usar con Información de rendimiento, consulta El motor de base de datos de Amazon RDS, la región y la clase de instancia son compatibles con Información de rendimiento.
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, debeS identificar la consulta problemática. Para identificar la causa raíz del uso de la CPU, usa las siguientes consultas cuando se produzca un problema de CPU alta.
Para ver los subprocesos que se están procesando en tu instancia de MySQL, usa el comando SHOW FULL PROCESSLIST:
SHOW FULL PROCESSLIST;
Nota: Usa la consulta SHOW PROCESSLIST como usuario principal del sistema. Si no eres el usuario principal del sistema, debse tener permisos de administración del servidor MySQL PROCESS para ver todos los subprocesos que se procesan en una instancia de MySQL. Sin permisos de administrador, SHOW PROCESSLIST muestra solo los subprocesos asociados a la cuenta de MySQL que está utilizando.
A veces, el mismo conjunto de instrucciones puede seguir procesá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 de la fila de InnoDB puede estar actualizando las mismas filas. Para obtener más información, consulta 13.7.5.29 SHOW PROCESSLIST statement en el sitio web de MySQL.
La tabla INNODB_TRX proporciona información sobre todas las transacciones de InnoDB que se están procesando y que no son transacciones de solo lectura. Para ver la tabla INNODB_TRX, usa la siguiente consulta:
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 ver la tabla INNODB_LOCKS, usa la siguiente consulta:
-
MySQL 5.7 o anterior:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-
MySQL 8.0:
SELECT * FROM performance_schema.data_locks;
Para obtener más información, consulta 24.4.14 The INFORMATION_SCHEMA.INNODB_LOCKS table y 10.13.1 The data_locks table.
La tabla INNODB_LOCK_WAITS proporciona una o más filas para cada transacción de InnoDB bloqueada. Para ver la tabla INNODB_LOCKS_WAITS, usa la siguiente consulta:
-
MySQL 5.7 o anterior:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
-
MySQL 8.0:
SELECT * FROM performance_schema.data_lock_waits;
Puedes usar una consulta similar a la siguiente para ver las transacciones que están en espera y las transacciones que bloquean las transacciones en espera:
-
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;
-
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;
Para obtener más información sobre cómo interpretar el resultado de esta consulta, consulta 17.15.2.1 Using InnoDB transaction and locking information en el sitio web de MySQL.
Para obtener información del monitor estándar de InnoDB sobre el estado del motor de almacenamiento InnoDB, usa la siguiente consulta:
SHOW ENGINE INNODB STATUS;
Para obtener más información, consulta 13.7.5.15 SHOW ENGINE statement en el sitio web de MySQL.
Para ver el estado del servidor, usa el siguiente comando.
SHOW GLOBAL STATUS;
Para obtener más información, consulta 15.7.7.37 SHOW STATUS statement en el sitio web de MySQL.
Análisis de los registros y activación de la supervisión
Analiza el registro de consultas generales de MySQL para ver qué está haciendo mysqld en un momento específico. También puedes ver las consultas que se procesan en tu instancia en un momento específico, como la información sobre cuándo se conectan o desconectan los clientes. Para obtener más información, consulta 7.4.3 The general query log en el sitio web de MySQL.
Importante: 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 puedes revisar la carga de trabajo y analizar las consultas para mejorar el rendimiento y el consumo de memoria. Para obtener más información, consulta 7.4.5 The slow query log en el sitio web de MySQL.
Nota: Cuando utilices el registro de consultas lentas o el registro de consultas generales, se recomienda establecer el parámetro log_output en FILE.
Utiliza el complemento de auditoría de MariaDB para auditar la actividad de la base de datos. Por ejemplo, realiza un seguimiento de los usuarios que inician sesión en la base de datos o de las consultas que se procesan en la base de datos.
Si usas Aurora MySQL, también puedes usar la auditoría avanzada. La auditoría avanzada proporciona un mayor control sobre los tipos de consultas que deseas registrar y reduce la sobrecarga de registro.
Utiliza 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, consulta 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, optimiza la carga de trabajo para reducir el consumo de la CPU.
Si ves una consulta que no es necesaria para la carga de trabajo, puedes terminar la conexión con el siguiente comando:
CALL mysql.rds_kill(processID);
Para buscar el ID de proceso de una consulta, usa el comando SHOW FULL PROCESSLIST.
Si no quieres finalizar la consulta, optimízala con EXPLAIN. EXPLAIN muestra los pasos individuales que se deben seguir cuando se procesa una consulta. Para obtener más información, consulta 10.8.1 Optimizing queries with EXPLAIN en el sitio web de MySQL.
Para revisar los detalles del perfil, activa el perfilado. El comando SHOW PROFILE indica el uso de recursos de las instrucciones que se procesan durante la sesión actual. Para obtener más información, consulta 15.7.7.30 SHOW PROFILE statement en el sitio web de MySQL.
Para ver y optimizar las estadísticas de la tabla, utiliza la consulta ANALYZE TABLE. Para obtener más información, consulta 15.7.3.1 ANALYZE TABLE statement en el sitio web de MySQL.
Información relacionada
Vídeos relacionados
Contenido relevante
- preguntada hace un meslg...
- preguntada hace un meslg...
- preguntada hace 5 díaslg...
- preguntada hace un meslg...
- Como solucionar el error: Supplied Policy document is breaching Cloudwatch Logs policy length limit.Respuesta aceptadapreguntada hace 12 díaslg...
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace 2 años