Las tormentas de conexiones suelen manifestarse como picos repentinos en el conteo de conexiones y a menudo pueden diagnosticarse erróneamente como problemas de rendimiento de la base de datos.
Esta página cubre las causas y resoluciones comunes de tormentas de conexión y "too many connections" errores. Si necesitas soporte adicional tras revisar las siguientes secciones, contacta con Soporte técnico.
Comprobaciones previas
Para confirmar si tu implementación está experimentando una tormenta de conexiones o un problema con el límite de conexiones, ejecuta el comando serverStatus y verifica los siguientes indicadores:
Aumentos repentinos en
connections.currentAumentos repentinos en
connections.activeAumentando rápidamente
connections.totalCreatedIncrementos en
metrics.network.totalIngressTLSHandshakeTimeMillisAumentos de
metrics.commands.<command>.failed
También puedes consultar los mensajes de registro de tu implementación para controlar numerosos mensajes "Connection accepted" con un atributo connectionCount que aumenta rápidamente, o para aumentos en las entradas del registro de query lentas.
En las implementaciones de Atlas, puedes navegar a tu clúster en la Interfaz de Usuario de Atlas y seleccionar Metricsy luego Connections para ver gráficos de recuento de conexiones a lo largo del tiempo.
Problemas comunes y soluciones
Las siguientes secciones describen las causas comunes de las tormentas de conexión y cómo resolverlas.
Configuraciones mal configuradas del pool de conexiones
Si estableces minPoolSize mucho más bajo que maxPoolSize, el driver mantiene solo un pequeño número de conexiones inactivas. Bajo cargas de trabajo intensas o después de un reinicio, el controlador debe abrir rápidamente muchas nuevas conexiones para alcanzar el tamaño del pool de trabajo, lo que puede causar un pico en nuevas conexiones.
Alta latencia del servidor o de la query
Si la latencia del servidor o la query aumenta, las conexiones individuales permanecen activas por más tiempo. Esto obliga al driver a abrir conexiones adicionales para gestionar las solicitudes entrantes, aumentando el conteo total de conexiones.
Si observa un valor alto de connections.active y una latencia de query elevada, establezca minPoolSize en un valor más cercano a maxPoolSize en su cadena de conexión del driver. Esto pre-calienta el pool de conexiones y reduce la necesidad de abrir muchas conexiones nuevas bajo carga.
Carga operativa aumentada
Un aumento inesperado en el tráfico de tu aplicación puede agotar el pool de conexiones disponible, obligando al driver a abrir nuevas conexiones rápidamente.
Si nota picos de conexión que ocurren con aumentos de tráfico, considera establecer minPoolSize a un valor más cercano a maxPoolSize en su cadena de conexión de controlador. Esto garantiza que el controlador mantenga suficientes conexiones preestablecidas para gestionar picos de tráfico sin la necesidad de abrir rápidamente nuevas conexiones.
Eventos de red transitorios o reinicios de la aplicación
Las interrupciones del servicio de red, los reinicios en secuencia o los eventos repentinos de escalado de nivel de la aplicación pueden provocar que las instancias de la aplicación se reconecten simultáneamente, saturando el servidor con nuevas solicitudes de conexión.
Si se producen picos de conexiones durante eventos de implementación o interrupciones de red, considera configurar maxPoolSize para limitar el número total de conexiones que cada instancia de la aplicación puede abrir. Esto limita el impacto de los eventos de reconexión simultáneos.
Creación de MongoClient por solicitud
Si se crea un nuevo MongoClient en cada solicitud o invocación de función en lugar de reutilizar una sola instancia compartida, cada cliente puede abrir su propio pool de conexiones independiente hasta el maxPoolSize configurado. A través de muchas solicitudes simultáneas o entornos de ejecución de corta duración, esto multiplica el número total de conexiones abiertas y puede provocar tormentas de conexiones.
Si observa un aumento constante en el número de conexiones que se correlaciona con el volumen de solicitudes, verifique si su aplicación inicia una nueva MongoClient por solicitud y considere implementar MongoClient como una instancia compartida única en todas las operaciones. Esto estabiliza el uso de conexiones y previene picos en el número de conexiones causados por la multiplicación del pool.
Agrupaciones de routers mal configurados en clústeres con particionado
En los clústeres fragmentados, cada router mongos mantiene pools de conexiones en cada partición. Si estos grupos no tienen el tamaño correcto, una tormenta de conexiones en el nivel de la aplicación puede propagarse al nivel partición a medida que los routers abren simultáneamente una gran cantidad de conexiones internas.
Si nota que se originan tormentas de conexiones de los procesos mongos, considere:
Limita el número de
taskExecutorpools de conexión en cada router configurando el parámetrotaskExecutorPoolSize.Controlando el número mínimo y máximo de conexiones en cada grupo de enrutadores usando los parámetros
ShardingTaskExecutorPoolMinSizeyShardingTaskExecutorPoolMaxSize.
Clúster Atlas con aprovisionamiento insuficiente
Cada nivel del clúster de Atlas aplica un número máximo de conexiones entrantes simultáneas por nodo. Cuando una aplicación abre más conexiones de las que permite el nivel, el clúster podría rechazar nuevas solicitudes de conexión con el siguiente error:
connection refused because too many open connections
Si notas rechazos de conexión que se producen con una mayor carga y no mejoran después de ajustar la configuración del pool, verifica si connections.current está en o cerca del límite para el nivel de clúster. Para ver los límites de conexiones por nivel de clúster, consulta Límites del servicio Atlas.
Si la cantidad de conexiones está en o cerca del límite de nivel de clúster, considera actualizar a un nivel de clúster superior para aumentar el límite de conexiones por nodo. Para escalar tu clúster, consulta Modificar un clúster.
Verificar resolución
Para confirmar que la tormenta de conexiones se ha resuelto:
Vuelva a ejecutar
serverStatusy compruebe queconnections.currentha vuelto a los niveles esperados en relación conconnections.available.Confirma que tus
mongodomongosregistros ya no muestran errores relacionados con la conexión.En las implementaciones de Atlas, confirme que el gráfico de recuento de conexiones en la vista Metrics de Atlas haya vuelto a la línea de base.
Diagnósticos a recopilar para más apoyo
Si el problema persiste, contacta con Soporte técnico. Antes de ponerse en contacto con asistencia, recopile la siguiente información:
Salida de
db.serverStatus()Extractos de registros de
mongodomongosque muestran errores o advertencias relacionadas con la conexiónSu cadena de conexión de controlador, específicamente con los valores de
maxPoolSize,minPoolSizeywaitQueueTimeoutMSPara implementaciones de Atlas, incluye:
El número de instancias de aplicación y su topología de implementación
Una captura de pantalla del grafo de Atlas Connections durante el periodo en el que se produjo el problema