Cuando el número de conexiones a una instancia de RDS for MySQL alcanza su máximo, todos los clientes —incluido Data Management (DMS) y otras herramientas— reciben el error ERROR 1040 (HY000): Too many connections. Este tema describe cómo diagnosticar la causa raíz y resolver el problema.
Diagnosticar el problema
Ejecute las siguientes consultas para comprobar el estado actual de las conexiones:
-- Check the configured maximum connections
SELECT @@max_connections;
-- Check the number of currently connected clients
SHOW STATUS WHERE `variable_name` = 'Threads_connected';
Si Threads_connected es igual o cercano a max_connections, las conexiones están agotadas.
Para identificar si el problema se debe a conexiones inactivas o activas, vaya a la página de Monitoring and Alerts en la consola de ApsaraDB RDS y revise la métrica de Session. Consulte el valor de mysql.active_session para ver cuántas sesiones están activas en comparación con las inactivas.
Si la mayoría de las sesiones están inactivas, consulte Resolver problemas causados por demasiadas conexiones inactivas.
Si la mayoría de las sesiones están activas, consulte Resolver problemas causados por demasiadas conexiones activas.
Resolver problemas causados por demasiadas conexiones inactivas
MySQL utiliza un hilo por cada conexión. Incluso las conexiones inactivas mantienen un hilo dedicado en el proceso de MySQL, lo que consume memoria y aumenta la sobrecarga por cambio de contexto. Una gran cantidad de conexiones inactivas puede agotar el límite de conexiones sin que exista ninguna carga de trabajo activa.
Las causas comunes de un exceso de conexiones inactivas incluyen:
Aplicaciones con conexiones persistentes sin pool de conexiones: Por ejemplo, una aplicación Java que usa conexiones persistentes pero no tiene configurado un pool de conexiones. Si se especifica un número inicial alto de conexiones al iniciar, la aplicación abre muchas conexiones inactivas hacia la instancia de RDS de inmediato.
Aplicaciones con conexiones de corta duración que no cierran las conexiones: Por ejemplo, una aplicación PHP que usa conexiones efímeras pero no las cierra explícitamente después de completar las consultas.
Paso 1: Finalizar las sesiones inactivas de inmediato
Finalice las sesiones inactivas mediante uno de los siguientes métodos:
Consola de ApsaraDB RDS: Vaya a la página de Session y utilice la gestión de sesiones para finalizar las sesiones inactivas.
DMS: Utilice la función de gestión de sesiones en DMS para identificar y finalizar las sesiones inactivas.
CLI de MySQL: Ejecute
kill <session_id>para finalizar una sesión específica.
Paso 2: Reducir el tiempo de espera de conexiones inactivas
La instancia de RDS finaliza automáticamente las conexiones inactivas después de un período de tiempo de espera configurado:
|
Parámetro |
Valor predeterminado |
Descripción |
|
|
86,400 segundos (24 horas) |
Tiempo de espera para conexiones en modo no interactivo |
|
|
7,200 segundos (2 horas) |
Tiempo de espera para conexiones en modo interactivo |
Los valores predeterminados son altos. Reducirlos hace que la instancia libere antes las conexiones inactivas. Para cambiar estos parámetros, vaya a la página de Parameters en la consola de ApsaraDB RDS.
Los cambios enwait_timeoutyinteractive_timeoutsolo se aplican a las nuevas conexiones establecidas después del cambio. Las conexiones existentes conservan sus valores originales de tiempo de espera.
En la mayoría de los casos, las aplicaciones se conectan a las instancias de RDS en modo no interactivo. Si desea determinar el modo de conexión que utiliza su aplicación, revise su configuración de conexión. Para aplicaciones PHP, especifique la constante MYSQL_CLIENT_INTERACTIVE en la función mysql_connect() para habilitar el modo interactivo.
Paso 3: Corregir fugas de conexiones en la aplicación
Las conexiones inactivas suelen acumularse porque la aplicación no cierra explícitamente las conexiones después de completar las consultas. Por ejemplo, las aplicaciones PHP que usan conexiones de corta duración a veces omiten el paso de cierre de conexión, lo que deja las conexiones abiertas hasta que expiran.
Revise el código de su aplicación para asegurarse de que las conexiones se cierren explícitamente después de cada consulta u operación.
Resolver problemas causados por demasiadas conexiones activas
Una gran cantidad de conexiones activas suele indicar un cuello de botella en el rendimiento que provoca que las consultas se acumulen en la cola. Las causas comunes incluyen:
Alto uso de CPU
Consultas lentas
Esperas de bloqueo de InnoDB o esperas de bloqueo de metadatos
Alto uso de IOPS
Identifique el cuello de botella subyacente y abórdelo directamente:
Si el problema se debe a esperas de bloqueo de InnoDB, consulte ¿Qué hago si se producen esperas de bloqueo de fila en una instancia de ApsaraDB RDS for MySQL y estas expiran?
Si el problema se debe a esperas de bloqueo de metadatos, consulte Use DMS to release metadata locks.
Si el problema se debe a un alto uso de CPU, consulte What do I do if the CPU utilization of an ApsaraDB RDS for MySQL instance or an ApsaraDB RDS for MariaDB instance is high?
Si el problema se debe a un alto uso de IOPS, consulte ¿Qué hago si el uso de IOPS de una instancia de ApsaraDB RDS for MySQL es alto?
Prevenir problemas de límite de conexiones
Usar un pool de conexiones (recomendado)
Un pool de conexiones gestiona un conjunto fijo de conexiones persistentes compartidas entre su aplicación, en lugar de abrir una nueva conexión por cada solicitud. Esta es la solución a largo plazo más eficaz para prevenir el agotamiento de conexiones, y es especialmente importante para aplicaciones que abren y cierran grandes cantidades de conexiones de corta duración, como funciones serverless o aplicaciones PHP.
Al configurar el tamaño máximo del pool, establézcalo en un valor menor al límite de conexiones de la instancia. Reserve como mínimo 10 conexiones para DMS y otras operaciones de gestión.
Por ejemplo, si su instancia admite 500 conexiones, establezca el máximo del pool de conexiones en 490.
Habilitar la detección y reutilización de conexiones
Habilite la detección de conexiones en su pool de conexiones para eliminar automáticamente las conexiones obsoletas. Habilite la función de reutilización para que el pool aproveche las conexiones existentes en lugar de abrir nuevas innecesariamente.
Escalar el tipo de instancia
Si la demanda de conexiones supera constantemente el límite actual, actualice a un tipo de instancia mayor que admita más conexiones.