Gestión de conexiones inactivas en PostgreSQL
Las conexiones inactivas se producen cuando una sesión de base de datos permanece activa en el servidor a pesar de que la aplicación cliente se haya abandonado o terminado de forma anormal. Esta situación suele producirse cuando los procesos del cliente se bloquean o terminan de forma inesperada sin cerrar correctamente las conexiones de la base de datos ni cancelar las solicitudes en curso.
PostgreSQL identifica y limpia de manera eficiente las conexiones inactivas cuando los procesos del servidor están inactivos o intentan enviar datos a los clientes. Sin embargo, la detección es difícil en el caso de las sesiones que están inactivas, esperan la intervención del cliente o en las que se están ejecutando consultas de forma activa. Para gestionar estos escenarios, PostgreSQL proporciona los parámetros tcp_keepalives_*
, tcp_user_timeout
, y client_connection_check_interval
.
Temas
Descripción de keepalive de TCP
Keepalive de TCP es un mecanismo en el nivel de protocolo que ayuda a mantener y verificar la integridad de la conexión. Cada conexión TCP mantiene configuraciones en el nivel del kernel que rigen el comportamiento de keepalive. Cuando el temporizador de keepalive expira, el sistema realiza lo siguiente:
-
Envía un paquete de sondeo sin datos y con el indicador ACK activado.
-
Espera una respuesta del punto de conexión remoto de acuerdo con las especificaciones de TCP/IP.
-
Administra el estado de la conexión en función de la respuesta o la falta de respuesta.
Parámetros clave keepalive de TCP en Aurora PostgreSQL
Parámetro | Descripción | Valores predeterminados |
---|---|---|
tcp_keepalives_idle |
Specifies number of seconds of inactivity before sending keepalive message. | 300 |
tcp_keepalives_interval |
Specifies number of seconds between retransmissions of unacknowledged keepalive messages. | 30 |
tcp_keepalives_count |
Maximum lost keepalive messages before declaring connection dead | 2 |
tcp_user_timeout |
Specifies how long (in Milliseconds) unacknowledged data can remain before forcibly closing the connection. | 0 |
client_connection_check_interval |
Sets the interval (in Milliseconds) for checking client connection status during long-running queries. This ensures quicker detection of closed connections. | 0 |
Casos de uso de la configuración de keepalive de TCP
Mantenimiento de las sesiones inactivas como activas
Para evitar que los firewalls o enrutadores terminen las conexiones inactivas debido a la inactividad:
-
Configure
tcp_keepalives_idle
para enviar paquetes de keepalive a intervalos regulares.
Detección de conexiones inactivas
Para detectar rápidamente las conexiones inactivas:
-
Ajuste
tcp_keepalives_idle
,tcp_keepalives_interval
ytcp_keepalives_count
. Por ejemplo, con los valores predeterminados de Aurora PostgreSQL, se tarda aproximadamente un minuto (2 sondas × 30 segundos) en detectar una conexión inactiva. Reducir estos valores puede acelerar la detección. -
Utilice
tcp_user_timeout
para especificar el tiempo máximo de espera para una confirmación.
La configuración de keepalive de TCP ayuda al kernel a detectar conexiones inactivas, pero PostgreSQL puede no actuar hasta que se utilice el socket. Si una sesión está ejecutando una consulta larga, es posible que las conexiones inactivas solo se detecten una vez completada la consulta. En PostgreSQL 14 y versiones posteriores, client_connection_check_interval
puede acelerar la detección de conexiones inactivas consultando periódicamente el socket durante la ejecución de la consulta.
Prácticas recomendadas
-
Establezca intervalos de keepalive razonables: ajuste
tcp_user_timeout
,tcp_keepalives_idle
,tcp_keepalives_count
ytcp_keepalives_interval
para equilibrar la velocidad de detección y el uso de recursos. -
Optimice para su entorno: alinee la configuración con el comportamiento de la red, las políticas de firewall y las necesidades de la sesión.
-
Aproveche las características de PostgreSQL: utilice
client_connection_check_interval
en PostgreSQL 14 y versiones posteriores para comprobar la conexión de forma eficaz.