한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Libro blanco del lag en juegos › L12 Base de datos

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)

Abrir la ficha interactiva con gráficos y simulaciones →

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

Síntomas
No conecta / carga infinita, Input lag
Factores
Detención, Latencia
A quién afecta
Todo el servidor, Solo una función
Cuándo
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

  1. Number Of Database Connections PostgreSQL
    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
  2. Too many connections MySQL
    Cuando se usan todas las max_connections, las conexiones nuevas se rechazan con el error Too many connections
  3. Connections and Authentication (PostgreSQL Documentation) PostgreSQL
    max_connections: límite de conexiones simultáneas, normalmente 100 por defecto
  4. SHOW PROCESSLIST Statement MySQL
    Host (dirección del cliente), Command (Sleep para las sesiones inactivas), Time, State
  5. Server Status Variables MySQL
    Threads_connected y Threads_running, Connection_errors_max_connections (conexiones rechazadas por llegar a max_connections)
  6. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_activity: client_addr y state (active, idle, idle in transaction, etc.) de cada conexión

Ver también

Misma capa: L12 Base de datos

Causas de otras capas con el mismo síntoma (No conecta / carga infinita)

Ver la ficha interactiva con gráficos y simulaciones