Tratamento de conexões inativas no PostgreSQL
Conexões inativas ocorrem quando uma sessão de banco de dados permanece ativa no servidor mesmo que a aplicação cliente tenha sido abandonada ou encerrada de forma anormal. Essa situação geralmente ocorre quando os processos do cliente falham ou são encerrados inesperadamente sem fechar adequadamente as respectivas conexões de banco de dados ou cancelar solicitações em andamento.
O PostgreSQL identifica e limpa com eficiência as conexões inativas quando os processos do servidor estão ociosos ou tentam enviar dados aos clientes. No entanto, a detecção é um desafio para sessões que estão ociosas, aguardando a entrada do cliente ou executando consultas ativamente. Para lidar com esses cenários, o PostgreSQL oferece os parâmetros tcp_keepalives_*
, tcp_user_timeout
e client_connection_check_interval
.
Tópicos
Conceitos básicos sobre keepalive de TCP
O keepalive de TCP é um mecanismo em nível de protocolo que ajuda a manter e verificar a integridade da conexão. Cada conexão TCP mantém configurações em nível de kernel que controlam o comportamento de keepalive. Quando o temporizador de keepalive expira, o sistema realiza o seguinte:
-
Envia um pacote de sondagem sem dados e com o sinalizador ACK definido.
-
Espera uma resposta do endpoint remoto de acordo com as especificações de TCP/IP.
-
Gerencia o estado da conexão com base na resposta ou na falta dela.
Principais parâmetros de keepalive de TCP no Aurora PostgreSQL
Parameter | Descrição | Valores padrão |
---|---|---|
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 para configurações de keepalive de TCP
Manter as sessões ociosas ativas
Para evitar que conexões ociosas sejam encerradas por firewalls ou roteadores devido a inatividade:
-
Configure
tcp_keepalives_idle
para enviar pacotes de keepalive em intervalos regulares.
Detectar conexões inativas
Para detectar conexões inativas imediatamente:
-
Ajuste
tcp_keepalives_idle
,tcp_keepalives_interval
etcp_keepalives_count
. Por exemplo, com os padrões do Aurora PostgreSQL, a detecção de uma conexão inativa leva cerca de 1 minuto (2 sondagens × 30 segundos). Reduzir esses valores pode acelerar a detecção. -
Use
tcp_user_timeout
para especificar o tempo máximo de espera para uma confirmação.
As configurações de keepalive de TCP ajudam o kernel a detectar conexões inativas, mas talvez o PostgreSQL não aja enquanto o soquete não for usado. Se uma sessão estiver executando uma consulta longa, as conexões inativas só poderão ser detectadas após a conclusão da consulta. No PostgreSQL 14 e versões posteriores, client_connection_check_interval
pode acelerar a detecção de conexões inativas pesquisando periodicamente o soquete durante a execução da consulta.
Práticas recomendadas
-
Defina intervalos razoáveis de keepalive: ajuste
tcp_user_timeout
,tcp_keepalives_idle
,tcp_keepalives_count
etcp_keepalives_interval
para contrabalançar a velocidade de detecção e o uso de recursos. -
Otimize para melhorar seu ambiente: alinhe as configurações ao comportamento da rede, às políticas de firewall e às necessidades da sessão.
-
Aproveite os recursos do PostgreSQL: use
client_connection_check_interval
no PostgreSQL 14 e versões posteriores para realizar verificações de conexão eficientes.