Agotamiento del pool de conexiones Connection pool exhaustion
ID de la causa db-pool · Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Infraestructura de BD (Equipo de infraestructura)
El número de conexiones abiertas con la BD es fijo, así que si las consultas lentas ocupan las conexiones, las demás solicitudes esperan.
Por qué Todas las conexiones están ocupadas por consultas lentas o por una avalancha de solicitudes → Efecto Las solicitudes nuevas esperan a que se libere una conexión → En pantalla Carga infinita al iniciar sesión, guardados lentos, timeouts
Al conectar o tras un mantenimiento, Cuando se junta mucha gente
Responsable
Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Infraestructura de BD (Equipo de infraestructura)
Tareas (Equipo de desarrollo)
Eliminar las consultas lentas, ajustar el tamaño del pool y el timeout de espera (sin agrandar el pool sin más), separar pools por función.
Tareas (Equipo de infraestructura)
Revisar el máximo de conexiones de la BD y el margen de CPU e IOPS, comprobar antes de añadir servidores o de autoescalar que el número de servidores × el tamaño del pool no supera el máximo de conexiones, añadir al monitoreo las métricas de espera de conexión y de espera por bloqueos.
Cifras de referencia
El número de conexiones necesarias se calcula a ojo como “solicitudes por segundo × tiempo que cada una retiene la conexión”. Con 2,000 solicitudes por segundo y 5 ms cada una, hay de media 10 conexiones siempre ocupadas. Para los picos se suele dejar el doble o el triple. Si las consultas se ralentizan a 150 ms, la misma carga necesita 300 conexiones.
En el gráfico
Topa con el límite · Conexiones a la BD en uso, tiempo de espera de conexión
Dónde mirar
Contar desde la BD el estado de las conexiones de cada servidor del juego. En MySQL, Host, Command (las conexiones inactivas aparecen como Sleep) y Time de SHOW PROCESSLIST, Threads_connected y Threads_running, y el número de conexiones rechazadas Connection_errors_max_connections. En PostgreSQL, agrupar pg_stat_activity por client_addr y state. Si la biblioteca de pool de conexiones del servidor del juego publica el número de esperas y el tiempo de espera, revisarlos también
Se confirma si
Todas las conexiones de un servidor del juego, tantas como el tamaño del pool, están ejecutando consultas, no queda ninguna inactiva y, mientras tanto, los inicios de sesión y los guardados esperan. O el total de conexiones de la BD llega a max_connections y se rechazan las conexiones nuevas
Se descarta si
Si hay conexiones inactivas de sobra y aun así va lento, apunta a la latencia de las propias consultas (db-no-index, db-hot-row) o a la saturación de recursos de la BD
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Para saber más
Agrandar el pool sin más solo aumenta el uso de CPU de la BD y la contención de bloqueos, y todo se vuelve lento a la vez. Además, si el número de servidores × el tamaño del pool supera el máximo de conexiones de la BD, los servidores añadidos o reiniciados ni siquiera pueden conectarse. Es habitual justo después de un autoescalado o de un mantenimiento.
Fuentes
Number Of Database ConnectionsPostgreSQL Una vez agotados los recursos de la BD, añadir conexiones reduce el throughput; ajustar las conexiones activas a los recursos y dejar el resto en cola mejora tanto la latencia como el throughput
Too many connectionsMySQL Cuando se usan todas las max_connections, las conexiones nuevas se rechazan con el error Too many connections
SHOW PROCESSLIST StatementMySQL Host (dirección del cliente), Command (Sleep para las sesiones inactivas), Time, State
Server Status VariablesMySQL Threads_connected y Threads_running, Connection_errors_max_connections (conexiones rechazadas por llegar a max_connections)