

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Gestione delle connessioni interrotte in PostgreSQL
<a name="Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling"></a>

Le connessioni interrotte si verificano quando una sessione di database rimane attiva sul server nonostante l’applicazione client sia stata abbandonata o terminata in modo anomalo. Questa situazione si verifica in genere quando i processi client vanno in crash o vengono terminati in modo imprevisto senza chiudere correttamente le connessioni al database o annullare le richieste in corso.

PostgreSQL esegue efficacemente l’identificazione e la pulizia delle connessioni interrotte quando i processi del server sono inattivi o tentano di inviare dati ai client. Tuttavia il rilevamento è complesso per le sessioni inattive, in attesa dell’input del client, o che eseguono attivamente le query. Per gestire questi scenari, PostgreSQL fornisce i parametri `tcp_keepalives_*`, `tcp_user_timeout` e `client_connection_check_interval`.

**Topics**
+ [Informazioni sui keepalive TCP](#Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.Understanding)
+ [Principali parametri keepalive TCP in RDS per PostgreSQL](#Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.Parameters)
+ [Casi d’uso per le impostazioni keepalive TCP](#Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.UseCases)
+ [Best practice](#Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.BestPractices)

## Informazioni sui keepalive TCP
<a name="Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.Understanding"></a>

Keepalive TCP è un meccanismo a livello di protocollo che aiuta a mantenere e verificare l’integrità della connessione. Ogni connessione TCP mantiene le impostazioni a livello di kernel che regolano il comportamento di keepalive. Quando il timer keepalive scade, il sistema effettua le seguenti operazioni:
+ Invia un pacchetto di esplorazione senza dati e con il flag ACK impostato.
+ Prevede una risposta dall'endpoint remoto in base alle TCP/IP specifiche.
+ Gestisce lo stato della connessione in base alla risposta o alla sua mancanza.

## Principali parametri keepalive TCP in RDS per PostgreSQL
<a name="Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.Parameters"></a>


| Parametro | Description | Valori predefiniti | 
| --- |--- |--- |
| tcp\$1keepalives\$1idle | Speciifica il numero di secondi di inattività prima dell'invio del messaggio keepalive. | 300 | 
| tcp\$1keepalives\$1interval | Speciifica il numero di secondi tra le ritrasmissioni di messaggi keepalive non riconosciuti. | 30 | 
| tcp\$1keepalives\$1count | Numero massimo di messaggi keepalive persi prima di dichiarare interrotta la connessione | 2 | 
| tcp\$1user\$1timeout | Speciifica per quanto tempo (in millisecondi) possono rimanere i dati non riconosciuti prima della chiusura forzata della connessione. | 0 | 
| client\$1connection\$1check\$1interval | Imposta l'intervallo (in millisecondi) per il controllo dello stato della connessione del client durante le query di lunga durata. Ciò garantisce un rilevamento più rapido delle connessioni chiuse. | 0 | 

## Casi d’uso per le impostazioni keepalive TCP
<a name="Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.UseCases"></a>

### Keepalive per le sessioni inattive
<a name="Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.UseCases.KeepingAlive"></a>

Per evitare che le connessioni inattive vengano terminate da firewall o router a causa dell’inattività, procedi come segue:
+ Configura `tcp_keepalives_idle` per inviare pacchetti keepalive a intervalli regolari.

### Rilevamento di connessioni interrotte
<a name="Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.UseCases.DetectingDead"></a>

Per rilevare tempestivamente le connessioni interrotte, procedi come segue:
+ Regola `tcp_keepalives_idle`, `tcp_keepalives_interval` e `tcp_keepalives_count`. Ad esempio, con le impostazioni predefinite di Aurora PostgreSQL, è necessario circa un minuto (2 sonde × 30 secondi) per rilevare una connessione interrotta. Riducendo questi valori è possibile velocizzare il rilevamento.
+ Utilizza `tcp_user_timeout` per specificare il tempo di attesa massimo per un riconoscimento.

Le impostazioni keepalive TCP aiutano il kernel a rilevare le connessioni interrotte, ma PostgreSQL potrebbe non agire finché non viene utilizzato il socket. Se una sessione esegue una query di lunga durata, le connessioni interrotte potrebbero essere rilevate solo dopo il completamento della query. In PostgreSQL 14 e versioni successive, `client_connection_check_interval` può accelerare il rilevamento delle connessioni interrotte tramite polling periodico del socket durante l’esecuzione della query.

## Best practice
<a name="Appendix.PostgreSQL.CommonDBATasks.DeadConnectionHandling.BestPractices"></a>
+ **Imposta intervalli keepalive ragionevoli:** ottimizza `tcp_user_timeout`, `tcp_keepalives_idle`, `tcp_keepalives_count` e `tcp_keepalives_interval` per bilanciare la velocità di rilevamento e l’utilizzo delle risorse.
+ **Ottimizza per il tuo ambiente:** allinea le impostazioni al comportamento della rete, alle policy del firewall e alle esigenze delle sessioni.
+ **Sfrutta le funzionalità di PostgreSQL:** utilizza `client_connection_check_interval` in PostgreSQL 14 e versioni successive per controlli di connessione efficienti.