

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à.

# Sintonizzazione degli eventi di attesa per Aurora PostgreSQL
<a name="AuroraPostgreSQL.Tuning"></a>

Gli eventi di attesa sono un importante strumento di regolazione per Aurora PostgreSQL. Quando si scopre perché le sessioni sono in attesa di risorse e l'azione svolta, è possibile risolvere i colli di bottiglia in maniera più efficiente. È possibile utilizzare le informazioni contenute in questa sezione per trovare possibili cause e azioni correttive. Prima di approfondire questa sezione, è opportuno comprendere i concetti di base di Aurora, in particolare i seguenti argomenti:
+ [Archiviazione Amazon Aurora](Aurora.Overview.StorageReliability.md)
+ [Gestione delle prestazioni e del dimensionamento dei cluster DB Aurora](Aurora.Managing.Performance.md) 

**Importante**  
Gli eventi di attesa in questa sezione sono specifici di Aurora PostgreSQL. Utilizza le informazioni contenute in questa sezione per ottimizzare solo Amazon Aurora, non RDS per PostgreSQL.  
Alcuni eventi di attesa in questa sezione non hanno analoghi nelle versioni open source di questi motori di database. Altri eventi di attesa hanno lo stesso nome degli eventi nei motori open source, ma si comportano in modo diverso. Ad esempio, lo storage Amazon Aurora funziona in modo diverso dallo storage open source, pertanto gli eventi di attesa relativi allo storage indicano condizioni di risorse diverse.

**Topics**
+ [Concetti essenziali per l'ottimizzazione di Aurora PostgreSQL](AuroraPostgreSQL.Tuning.concepts.md)
+ [Eventi di attesa Aurora PostgreSQL](AuroraPostgreSQL.Tuning.concepts.summary.md)
+ [Cliente: ClientRead](apg-waits.clientread.md)
+ [Cliente: ClientWrite](apg-waits.clientwrite.md)
+ [CPU](apg-waits.cpu.md)
+ [IO: BufFileRead e IO: BufFileWrite](apg-waits.iobuffile.md)
+ [IO: DataFileRead](apg-waits.iodatafileread.md)
+ [IO:XactSync](apg-waits.xactsync.md)
+ [IPC:DamRecordTxAck](apg-waits.ipcdamrecordtxac.md)
+ [Eventi di attesa IPC:parallel](apg-ipc-parallel.md)
+ [IPC: ProcArrayGroupUpdate](apg-rpg-ipcprocarraygroup.md)
+ [Lock:advisory](apg-waits.lockadvisory.md)
+ [Lock:extend](apg-waits.lockextend.md)
+ [Lock:Relation](apg-waits.lockrelation.md)
+ [Lock:transactionid](apg-waits.locktransactionid.md)
+ [Lock:tuple](apg-waits.locktuple.md)
+ [LWLock:contenuto\$1buffer () BufferContent](apg-waits.lockbuffercontent.md)
+ [LWLock:mappatura\$1buffer](apg-waits.lwl-buffer-mapping.md)
+ [LWLock:BufferIO (IPC:BufferIO)](apg-waits.lwlockbufferio.md)
+ [LWLock:lock\$1manager](apg-waits.lw-lock-manager.md)
+ [LWLock:MultiXact](apg-waits.lwlockmultixact.md)
+ [LWLock:pg\$1stat\$1statements](apg-rpg-lwlockpgstat.md)
+ [Timeout: PG Sleep](apg-waits.timeoutpgsleep.md)

# Concetti essenziali per l'ottimizzazione di Aurora PostgreSQL
<a name="AuroraPostgreSQL.Tuning.concepts"></a>

Prima di sintonizzare il database Aurora PostgreSQL, assicurati di sapere cosa sono gli eventi di attesa e perché si verificano. Esamina anche l'architettura di base della memoria e del disco di Aurora PostgreSQL. Per un utile diagramma architettonico, vedere il wikibook [PostgreSQL](https://en.wikibooks.org/wiki/PostgreSQL/Architecture).

**Topics**
+ [Eventi di attesa Aurora PostgreSQL](#AuroraPostgreSQL.Tuning.concepts.waits)
+ [Memoria Aurora PostgreSQL](#AuroraPostgreSQL.Tuning.concepts.memory)
+ [Processi Aurora PostgreSQL](#AuroraPostgreSQL.Tuning.concepts.processes)

## Eventi di attesa Aurora PostgreSQL
<a name="AuroraPostgreSQL.Tuning.concepts.waits"></a>

Un *evento di attesa* indica una risorsa per la quale è in attesa di una sessione. Ad esempio, l'evento di attesa `Client:ClientRead` si verifica quando Aurora PostgreSQL è in attesa di ricevere dati dal client. Le risorse tipiche che una sessione attende includono quanto segue:
+ Accesso a thread singolo a un buffer, ad esempio, quando una sessione sta tentando di modificare un buffer
+ Una riga attualmente bloccata da un'altra sessione
+ Un file di dati letto
+ Scrittura di un file log

Ad esempio, per soddisfare una query, la sessione potrebbe eseguire una scansione completa della tabella. Se i dati non sono già in memoria, la sessione attende il I/O completamento del disco. Quando i buffer vengono letti in memoria, potrebbe essere necessario attendere perché altre sessioni accedono agli stessi buffer. Il database registra le attese utilizzando un evento di attesa predefinito. Questi eventi sono raggruppati in categorie.

Un evento di attesa non mostra di per sé un problema di prestazioni. Ad esempio, se i dati richiesti non sono in memoria, è necessaria la lettura dei dati dal disco. Se una sessione blocca una riga per un aggiornamento, un'altra sessione attende che la riga venga sbloccata in modo che possa aggiornarla. Un commit richiede di attendere il completamento della scrittura su un file di registro. Le attese sono parte integrante del normale funzionamento di un database. 

Un gran numero di eventi di attesa in genere mostrano un problema di prestazioni. In questi casi, è possibile utilizzare i dati degli eventi di attesa per determinare dove stanno trascorrendo il tempo delle sessioni. Ad esempio, se un report che in genere viene eseguito in minuti ora viene eseguito per ore, è possibile identificare gli eventi di attesa che contribuiscono maggiormente al tempo di attesa totale. Se è possibile determinare le cause degli eventi di attesa principali, a volte è possibile apportare modifiche che migliorano le prestazioni. Ad esempio, se la sessione è in attesa su una riga bloccata da un'altra sessione, è possibile terminare la sessione di blocco. 

## Memoria Aurora PostgreSQL
<a name="AuroraPostgreSQL.Tuning.concepts.memory"></a>

La memoria Aurora PostgreSQL è divisa in condivisa e locale.

**Topics**
+ [Memoria condivisa in Aurora PostgreSQL](#AuroraPostgreSQL.Tuning.concepts.shared)
+ [Memoria locale in Aurora PostgreSQL](#AuroraPostgreSQL.Tuning.concepts.local)

### Memoria condivisa in Aurora PostgreSQL
<a name="AuroraPostgreSQL.Tuning.concepts.shared"></a>

Aurora PostgreSQL assegna memoria condivisa all'avvio dell'istanza. La memoria condivisa è divisa in più sottoaree. Di seguito è possibile trovare una descrizione dei più importanti.

**Topics**
+ [Buffer condivisi](#AuroraPostgreSQL.Tuning.concepts.buffer-pool)
+ [Buffer Write ahead log (WAL)](#AuroraPostgreSQL.Tuning.concepts.WAL)

#### Buffer condivisi
<a name="AuroraPostgreSQL.Tuning.concepts.buffer-pool"></a>

Il *pool buffer condiviso* è un'area di memoria Aurora PostgreSQL che contiene tutte le pagine che sono o sono state utilizzate dalle connessioni delle applicazioni. Una *pagina* è la versione di memoria di un blocco disco. Il buffer pool condiviso memorizza nella cache i blocchi di dati letti dal disco. Il pool riduce la necessità di rileggere i dati dal disco, rendendo il database più efficiente.

Ogni tabella e indice vengono memorizzati come una matrice di pagine di dimensioni fisse. Ogni blocco contiene più tuple, che corrispondono alle righe. Una tupla può essere memorizzata in qualsiasi pagina.

Il buffer pool condiviso ha memoria finita. Se una nuova richiesta richiede una pagina che non è in memoria, e non esiste più memoria, Aurora PostgreSQL sfratterà una pagina utilizzata meno frequentemente per soddisfare la richiesta. La politica di sfratto è implementata da un algoritmo di sweep dell'orologio.

Il parametro `shared_buffers` determina la quantità di memoria che il server dedica alla memorizzazione nella cache dei dati.

#### Buffer Write ahead log (WAL)
<a name="AuroraPostgreSQL.Tuning.concepts.WAL"></a>

Un *Buffer write-ahead log (WAL)* conserva i dati delle transazioni che Aurora PostgreSQL successivamente scrive sullo storage persistente. Utilizzando il meccanismo WAL, Aurora PostgreSQL può effettuare le seguenti operazioni:
+ Recuperare i dati dopo un errore
+ Riduci il disco I/O evitando le scritture frequenti su disco

Quando un client modifica i dati, Aurora PostgreSQL scrive le modifiche nel buffer WAL. Quando il client emette un `COMMIT`, il processo di scrittura WAL scrive i dati delle transazioni nel file WAL.

Il parametro `wal_level` determina la quantità di informazioni scritte sul WAL.

### Memoria locale in Aurora PostgreSQL
<a name="AuroraPostgreSQL.Tuning.concepts.local"></a>

Ogni processo di back-end assegna memoria locale per l'elaborazione delle query.

**Topics**
+ [Area di memoria di lavoro](#AuroraPostgreSQL.Tuning.concepts.local.work_mem)
+ [Area memoria di lavoro di manutenzione](#AuroraPostgreSQL.Tuning.concepts.local.maintenance_work_mem)
+ [Area buffer temporanea](#AuroraPostgreSQL.Tuning.concepts.temp)

#### Area di memoria di lavoro
<a name="AuroraPostgreSQL.Tuning.concepts.local.work_mem"></a>

L’*area di memoria di lavoro* contiene dati temporanei per query che eseguono ordinamenti e hash. Ad esempio, una query con clausola `ORDER BY` esegue un ordinamento. Le query utilizzano tabelle hash nei join e nelle aggregazioni hash.

Il parametro `work_mem` indica la quantità di memoria da utilizzare dalle operazioni di ordinamento interno e dalle tabelle hash prima di scrivere su file di disco temporanei. Il valore predefinito è 4 MB. È possibile eseguire più sessioni contemporaneamente e ogni sessione può eseguire operazioni di manutenzione in parallelo. Per questo motivo, la memoria di lavoro totale utilizzata può essere costituita da multipli dell’impostazione `work_mem`. 

#### Area memoria di lavoro di manutenzione
<a name="AuroraPostgreSQL.Tuning.concepts.local.maintenance_work_mem"></a>

L’*area di memoria di lavoro di manutenzione* memorizza nella cache i dati per le operazioni di manutenzione. Queste operazioni includono l'aspirazione, la creazione di un indice e l'aggiunta di chiavi esterne.

Il parametro `maintenance_work_mem` specifica la quantità massima di memoria da utilizzare nelle operazioni di manutenzione. Il valore predefinito è 64 MB. Una sessione di database può eseguire solo un'operazione di manutenzione alla volta.

#### Area buffer temporanea
<a name="AuroraPostgreSQL.Tuning.concepts.temp"></a>

L’*area buffer temporanea* memorizza nella cache le tabelle temporanee per ciascuna sessione del database.

Ogni sessione assegna buffer temporanei secondo necessità fino al limite specificato. Quando la sessione scade, il server cancella i buffer.

Il parametro `temp_buffers` imposta il numero massimo di buffer temporanei utilizzati da ogni sessione. Prima del primo utilizzo di tabelle temporanee all'interno di una sessione, è possibile modificare il valore `temp_buffers`.

## Processi Aurora PostgreSQL
<a name="AuroraPostgreSQL.Tuning.concepts.processes"></a>

Aurora PostgreSQL utilizza più processi.

**Topics**
+ [Processo postmaster](#AuroraPostgreSQL.Tuning.concepts.postmaster)
+ [Processi di back-end](#AuroraPostgreSQL.Tuning.concepts.backend)
+ [Processi in background](#AuroraPostgreSQL.Tuning.concepts.vacuum)

### Processo postmaster
<a name="AuroraPostgreSQL.Tuning.concepts.postmaster"></a>

Il *processo postmaster* è il primo processo avviato quando si avvia Aurora PostgreSQL. Il processo postmaster ha le seguenti responsabilità principali:
+ Forcella e monitoraggio dei processi in background
+ Ricevere le richieste di autenticazione dai processi client e autenticarle prima di consentire al database di servire le richieste

### Processi di back-end
<a name="AuroraPostgreSQL.Tuning.concepts.backend"></a>

Se il postmaster autentica una richiesta del cliente, il postmaster forcherà un nuovo processo di back-end, chiamato anche processo postgres. Un processo client si connette esattamente a un processo back-end. Il processo client e il processo di backend comunicano direttamente senza intervento da parte del processo postmaster.

### Processi in background
<a name="AuroraPostgreSQL.Tuning.concepts.vacuum"></a>

Il processo postmaster forca diversi processi che eseguono diverse attività di back-end. Alcuni dei più importanti includono quanto segue:
+ Scrittore WAL

  Aurora PostgreSQL scrive i dati nel buffer WAL (write ahead logging) nei file di log. Il principio della registrazione write ahead è che il database non può scrivere modifiche ai file di dati fino a quando il database ha scritto i record di log che descrivono tali modifiche su disco. Il meccanismo WAL riduce l'I/O del disco e consente ad Aurora PostgreSQL di utilizzare i log per recuperare il database dopo un errore.
+ Background writer

  Questo processo scrive periodicamente pagine sporche (modificate) dai buffer di memoria ai file di dati. Una pagina diventa sporca quando un processo di back-end la modifica in memoria.
+ Il daemon dell'Autovacuum

  Il daemon include i seguenti elementi:
  + Il lanciatore di autovacuum
  + I processi di autovacuum worker

  Se abilitata, verifica la presenza di tabelle con un numero elevato di tuple inserite, aggiornate o eliminate. Il daemon ha le seguenti responsabilità:
  + Recuperare o riutilizzare lo spazio su disco occupato da righe aggiornate o eliminate
  + Aggiornare le statistiche utilizzate dal planner
  + Proteggere contro la perdita di dati precedenti a causa di un involucro dell'ID transazione

  La funzione autovacuum automatizza l'esecuzione dei comandi `VACUUM` e `ANALYZE`. `VACUUM` ha le seguenti varianti: standard e full. Il vuoto standard funziona in parallelo con altre operazioni di database. `VACUUM FULL` richiede un blocco esclusivo sulla tabella su cui sta lavorando. Pertanto, non può essere eseguito in parallelo con le operazioni che accedono alla stessa tabella. `VACUUM`crea una notevole quantità di I/O traffico, che può causare scarse prestazioni per altre sessioni attive.

# Eventi di attesa Aurora PostgreSQL
<a name="AuroraPostgreSQL.Tuning.concepts.summary"></a>

La seguente tabella elenca gli eventi di attesa per Aurora PostgreSQL che indicano più comunemente problemi di prestazioni, con cause più comuni e azioni correttive. I seguenti eventi di attesa sono un sottoinsieme dell'elenco in [Eventi di attesa Amazon Aurora PostgreSQL](AuroraPostgreSQL.Reference.Waitevents.md).


| Evento di attesa | Definizione | 
| --- | --- | 
|  [Cliente: ClientRead](apg-waits.clientread.md)  |  Ad esempio, l'evento di attesa si verifica quando Aurora PostgreSQL è in attesa di ricevere dati dal client.  | 
|  [Cliente: ClientWrite](apg-waits.clientwrite.md)  |  Ad esempio, l'evento di attesa si verifica quando Aurora PostgreSQL è in attesa di ricevere dati dal client.  | 
|  [CPU](apg-waits.cpu.md)  |  Questo evento si verifica quando un thread è attivo nella CPU o è in attesa della CPU.  | 
|  [IO: BufFileRead e IO: BufFileWrite](apg-waits.iobuffile.md)  |  Questi eventi si verificano quando Aurora PostgreSQL crea file temporanei.  | 
|  [IO: DataFileRead](apg-waits.iodatafileread.md)  |  Questo evento si verifica quando una connessione attende un processo di back-end per leggere una pagina richiesta dalla memoria perché la pagina non è disponibile nella memoria condivisa.   | 
|  [IO:XactSync](apg-waits.xactsync.md)  |  Questo evento si verifica quando il database è in attesa che il sottosistema di archiviazione Aurora riconosca il commit di una transazione regolare o il commit o il rollback di una transazione preparata.   | 
|  [IPC:DamRecordTxAck](apg-waits.ipcdamrecordtxac.md)  |  Questo evento si verifica quando Aurora PostgreSQL in una sessione che utilizza flussi di attività del database genera un evento di flusso di attività, quindi attende che tale evento diventi duraturo.  | 
|  [Lock:advisory](apg-waits.lockadvisory.md)  |  Questo evento si verifica quando un'applicazione PostgreSQL utilizza un blocco per coordinare l'attività su più sessioni.  | 
|  [Lock:extend](apg-waits.lockextend.md) |  Questo evento si verifica quando un processo di back-end è in attesa di bloccare una relazione per estenderla mentre un altro processo ha un blocco su tale relazione per lo stesso scopo.  | 
|  [Lock:Relation](apg-waits.lockrelation.md)  |  Questo evento si verifica quando una query è in attesa di acquisire un blocco su una tabella o vista attualmente bloccata da un'altra transazione.  | 
|  [Lock:transactionid](apg-waits.locktransactionid.md)  | Questo evento si verifica quando una transazione è in attesa di un blocco a livello di riga. | 
|  [Lock:tuple](apg-waits.locktuple.md)  |  Questo evento si verifica quando un processo di backend aspetta di acquisire un blocco su una tupla.  | 
|  [LWLock:contenuto\$1buffer () BufferContent](apg-waits.lockbuffercontent.md)  |  Questo evento si verifica quando una sessione è in attesa di accedere in lettura o scrittura a una pagina dati in memoria mentre un'altra sessione ha bloccato la pagina in scrittura.  | 
|  [LWLock:mappatura\$1buffer](apg-waits.lwl-buffer-mapping.md)  |  Questo evento si verifica quando un processo di backend è in attesa di associare un blocco di dati a un buffer nel pool di buffer condiviso.  | 
|  [LWLock:BufferIO (IPC:BufferIO)](apg-waits.lwlockbufferio.md)  |  Questo evento si verifica quando Aurora PostgreSQL o RDS for PostgreSQL sono in attesa che altri processi completino le loro operazioni (I/O) quando tentano contemporaneamente di accedere a una pagina. input/output   | 
|  [LWLock:lock\$1manager](apg-waits.lw-lock-manager.md)  | Questo evento si verifica quando il motore Aurora PostgreSQL mantiene l'area di memoria del blocco condiviso per allocare, controllare e dislocare un blocco quando non è possibile un blocco rapido del percorso. | 
| [LWLock:MultiXact](apg-waits.lwlockmultixact.md)  | Questo tipo di evento si verifica quando Aurora PostgreSQL mantiene aperta una sessione per completare più transazioni che coinvolgono la stessa riga in una tabella. L'evento wait indica quale aspetto dell'elaborazione di più transazioni sta generando l'evento di attesa, ovvero: SLRU,:,: SLRU o:. LWLock MultiXactOffset LWLock MultiXactOffsetBuffer LWLock MultiXactMember LWLock MultiXactMemberBuffer | 
|  [Timeout: PG Sleep](apg-waits.timeoutpgsleep.md)  |  Questo evento si verifica quando un processo server ha chiamato la funzione `pg_sleep` e sta aspettando la scadenza del timeout del sonno.   | 

# Cliente: ClientRead
<a name="apg-waits.clientread"></a>

L’evento `Client:ClientRead` si verifica quando Aurora PostgreSQL è in attesa di ricevere dati dal client.

**Topics**
+ [Versioni del motore supportate](#apg-waits.clientread.context.supported)
+ [Contesto](#apg-waits.clientread.context)
+ [Probabili cause di aumento delle attese](#apg-waits.clientread.causes)
+ [Azioni](#apg-waits.clientread.actions)

## Versioni del motore supportate
<a name="apg-waits.clientread.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per Aurora PostgreSQL versione 10 e successive.

## Contesto
<a name="apg-waits.clientread.context"></a>

Un cluster Aurora PostgreSQL DB è in attesa di ricevere dati dal client. Il cluster Aurora PostgreSQL DB deve ricevere i dati dal client prima di poter inviare più dati al client. Il tempo in cui il cluster attende prima di ricevere i dati dal client è un evento `Client:ClientRead`.

## Probabili cause di aumento delle attese
<a name="apg-waits.clientread.causes"></a>

Le cause comuni della comparsa dell'evento `Client:ClientRead` che appare nelle prime attese includono: 

**Maggiore latenza di rete**  
Potrebbe esserci una maggiore latenza di rete tra il cluster Aurora PostgreSQL DB e il client. Una maggiore latenza di rete aumenta il tempo necessario per la ricezione dei dati dal client del cluster DB.

**Aumento del carico sul client**  
Potrebbe esserci una pressione della CPU o una saturazione della rete sul client. Un aumento del carico sul client può ritardare la trasmissione dei dati dal client al cluster Aurora PostgreSQL DB.

**Eccesso di viaggi di andata e ritorno in rete**  
Un gran numero di viaggi di andata e ritorno in rete tra il cluster Aurora PostgreSQL DB e il client possono ritardare la trasmissione dei dati dal client al cluster Aurora PostgreSQL DB.

**Operazione copia di grandi dimensioni**  
Durante un’operazione di copia, i dati vengono trasferiti dal file system del client al cluster di database Aurora PostgreSQL. L’invio di una grande quantità di dati al cluster di database può ritardare la trasmissione dei dati dal client al cluster di database.

**Connessione client inattiva**  
Una connessione a un’istanza database di Aurora PostgreSQL è inattiva in stato di transazione ed è in attesa che un client invii più dati o un comando. Questo stato può comportare un aumento degli eventi `Client:ClientRead`.

**PgBouncer utilizzato per il pool di connessioni**  
PgBouncer ha un'impostazione di configurazione di rete di basso livello denominata`pkt_buf`, che per impostazione predefinita è impostata su 4.096. Se il carico di lavoro consiste nell'invio di pacchetti di query di dimensioni superiori a 4.096 byte PgBouncer, si consiglia di aumentare l'impostazione a 8.192. `pkt_buf` Se la nuova impostazione non diminuisce il numero di eventi `Client:ClientRead`, consigliamo di aumentare l’impostazione `pkt_buf` su valori più grandi, come 16.384 o 32.768. Se il testo della query è grande, l’impostazione più grande può essere particolarmente utile.

## Azioni
<a name="apg-waits.clientread.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa.

**Topics**
+ [Posizionare i client nella stessa area di disponibilità e subnet VPC del cluster](#apg-waits.clientread.actions.az-vpc-subnet)
+ [Ridimensionare il client](#apg-waits.clientread.actions.scale-client)
+ [Utilizza istanze di generazione corrente](#apg-waits.clientread.actions.db-instance-class)
+ [Aumentare la larghezza di banda di rete](#apg-waits.clientread.actions.increase-network-bandwidth)
+ [Monitora il massimo delle prestazioni di rete](#apg-waits.clientread.actions.monitor-network-performance)
+ [Monitorare le transazioni nello stato «inattivo nella transazione»](#apg-waits.clientread.actions.check-idle-in-transaction)

### Posizionare i client nella stessa area di disponibilità e subnet VPC del cluster
<a name="apg-waits.clientread.actions.az-vpc-subnet"></a>

Per ridurre la latenza di rete e aumentare il throughput di rete, posizionare i client nella stessa subnet di Availability Zone e Virtual Private Cloud (VPC) del cluster Aurora PostgreSQL DB. Assicurarsi che i client siano il più geograficamente vicini possibile al cluster DB.

### Ridimensionare il client
<a name="apg-waits.clientread.actions.scale-client"></a>

Utilizzando Amazon CloudWatch o altri parametri relativi all'host, stabilisci se il tuo client è attualmente limitato dalla CPU o dalla larghezza di banda della rete o da entrambi. Se il client è vincolato, ridimensionare il client di conseguenza.

### Utilizza istanze di generazione corrente
<a name="apg-waits.clientread.actions.db-instance-class"></a>

In alcuni casi, potresti non utilizzare una classe di istanza DB che supporta i frame jumbo. Se stai eseguendo l'applicazione su Amazon EC2, considera l'utilizzo di un'istanza di generazione corrente per il client. Inoltre, configura l'unità di trasmissione massima (MTU) sul sistema operativo client. Questa tecnica potrebbe ridurre il numero di round trip di rete e aumentare il throughput di rete. Per ulteriori informazioni, consulta [Frame jumbo (9001 MTU)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/network_mtu.html#jumbo_frame_instances) nella *Guida per l’utente di Amazon EC2*.

Per informazioni sulle classi di istanza database, consulta [Classi di istanze DB Amazon Aurora](Concepts.DBInstanceClass.md). Per determinare la classe di istanza DB equivalente a un tipo di istanza Amazon EC2, posizionare `db.` prima del nome del tipo di istanza Amazon EC2. Ad esempio, l’istanza Amazon EC2 `r5.8xlarge` è equivalente alla classe di istanza database `db.r5.8xlarge`.

### Aumentare la larghezza di banda di rete
<a name="apg-waits.clientread.actions.increase-network-bandwidth"></a>

Usa `NetworkReceiveThroughput` i CloudWatch parametri di `NetworkTransmitThroughput` Amazon per monitorare il traffico di rete in entrata e in uscita sul cluster DB. Questi parametri possono aiutarti a determinare se la larghezza di banda della rete è sufficiente per il tuo carico di lavoro. 

Se la larghezza di banda della rete non è sufficiente, aumentala. Se il AWS client o l'istanza DB stanno raggiungendo i limiti di larghezza di banda di rete, l'unico modo per aumentare la larghezza di banda è aumentare le dimensioni dell'istanza DB.

Per ulteriori informazioni sulle CloudWatch metriche, consulta. [CloudWatch Parametri Amazon per Amazon Aurora](Aurora.AuroraMonitoring.Metrics.md)

### Monitora il massimo delle prestazioni di rete
<a name="apg-waits.clientread.actions.monitor-network-performance"></a>

Se utilizzi client Amazon EC2, Amazon EC2 fornisce il massimo per i parametri delle prestazioni di rete, inclusa la larghezza di banda aggregata in entrata e in uscita. Fornisce inoltre il monitoraggio della connessione per garantire che i pacchetti vengano restituiti come previsto e l’accesso ai servizi locali per servizi come il DNS (Domain Name System). Per monitorare questi massimi, utilizza un driver di rete avanzato e monitora le prestazioni di rete per il client. 

Per ulteriori informazioni, consulta [Monitoraggio delle prestazioni di rete per l’istanza EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-network-performance-ena.html) nella *Guida per l’utente di Amazon EC2* e [Monitoraggio delle prestazioni di rete per l’istanza EC2](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/monitoring-network-performance-ena.html) nella *Guida per l’utente di Amazon EC2*.

### Monitorare le transazioni nello stato «inattivo nella transazione»
<a name="apg-waits.clientread.actions.check-idle-in-transaction"></a>

Controlla se hai un numero crescente di connessioni `idle in transaction`. Per fare ciò, monitora la colonna `state` nella tabella `pg_stat_activity`. Potrebbe essere possibile identificare l’origine della connessione eseguendo una query simile alla seguente.

```
select client_addr, state, count(1) from pg_stat_activity 
where state like 'idle in transaction%' 
group by 1,2 
order by 3 desc
```

# Cliente: ClientWrite
<a name="apg-waits.clientwrite"></a>

L’evento `Client:ClientWrite` si verifica quando Aurora PostgreSQL è in attesa di scrivere dati sul client.

**Topics**
+ [Versioni del motore supportate](#apg-waits.clientwrite.context.supported)
+ [Contesto](#apg-waits.clientwrite.context)
+ [Probabili cause di aumento delle attese](#apg-waits.clientwrite.causes)
+ [Azioni](#apg-waits.clientwrite.actions)

## Versioni del motore supportate
<a name="apg-waits.clientwrite.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per Aurora PostgreSQL versione 10 e successive.

## Contesto
<a name="apg-waits.clientwrite.context"></a>

Il processo client deve ricevere i dati da un cluster database Aurora PostgreSQL prima di poter inviare più dati. Il tempo in cui il cluster attende prima inviare altri dati al client è un evento `Client:ClientWrite`.

Il throughput di rete ridotto tra il cluster Aurora PostgreSQL DB e il client può causare questo evento. Anche la pressione della CPU e la saturazione della rete sul client possono causare questo evento. *Pressione CPU* è quando la CPU è completamente utilizzata e ci sono attività in attesa del tempo della CPU. *Saturazione rete* è quando la rete tra il database e il client trasporta più dati di quelli che è in grado di gestire. 

## Probabili cause di aumento delle attese
<a name="apg-waits.clientwrite.causes"></a>

Le cause comuni della comparsa dell'evento `Client:ClientWrite` che appare nelle prime attese includono: 

**Maggiore latenza di rete**  
Potrebbe esserci una maggiore latenza di rete tra il cluster Aurora PostgreSQL DB e il client. Una maggiore latenza di rete aumenta il tempo necessario per la ricezione dei dati dal client.

**Aumento del carico sul client**  
Potrebbe esserci una pressione della CPU o una saturazione della rete sul client. Un aumento del carico sul client ritarda la ricezione dei dati dal cluster Aurora PostgreSQL DB.

**Ampio volume di dati inviati al client**  
Il cluster Aurora PostgreSQL DB potrebbe inviare una grande quantità di dati al client. Un client potrebbe non essere in grado di ricevere i dati con la stessa rapidità dell’invio del cluster. Attività come una copia di una tabella di grandi dimensioni possono comportare un aumento degli eventi `Client:ClientWrite`.

## Azioni
<a name="apg-waits.clientwrite.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa.

**Topics**
+ [Posizionare i client nella stessa area di disponibilità e subnet VPC del cluster](#apg-waits.clientwrite.actions.az-vpc-subnet)
+ [Utilizza istanze di generazione corrente](#apg-waits.clientwrite.actions.db-instance-class)
+ [Ridurre la quantità di dati inviati al client](#apg-waits.clientwrite.actions.reduce-data)
+ [Ridimensionare il client](#apg-waits.clientwrite.actions.scale-client)

### Posizionare i client nella stessa area di disponibilità e subnet VPC del cluster
<a name="apg-waits.clientwrite.actions.az-vpc-subnet"></a>

Per ridurre la latenza di rete e aumentare il throughput di rete, posizionare i client nella stessa subnet di Availability Zone e Virtual Private Cloud (VPC) del cluster Aurora PostgreSQL DB.

### Utilizza istanze di generazione corrente
<a name="apg-waits.clientwrite.actions.db-instance-class"></a>

In alcuni casi, potresti non utilizzare una classe di istanza DB che supporta i frame jumbo. Se stai eseguendo l'applicazione su Amazon EC2, considera l'utilizzo di un'istanza di generazione corrente per il client. Inoltre, configura l'unità di trasmissione massima (MTU) sul sistema operativo client. Questa tecnica potrebbe ridurre il numero di round trip di rete e aumentare il throughput di rete. Per ulteriori informazioni, consulta [Frame jumbo (9001 MTU)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/network_mtu.html#jumbo_frame_instances) nella *Guida per l’utente di Amazon EC2*.

Per informazioni sulle classi di istanza database, consulta [Classi di istanze DB Amazon Aurora](Concepts.DBInstanceClass.md). Per determinare la classe di istanza DB equivalente a un tipo di istanza Amazon EC2, posizionare `db.` prima del nome del tipo di istanza Amazon EC2. Ad esempio, l'istanza Amazon EC2 `r5.8xlarge` è equivalente alla classe di istanza DB `db.r5.8xlarge`.

### Ridurre la quantità di dati inviati al client
<a name="apg-waits.clientwrite.actions.reduce-data"></a>

Quando possibile, regolare l’applicazione per ridurre la quantità di dati che il cluster Aurora PostgreSQL DB invia al client. Effettuare tali regolazioni allevia la contesa della CPU e della rete sul client.

### Ridimensionare il client
<a name="apg-waits.clientwrite.actions.scale-client"></a>

Utilizzando Amazon CloudWatch o altri parametri relativi all'host, stabilisci se il tuo client è attualmente limitato dalla CPU o dalla larghezza di banda della rete o da entrambi. Se il client è vincolato, ridimensionare il client di conseguenza.

# CPU
<a name="apg-waits.cpu"></a>

Questo evento si verifica quando un thread è attivo nella CPU o è in attesa della CPU.

**Topics**
+ [Versioni del motore supportate](#apg-waits.cpu.context.supported)
+ [Contesto](#apg-waits.cpu.context)
+ [Probabili cause di aumento delle attese](#apg-waits.cpu.causes)
+ [Azioni](#apg-waits.cpu.actions)

## Versioni del motore supportate
<a name="apg-waits.cpu.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per Aurora PostgreSQL versione 9.6 e successive. 

## Contesto
<a name="apg-waits.cpu.context"></a>

L’*unità di elaborazione centrale (CPU)* è il componente di un computer che esegue le istruzioni. Ad esempio, le istruzioni della CPU eseguono operazioni aritmetiche e scambiano dati in memoria. Se una query aumenta il numero di istruzioni eseguite tramite il motore di database, il tempo impiegato per eseguire la query aumenta. *Pianificazione CPU* sta dando tempo alla CPU a un processo. La pianificazione viene orchestrata dal kernel del sistema operativo.

**Topics**
+ [Come sapere quando si verifica questa attesa](#apg-waits.cpu.when-it-occurs)
+ [DBLoadMetrica della CPU](#apg-waits.cpu.context.dbloadcpu)
+ [Parametri di utilizzo di OS.CPU](#apg-waits.cpu.context.osmetrics)
+ [Probabile causa della pianificazione della CPU](#apg-waits.cpu.context.scheduling)

### Come sapere quando si verifica questa attesa
<a name="apg-waits.cpu.when-it-occurs"></a>

Questo evento di attesa `CPU` indica che un processo di backend è attivo nella CPU o è in attesa della CPU. Si verifica quando una query mostra le seguenti informazioni:
+ La colonna `pg_stat_activity.state` ha il valore `active`.
+ Le colonne `wait_event_type` e `wait_event` in `pg_stat_activity` sono entrambe `null`.

Per visualizzare i processi di backend in uso o in attesa sulla CPU, eseguire la seguente query.

```
SELECT * 
FROM   pg_stat_activity
WHERE  state = 'active'
AND    wait_event_type IS NULL
AND    wait_event IS NULL;
```

### DBLoadMetrica della CPU
<a name="apg-waits.cpu.context.dbloadcpu"></a>

Il parametro Performance Insights per la CPU è `DBLoadCPU`. Il valore per `DBLoadCPU` può differire dal valore della CloudWatch metrica `CPUUtilization` Amazon. Quest'ultima metrica viene raccolta da un'istanza HyperVisor di database.

### Parametri di utilizzo di OS.CPU
<a name="apg-waits.cpu.context.osmetrics"></a>

I parametri del sistema operativo Performance Insights forniscono informazioni dettagliate sull'utilizzo della CPU. Ad esempio, è possibile visualizzare i seguenti parametri:
+ `os.cpuUtilization.nice.avg`
+ `os.cpuUtilization.total.avg`
+ `os.cpuUtilization.wait.avg`
+ `os.cpuUtilization.idle.avg`

Performance Insights segnala l'utilizzo della CPU da parte del motore di database come `os.cpuUtilization.nice.avg`.

### Probabile causa della pianificazione della CPU
<a name="apg-waits.cpu.context.scheduling"></a>

Dal punto di vista del sistema operativo, la CPU è attiva quando non è in esecuzione il thread inattivo. La CPU è attiva mentre esegue un calcolo, ma è attiva anche quando attende la memoria, che I/O. This type of I/O domina un tipico carico di lavoro del database.

È probabile che i processi attendano di essere pianificati su una CPU quando vengono soddisfatte le seguenti condizioni:
+ La CloudWatch `CPUUtilization` metrica è vicina al 100 percento.
+ Il carico medio è maggiore del numero di vCPUs, il che indica un carico pesante. Puoi trovare il parametro `loadAverageMinute` nella sezione parametri del sistema operativo in Performance Insights.

## Probabili cause di aumento delle attese
<a name="apg-waits.cpu.causes"></a>

Quando l'evento di attesa della CPU si verifica più del normale, probabilmente indicando un problema di prestazioni, le cause tipiche includono le seguenti.

**Topics**
+ [Probabili cause di picchi improvvisi](#apg-waits.cpu.causes.spikes)
+ [Probabili cause di alta frequenza a lungo termine](#apg-waits.cpu.causes.long-term)
+ [Casi particolari](#apg-waits.cpu.causes.corner-cases)

### Probabili cause di picchi improvvisi
<a name="apg-waits.cpu.causes.spikes"></a>

Le cause più probabili di picchi improvvisi sono le seguenti:
+ L'applicazione ha aperto troppe connessioni simultanee al database. Questo scenario è noto come «tempesta di connessione».
+ Il carico di lavoro dell'applicazione è cambiato in uno dei seguenti modi:
  + Nuove query
  + Aumento delle dimensioni del set di dati
  + Manutenzione o creazione dell'indice
  + Nuove funzioni
  + Nuovi operatori
  + Un aumento dell'esecuzione parallela di query
+ I piani di esecuzione delle query sono cambiati. In alcuni casi, un cambiamento può causare un aumento dei buffer. Ad esempio, la query ora utilizza una scansione sequenziale quando in precedenza utilizzava un indice. In questo caso, le query richiedono più CPU per raggiungere lo stesso obiettivo.

### Probabili cause di alta frequenza a lungo termine
<a name="apg-waits.cpu.causes.long-term"></a>

Le cause più probabili di eventi che si ripetono per un lungo periodo:
+ Troppi processi backend sono in esecuzione contemporaneamente sulla CPU. Questi processi possono essere lavoratori paralleli.
+ Le query vengono eseguite in modo subottimale perché necessitano di un numero elevato di buffer.

### Casi particolari
<a name="apg-waits.cpu.causes.corner-cases"></a>

Se nessuna delle cause probabili risulta essere una causa effettiva, potrebbero verificarsi le seguenti situazioni:
+ La CPU sta scambiando i processi in entrata e in uscita.
+ Il passaggio del contesto della CPU è aumentato.
+ Nel codice Aurora PostgreSQL mancano gli eventi di attesa.

## Azioni
<a name="apg-waits.cpu.actions"></a>

Se l’evento di attesa `CPU` domina l'attività del database, non indica necessariamente un problema di prestazioni. Rispondi a questo evento solo quando le prestazioni diminuiscono.

**Topics**
+ [Indagare se il database sta causando l'aumento della CPU](#apg-waits.cpu.actions.db-CPU)
+ [Determina se il numero di connessioni è aumentato](#apg-waits.cpu.actions.connections)
+ [Rispondere alle modifiche del carico di lavoro](#apg-waits.cpu.actions.workload)

### Indagare se il database sta causando l'aumento della CPU
<a name="apg-waits.cpu.actions.db-CPU"></a>

Esamina il parametro `os.cpuUtilization.nice.avg` in Performance Insights. Se questo valore è molto inferiore all'utilizzo della CPU, i processi nondatabase sono il principale contributore della CPU.

### Determina se il numero di connessioni è aumentato
<a name="apg-waits.cpu.actions.connections"></a>

Esamina la `DatabaseConnections` metrica in Amazon CloudWatch. L'azione dipende dal fatto che il numero sia aumentato o diminuito durante il periodo di aumento degli eventi di attesa della CPU.

#### Le connessioni sono aumentate
<a name="apg-waits.cpu.actions.connections.increased"></a>

Se il numero di connessioni è aumentato, confronta il numero di processi di backend che consumano CPU con il numero di v. CPUs Sono possibili i seguenti scenari:
+ Il numero di processi di backend che utilizzano la CPU è inferiore al numero di vCPUs.

  In questo caso, il numero di connessioni non è un problema. Tuttavia, è comunque possibile provare a ridurre l'utilizzo della CPU.
+ Il numero di processi di backend che utilizzano la CPU è maggiore del numero di v. CPUs

  In questo caso, valuta le seguenti opzioni:
  + Riduci il numero di processi back-end collegati al database. Ad esempio, implementa una soluzione di connection pooling come RDS Proxy. Per ulteriori informazioni, consulta [Proxy Amazon RDS per Aurora](rds-proxy.md).
  + Aggiorna la dimensione dell'istanza per ottenere un numero maggiore di vCPUs.
  + Reindirizza alcuni carichi di lavoro di sola lettura ai nodi del lettore, se applicabile.

#### Le connessioni sono aumentate
<a name="apg-waits.cpu.actions.connections.decreased"></a>

Esamina il parametro `blks_hit` in Performance Insights. Cerca una correlazione tra un aumento `blks_hit` e utilizzo CPU. Gli scenari possibili sono i seguenti:
+ Utilizzo CPU e `blks_hit` sono correlati.

  In questo caso, trova le istruzioni SQL principali collegate all'utilizzo della CPU e cerca le modifiche al piano. Puoi utilizzare una delle seguenti tecniche:
  + Spiegare i piani manualmente e confrontarli con il piano di esecuzione previsto.
  + Cercare un aumento degli hit di blocco al secondo e dei blocchi locali al secondo. Nella sezione **Top SQL** della dashboard Performance Insights, scegli **Preferenze**.
+ Utilizzo CPU e `blks_hit` non sono correlati.

  In questo caso, determinare se si verifica una delle seguenti condizioni:
  + L'applicazione si sta rapidamente connettendo e disconnettendo dal database. 

    Diagnosticare questo comportamento attivando `log_connections` e `log_disconnections`, quindi analizzando i registri PostgreSQL. Considerare l'utilizzo dell’analizzatore di log `pgbadger`. Per ulteriori informazioni, consulta [https://github.com/darold/pgbadger](https://github.com/darold/pgbadger).
  + Il sistema operativo è sovraccarico.

    In questo caso, Performance Insights mostra che i processi back-end consumano la CPU per un tempo più lungo del solito. Cerca prove nelle `os.cpuUtilization` metriche di Performance Insights o nella CloudWatch `CPUUtilization` metrica. Se il sistema operativo è sovraccarico, esamina i parametri di Enhanced Monitoring per effettuare ulteriori diagnosi. In particolare, guarda l'elenco dei processi e la percentuale di CPU consumata da ciascun processo.
  + Le istruzioni SQL principali consumano troppa CPU.

    Esaminare le istruzioni collegate all'utilizzo della CPU per verificare se possono utilizzare meno CPU. Esegui il comando `EXPLAIN` e concentrati sui nodi del piano che hanno il maggior impatto. Prendi in considerazione l'utilizzo di un visualizzatore del piano di esecuzione PostgreSQL. Per provare questo strumento, vedi [http://explain.dalibo.com/](http://explain.dalibo.com/).

### Rispondere alle modifiche del carico di lavoro
<a name="apg-waits.cpu.actions.workload"></a>

Se il carico di lavoro è cambiato, cerca i seguenti tipi di modifiche:

Nuove query  
Verifica se sono previste le nuove query. In tal caso, assicurarsi che siano previsti i piani di esecuzione e il numero di esecuzioni al secondo.

Aumento delle dimensioni del set di dati  
Determina se il partizionamento, se non è già implementato, potrebbe essere d'aiuto. Questa strategia potrebbe ridurre il numero di pagine che una query deve recuperare.

Manutenzione o creazione dell'indice  
Verificare se è previsto il programma per la manutenzione. Una best practice è pianificare le attività di manutenzione al di fuori delle attività di picco.

Nuove funzioni  
Verifica se queste funzioni funzionano come previsto durante il test. In particolare, controlla se è previsto il numero di esecuzioni al secondo.

Nuovi operatori  
Verifica se queste funzioni funzionano come previsto durante il test.

Un aumento dell'esecuzione di query parallele  
Determina se si è verificata una delle seguenti situazioni:  
+ Le relazioni o gli indici coinvolti sono improvvisamente cresciuti di dimensioni in modo che differiscano in modo significativo da `min_parallel_table_scan_size` o `min_parallel_index_scan_size`.
+ Cambiamenti recenti sono stati apportati a `parallel_setup_cost` o `parallel_tuple_cost`.
+ Cambiamenti recenti sono stati apportati a `max_parallel_workers` o `max_parallel_workers_per_gather`.

# IO: BufFileRead e IO: BufFileWrite
<a name="apg-waits.iobuffile"></a>

Gli eventi `IO:BufFileRead` e `IO:BufFileWrite` si verificano quando Aurora PostgreSQL crea file temporanei. Quando le operazioni richiedono più memoria rispetto ai parametri della memoria di lavoro attualmente definiti, scrivono dati temporanei sullo storage persistente. Questa operazione viene talvolta chiamata «*spilling to disk*». Per ulteriori informazioni sui file temporanei e sul loro utilizzo, consulta [Gestione dei file temporanei con PostgreSQL](PostgreSQL.ManagingTempFiles.md).

**Topics**
+ [Versioni del motore supportate](#apg-waits.iobuffile.context.supported)
+ [Contesto](#apg-waits.iobuffile.context)
+ [Probabili cause di aumento delle attese](#apg-waits.iobuffile.causes)
+ [Azioni](#apg-waits.iobuffile.actions)

## Versioni del motore supportate
<a name="apg-waits.iobuffile.context.supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-waits.iobuffile.context"></a>

`IO:BufFileRead` e `IO:BufFileWrite` riguardano l'area di memoria di lavoro e l'area di memoria di lavoro di manutenzione. Per ulteriori informazioni su queste aree di memoria locale, consulta [Area di memoria di lavoro](AuroraPostgreSQL.Tuning.concepts.md#AuroraPostgreSQL.Tuning.concepts.local.work_mem) e [Area memoria di lavoro di manutenzione](AuroraPostgreSQL.Tuning.concepts.md#AuroraPostgreSQL.Tuning.concepts.local.maintenance_work_mem).

Il valore predefinito per `work_mem` è 4 MB. Se una sessione esegue operazioni in parallelo, ogni lavoratore che gestisce il parallelismo utilizza 4 MB di memoria. Per questo motivo, imposta `work_mem` con attenzione. Se si aumenta troppo il valore, un database che esegue molte sessioni potrebbe consumare troppa memoria. Se si imposta il valore troppo basso, Aurora PostgreSQL crea file temporanei nella memoria locale. Il disco I/O per questi file temporanei può ridurre le prestazioni.

Se si osserva la seguente sequenza di eventi, il database potrebbe generare file temporanei:

1. Riduzione improvvisa e brusca della disponibilità

1. Ripristino rapido per lo spazio libero

Potresti vedere anche un motivo a «motosega». Questo modello può indicare che il database sta creando costantemente file di piccole dimensioni.

## Probabili cause di aumento delle attese
<a name="apg-waits.iobuffile.causes"></a>

In generale, questi eventi di attesa sono causati da operazioni che consumano più memoria rispetto a quella allocata dai parametri `work_mem` o `maintenance_work_mem`. Per compensare, le operazioni scrivono su file temporanei. Cause comuni degli eventi `IO:BufFileRead` e `IO:BufFileWrite` includono quanto segue:

**Query che richiedono più memoria di quella esistente nell'area della memoria di lavoro**  
Le query con le seguenti caratteristiche utilizzano l'area di memoria di lavoro:  
+ Hash join
+ `ORDER BY`Clausola 
+ `GROUP BY`Clausola 
+ `DISTINCT`
+ Funzioni finestra
+ `CREATE TABLE AS SELECT`
+ Aggiornamento vista materializzata

**Istruzioni che richiedono più memoria di quella esistente nell'area della memoria di lavoro di manutenzione**  
Le istruzioni seguenti utilizzano l'area di memoria di lavoro di manutenzione:  
+ `CREATE INDEX`
+ `CLUSTER`

## Azioni
<a name="apg-waits.iobuffile.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa.

**Topics**
+ [Identificare il problema](#apg-waits.iobuffile.actions.problem)
+ [Esamina le tue query di join](#apg-waits.iobuffile.actions.joins)
+ [Esamina le query ORDER BY e GROUP BY](#apg-waits.iobuffile.actions.order-by)
+ [Evitare di utilizzare l'operazione DISTINCT](#apg-waits.iobuffile.actions.distinct)
+ [Considera l'utilizzo di funzioni finestra anziché le funzioni GROUP BY](#apg-waits.iobuffile.actions.window)
+ [Indagare sulle viste materializzate e le istruzioni CTAS](#apg-waits.iobuffile.actions.mv-refresh)
+ [Usa pg\$1repack quando crei indici](#apg-waits.iobuffile.actions.pg_repack)
+ [Aumenta maintenance\$1work\$1mem quando esegui cluster](#apg-waits.iobuffile.actions.cluster)
+ [Ottimizza la memoria per prevenire IO: BufFileRead e IO: BufFileWrite](#apg-waits.iobuffile.actions.tuning-memory)

### Identificare il problema
<a name="apg-waits.iobuffile.actions.problem"></a>

È possibile visualizzare l'utilizzo dei file temporanei direttamente in Performance Insights. Per ulteriori informazioni, consulta [Visualizzazione dell’utilizzo dei file temporanei con Approfondimenti sulle prestazioni](PostgreSQL.ManagingTempFiles.Example.md). Quando Performance Insights è disabilitato, potresti notare un aumento `IO:BufFileRead` `IO:BufFileWrite` delle operazioni. Per risolvere i problemi, procedi come segue:

1. Esamina la `FreeLocalStorage` metrica in Amazon CloudWatch.

1. Cerca un motivo a motosega, che è una serie di punte frastagliate.

Un motivo a motosega indica un consumo e un rilascio rapido dello storage, spesso associato a file temporanei. Se noti questo modello, attiva Performance Insights. Quando si utilizza Performance Insights, è possibile identificare quando si verificano gli eventi di attesa e quali query sono associate. La soluzione dipende dalla query specifica che causa gli eventi.

Oppure, imposta il parametro `log_temp_files`. Questo parametro registra tutte le query che generano più della soglia KB di file temporanei. Se il valore è `0`, Aurora PostgreSQL registra tutti i file temporanei. Se il valore è `1024`, Aurora PostgreSQL registra tutte le query che producono file temporanei di dimensioni superiori a 1 MB. Per ulteriori informazioni su `log_temp_files`, consulta [Creazione di log e report di errore](https://www.postgresql.org/docs/10/runtime-config-logging.html) nella documentazione di PostgreSQL.

### Esamina le tue query di join
<a name="apg-waits.iobuffile.actions.joins"></a>

Probabilmente la tua applicazione usa join. Ad esempio, la seguente query unisce quattro tabelle.

```
SELECT * 
       FROM order 
 INNER JOIN order_item 
       ON (order.id = order_item.order_id)
 INNER JOIN customer 
       ON (customer.id = order.customer_id)
 INNER JOIN customer_address 
       ON (customer_address.customer_id = customer.id AND 
           order.customer_address_id = customer_address.id)
 WHERE customer.id = 1234567890;
```

Una possibile causa di picchi nell'utilizzo temporaneo dei file è un problema nella query stessa. Ad esempio, una clausola interrotta potrebbe non filtrare correttamente i join. Considera il secondo inner join nell'esempio seguente.

```
SELECT * 
       FROM order
 INNER JOIN order_item 
       ON (order.id = order_item.order_id)
 INNER JOIN customer 
       ON (customer.id = customer.id)
 INNER JOIN customer_address 
       ON (customer_address.customer_id = customer.id AND 
           order.customer_address_id = customer_address.id)
 WHERE customer.id = 1234567890;
```

La query precedente unisce erroneamente `customer.id` a `customer.id`, generando un prodotto cartesiano tra ogni cliente e ogni ordine. Questo tipo di join accidentale genera file temporanei di grandi dimensioni. A seconda delle dimensioni delle tabelle, una query cartesiana può anche riempire lo spazio di archiviazione. La domanda potrebbe avere join cartesiani quando vengono soddisfatte le seguenti condizioni:
+ Si notano forti e nitide riduzioni della disponibilità dello storage, seguite da un rapido ripristino.
+ Non sono in fase di creazione di indici.
+ Non vengono rilasciate istruzioni `CREATE TABLE FROM SELECT`.
+ Nessuna vista materializzata viene aggiornata.

Per verificare se le tabelle vengono unite utilizzando le chiavi appropriate, ispezionare le direttive di mappatura relazionale di query e oggetti. Tieni presente che alcune query della tua applicazione non vengono sempre chiamate e alcune query vengono generate dinamicamente.

### Esamina le query ORDER BY e GROUP BY
<a name="apg-waits.iobuffile.actions.order-by"></a>

In alcuni casi, una clausola `ORDER BY` può comportare file temporanei eccessivi. Considera le linee guida seguenti:
+ Includi solo colonne in una clausola `ORDER BY` quando devono essere ordinate. Questa linea guida è particolarmente importante per le query che restituiscono migliaia di righe e specificano molte colonne nella clausola `ORDER BY`.
+ Considerando la creazione di indici per accelerare clausole `ORDER BY` quando corrispondono a colonne che hanno lo stesso ordine crescente o decrescente. Gli indici parziali sono preferibili perché sono più piccoli. Gli indici più piccoli vengono letti e attraversati più rapidamente.
+ Se si creano indici per colonne che possono accettare valori nulli, considerare se si desidera che i valori nulli siano memorizzati alla fine o all'inizio degli indici.

  Se possibile, ridurre il numero di righe che devono essere ordinate filtrando il set di risultati. Se utilizzi istruzioni clausole o sottoquery `WITH`, ricorda che una query interna genera un set di risultati e lo passa alla query esterna. Maggiore è il numero di righe che una query può filtrare, minore è la necessità di ordinare la query.
+ Se non è necessario ottenere il set completo di risultati, utilizzare la clausola `LIMIT`. Ad esempio, se si desidera solo le prime cinque righe, una query che utilizza la clausola `LIMIT` non continua a generare risultati. In questo modo, la query richiede meno memoria e file temporanei.

Una query che utilizza una clausola `GROUP BY` può richiedere anche file temporanei. Le query `GROUP BY` riepilogano i valori utilizzando funzioni come le seguenti:
+ `COUNT`
+ `AVG`
+ `MIN`
+ `MAX`
+ `SUM`
+ `STDDEV`

Per sintonizzare le query `GROUP BY`, segui i consigli per le query `ORDER BY`.

### Evitare di utilizzare l'operazione DISTINCT
<a name="apg-waits.iobuffile.actions.distinct"></a>

Se possibile, evitare di utilizzare l’operazione `DISTINCT` per rimuovere righe duplicate. Più righe non necessarie e duplicate restituite dalla tua query, più costosa diventa l’operazione `DISTINCT`. Se possibile, aggiungi filtri nella clausola `WHERE` anche se utilizzi gli stessi filtri per tabelle diverse. Filtrare la query e unirsi correttamente migliora le prestazioni e riduce l'utilizzo delle risorse. Previene inoltre report e risultati errati.

Se devi usare `DISTINCT` per più righe di una stessa tabella, prendi in considerazione la possibilità di creare un indice composito. Il raggruppamento di più colonne in un indice può migliorare il tempo necessario per valutare righe distinte. Inoltre, se utilizzi Amazon Aurora PostgreSQL versione 10 o successiva, puoi correlare le statistiche tra più colonne utilizzando il comando `CREATE STATISTICS`.

### Considera l'utilizzo di funzioni finestra anziché le funzioni GROUP BY
<a name="apg-waits.iobuffile.actions.window"></a>

Utilizzando `GROUP BY` si modifica il set di risultati e quindi recupera il risultato aggregato. Utilizzando le funzioni della finestra, si aggregano i dati senza modificare il set di risultati. Una funzione finestra utilizza la clausola `OVER` per eseguire calcoli tra i set definiti dalla query, correlando una riga con un'altra. È possibile utilizzare tutte le funzioni `GROUP BY` nelle funzioni di finestra, ma anche funzioni come le seguenti:
+ `RANK`
+ `ARRAY_AGG`
+ `ROW_NUMBER`
+ `LAG`
+ `LEAD`

Per ridurre al minimo il numero di file temporanei generati da una funzione di finestra, rimuovere le duplicazioni per lo stesso set di risultati quando sono necessarie due aggregazioni distinte. Considera la query seguente.

```
SELECT sum(salary) OVER (PARTITION BY dept ORDER BY salary DESC) as sum_salary
     , avg(salary) OVER (PARTITION BY dept ORDER BY salary ASC) as avg_salary
  FROM empsalary;
```

È possibile riscrivere la query con la clausola `WINDOW` come segue.

```
SELECT sum(salary) OVER w as sum_salary
         , avg(salary) OVER w as_avg_salary
    FROM empsalary
  WINDOW w AS (PARTITION BY dept ORDER BY salary DESC);
```

Per impostazione predefinita, il planner di esecuzione Aurora PostgreSQL consolida nodi simili in modo da non duplicare le operazioni. Tuttavia, utilizzando una dichiarazione esplicita per il blocco finestra, è possibile mantenere la query più facilmente. È inoltre possibile migliorare le prestazioni impedendo la duplicazione.

### Indagare sulle viste materializzate e le istruzioni CTAS
<a name="apg-waits.iobuffile.actions.mv-refresh"></a>

Quando una vista materializzata si aggiorna, esegue una query. Questa query può contenere un'operazione come `GROUP BY`, `ORDER BY` oppure`DISTINCT`. Durante un aggiornamento, è possibile osservare un numero elevato di file temporanei e gli eventi di attesa `IO:BufFileWrite` e `IO:BufFileRead`. Allo stesso modo, quando crei una tabella basata su una dichiarazione `SELECT`, l'istruzione `CREATE TABLE` esegue una query. Per ridurre i file temporanei necessari, ottimizza la query.

### Usa pg\$1repack quando crei indici
<a name="apg-waits.iobuffile.actions.pg_repack"></a>

Quando crei un indice, il motore ordina il set di risultati. Man mano che le tabelle aumentano di dimensioni e man mano che i valori nella colonna indicizzata diventano più diversi, i file temporanei richiedono più spazio. Nella maggior parte dei casi, non è possibile impedire la creazione di file temporanei per tabelle di grandi dimensioni senza modificare l'area della memoria di lavoro di manutenzione. Per ulteriori informazioni, consulta [Area memoria di lavoro di manutenzione](AuroraPostgreSQL.Tuning.concepts.md#AuroraPostgreSQL.Tuning.concepts.local.maintenance_work_mem). 

Una possibile soluzione alternativa quando si ricrea un indice di grandi dimensioni consiste nell'utilizzare lo strumento pg\$1repack. Per ulteriori informazioni, consulta [Riorganizzare le tabelle nei database PostgreSQL con blocchi minimi](https://reorg.github.io/pg_repack/) nella documentazione di pg\$1repack.

### Aumenta maintenance\$1work\$1mem quando esegui cluster
<a name="apg-waits.iobuffile.actions.cluster"></a>

Il comando `CLUSTER` raggruppa la tabella specificata da *table\$1name* in base a un indice esistente specificato da *index\$1name*. Aurora PostgreSQL ricrea fisicamente la tabella in modo che corrisponda all'ordine di un determinato indice.

Quando lo storage magnetico era prevalente, il clustering era comune perché il throughput di storage era limitato. Ora che lo storage basato su SSD è comune, il clustering è meno popolare. Tuttavia, se si raggruppano le tabelle, è comunque possibile aumentare leggermente le prestazioni a seconda delle dimensioni della tabella, dell'indice, della query e così via. 

Se esegui il comando `CLUSTER` e osservi gli eventi di attesa `IO:BufFileWrite` e `IO:BufFileRead`, sintonizza `maintenance_work_mem`. Aumenta la dimensione della memoria a una quantità abbastanza grande. Un valore elevato significa che il motore può utilizzare più memoria per l'operazione di clustering.

### Ottimizza la memoria per prevenire IO: BufFileRead e IO: BufFileWrite
<a name="apg-waits.iobuffile.actions.tuning-memory"></a>

In alcune situazioni, è necessario sintonizzare la memoria. Il tuo obiettivo è quello di bilanciare i seguenti requisiti:
+ Il valore `work_mem` (vedi [Area di memoria di lavoro](AuroraPostgreSQL.Tuning.concepts.md#AuroraPostgreSQL.Tuning.concepts.local.work_mem))
+ La memoria rimanente dopo aver scontato il valore `shared_buffers` (vedi [Pool di buffer](AuroraMySQL.Managing.Tuning.concepts.md#AuroraMySQL.Managing.Tuning.concepts.memory.buffer-pool))
+ Le connessioni massime aperte e in uso, limitate da `max_connections`

#### Aumentare le dimensioni dell'area di memoria di lavoro
<a name="apg-waits.iobuffile.actions.tuning-memory.work-mem"></a>

In alcune situazioni, l'unica opzione è aumentare la memoria utilizzata dalla sessione. Se le tue query sono scritte correttamente e utilizzano i tasti corretti per i join, prendi in considerazione la possibilità di aumentare il valore `work_mem`. Per ulteriori informazioni, consulta [Area di memoria di lavoro](AuroraPostgreSQL.Tuning.concepts.md#AuroraPostgreSQL.Tuning.concepts.local.work_mem).

Per scoprire quanti file temporanei genera una query, imposta `log_temp_files` su `0`. Aumentando il valore `work_mem` al valore massimo identificato nei log, si impedisce alla query di generare file temporanei. Tuttavia, `work_mem` imposta il massimo per nodo piano per ogni connessione o operatore parallelo. Se il database ha 5.000 connessioni e se ciascuna utilizza una memoria di 256 MiB, il motore necessita di 1,2 TiB di RAM. Pertanto, la tua istanza potrebbe esaurirsi dalla memoria.

#### Riserva una memoria sufficiente per il buffer pool condiviso
<a name="apg-waits.iobuffile.actions.tuning-memory.shared-pool"></a>

Il database utilizza aree di memoria come il buffer pool condiviso, non solo l'area di memoria di lavoro. Considerare i requisiti di queste aree di memoria aggiuntive prima di aumentare `work_mem`. Per ulteriori informazioni sul pool di buffer, consulta [Pool di buffer](AuroraMySQL.Managing.Tuning.concepts.md#AuroraMySQL.Managing.Tuning.concepts.memory.buffer-pool).

Ad esempio, supponiamo che la classe di istanza Aurora PostgreSQL sia db.r5.2xlarge. Questa classe ha 64 GiB di memoria. Per impostazione predefinita, il 75% della memoria è riservato al buffer pool condiviso. Dopo aver sottratto la quantità allocata all'area di memoria condivisa, rimangono 16.384 MB. Non allocare la memoria rimanente esclusivamente all'area della memoria di lavoro perché anche il sistema operativo e il motore richiedono memoria.

La memoria a cui è possibile allocare per `work_mem` dipende dalla classe di istanza. Se si utilizza una classe di istanza più grande, è disponibile più memoria. Tuttavia, nell'esempio precedente, non è possibile utilizzare più di 16 GiB. In caso contrario, la tua istanza diventa non disponibile quando esaurisce la memoria. Per ripristinare l'istanza dallo stato non disponibile, i servizi di automazione Aurora PostgreSQL si riavviano automaticamente.

#### Gestisci il numero di connessioni
<a name="apg-waits.iobuffile.actions.tuning-memory.connections"></a>

Supponiamo che l'istanza del database disponga di 5.000 connessioni simultanee. Ogni connessione utilizza almeno 4 MiB di `work_mem`. L'elevato consumo di memoria delle connessioni rischia di peggiorare le prestazioni. Sono disponibili le seguenti opzioni:
+ Eseguire l'aggiornamento a una classe di istanza più grande
+ Diminuire il numero di connessioni simultanee al database utilizzando un proxy o un pool di connessioni.

Per i proxy, considera Amazon RDS Proxy, PGBouncer o un connection pooler basato sulla tua applicazione. Questa soluzione riduce il carico della CPU. Riduce inoltre il rischio quando tutte le connessioni richiedono l'area di memoria di lavoro. Quando esistono meno connessioni al database, è possibile aumentare il valore di `work_mem`. In questo modo, si riduce il verificarsi degli eventi di attesa `IO:BufFileRead` e `IO:BufFileWrite`. Inoltre, le query in attesa dell'area di memoria di lavoro accelerano in modo significativo.

# IO: DataFileRead
<a name="apg-waits.iodatafileread"></a>

L’evento `IO:DataFileRead` si verifica quando una connessione attende un processo di back-end per leggere una pagina richiesta dalla memoria perché la pagina non è disponibile nella memoria condivisa.

**Topics**
+ [Versioni del motore supportate](#apg-waits.iodatafileread.context.supported)
+ [Contesto](#apg-waits.iodatafileread.context)
+ [Probabili cause di aumento delle attese](#apg-waits.iodatafileread.causes)
+ [Azioni](#apg-waits.iodatafileread.actions)

## Versioni del motore supportate
<a name="apg-waits.iodatafileread.context.supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-waits.iodatafileread.context"></a>

Tutte le query e le operazioni di manipolazione dei dati (DML) accedono alle pagine del buffer pool. Le dichiarazioni che possono indurre letture includono `SELECT`, `UPDATE` e `DELETE`. Ad esempio, un `UPDATE` può leggere pagine da tabelle o indici. Se la pagina richiesta o aggiornata non si trova nel buffer pool condiviso, questa lettura può portare all’evento `IO:DataFileRead`.

Poiché il buffer pool condiviso è finito, può essere riempito. In questo caso, le richieste di pagine che non sono in memoria impongono al database di leggere i blocchi dal disco. Se l’evento `IO:DataFileRead` si verifica frequentemente, il buffer pool condiviso potrebbe essere troppo piccolo per adattarsi al carico di lavoro. Questo problema è particolarmente grave per le query `SELECT` che leggono un numero elevato di righe che non rientrano nel buffer pool. Per ulteriori informazioni sul pool di buffer, consulta [Pool di buffer](AuroraMySQL.Managing.Tuning.concepts.md#AuroraMySQL.Managing.Tuning.concepts.memory.buffer-pool).

## Probabili cause di aumento delle attese
<a name="apg-waits.iodatafileread.causes"></a>

Cause comuni dell’evento `IO:DataFileRead` includono quanto segue:

**Picchi di connessione**  
Potresti trovare più connessioni che generano lo stesso numero di eventi IO: DataFileRead wait. In questo caso, può verificarsi un picco (aumento improvviso e grande) negli eventi `IO:DataFileRead`. 

**Le istruzioni SELECT e DML eseguono scansioni sequenziali**  
L'applicazione potrebbe aver eseguito una nuova operazione. Oppure un'operazione esistente potrebbe cambiare a causa di un nuovo piano di esecuzione. In questi casi, cerca tabelle (in particolare tabelle di grandi dimensioni) che abbiano un valore `seq_scan` maggiore. Puoi trovarli interrogando `pg_stat_user_tables`. Per tenere traccia delle query che generano più operazioni di lettura, utilizzare l'estensione `pg_stat_statements`.

**CTAS e CREATE INDEX per set di dati di grandi dimensioni**  
Un *CTAS* è una `CREATE TABLE AS SELECT`dichiarazione. Se si esegue un CTAS utilizzando un set di dati di grandi dimensioni come origine o si crea un indice su una tabella di grandi dimensioni, l’evento `IO:DataFileRead` può verificarsi. Quando si crea un indice, il database potrebbe dover leggere l'intero oggetto utilizzando una scansione sequenziale. Un CTAS genera letture `IO:DataFile` quando le pagine non sono in memoria.

**Diversi lavoratori sottovuoto in esecuzione contemporaneamente**  
Gli operatori del vuoto possono essere attivati manualmente o automaticamente. Raccomandiamo di adottare una strategia aggressiva per il vuoto. Tuttavia, quando una tabella contiene molte righe aggiornate o cancellate, l’attesa `IO:DataFileRead` aumenta. Dopo aver recuperato lo spazio, il tempo dedicato al vuoto su `IO:DataFileRead` diminuisce.

**Ingresso di grandi quantità di dati**  
Quando l'applicazione acquisisce quantità di dati elevate, le operazioni `ANALYZE` potrebbero verificarsi più spesso. Il processo `ANALYZE` può essere attivato da un launcher automatico o richiamato manualmente.  
L’operazione `ANALYZE` legge un sottoinsieme della tabella. Il numero di pagine che devono essere scansionate viene calcolato moltiplicando 30 per il valore `default_statistics_target`. Per ulteriori informazioni, consultare la [documentazione di PostgreSQL](https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-DEFAULT-STATISTICS-TARGET). Il parametro `default_statistics_target` accetta valori compresi tra 1 e 10.000, dove il valore predefinito è 100.

**Fame di risorse**  
Se si consuma la larghezza di banda di rete dell'istanza o la CPU, l'evento `IO:DataFileRead` potrebbe verificarsi più frequentemente.

## Azioni
<a name="apg-waits.iodatafileread.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa.

**Topics**
+ [Controlla i filtri predicati per le query che generano attese](#apg-waits.iodatafileread.actions.filters)
+ [Riduci al minimo l'effetto delle operazioni di manutenzione](#apg-waits.iodatafileread.actions.maintenance)
+ [Rispondere a un numero elevato di connessioni](#apg-waits.iodatafileread.actions.connections)

### Controlla i filtri predicati per le query che generano attese
<a name="apg-waits.iodatafileread.actions.filters"></a>

Supponiamo di identificare query specifiche che stanno generando eventi di attesa `IO:DataFileRead`. È possibile identificarli utilizzando le seguenti tecniche:
+ Approfondimenti sulle prestazioni
+ Viste catalogo come quella fornita dall'estensione `pg_stat_statements`
+ La vista catalogo `pg_stat_all_tables`, se mostra periodicamente un numero maggiore di letture fisiche
+ La vista `pg_statio_all_tables`, se lo mostra che i contatori `_read` sono in aumento

Si consiglia di determinare quali filtri vengono utilizzati nel predicato (clausola `WHERE`) di queste query. Seguire queste linee guida:
+ Esegui il comando `EXPLAIN`. Nell'output, identificare quali tipi di scansioni vengono utilizzati. Una scansione sequenziale non indica necessariamente che ci sia un problema. Le query che utilizzano scansioni sequenziali producono naturalmente più eventi `IO:DataFileRead` rispetto alle query che utilizzano filtri.

  Scopri se la colonna elencata nella clausola `WHERE` è indicizzata. In caso contrario, prendi in considerazione la possibilità di creare un indice per questa colonna. Questo approccio evita le scansioni sequenziali e riduce gli eventi `IO:DataFileRead`. Se una query dispone di filtri restrittivi e continua a produrre scansioni sequenziali, valutare se vengono utilizzati gli indici appropriati.
+ Scopri se la query sta accedendo a una tabella molto ampia. In alcuni casi, il partizionamento di una tabella può migliorare le prestazioni, consentendo alla query di leggere solo le partizioni necessarie.
+ Esamina la cardinalità (numero totale di righe) dalle operazioni di join. Nota quanto sono restrittivi i valori che stai passando nei filtri per la tua clausola `WHERE`. Se possibile, sintonizza la query per ridurre il numero di righe passate in ogni fase del piano.

### Riduci al minimo l'effetto delle operazioni di manutenzione
<a name="apg-waits.iodatafileread.actions.maintenance"></a>

Operazioni di manutenzione come `VACUUM` e `ANALYZE` sono importanti. Si consiglia di non spegnerli qualora vengano trovati eventi di attesa `IO:DataFileRead` relativi a queste operazioni di manutenzione. I seguenti approcci possono ridurre al minimo l’effetto di queste operazioni:
+ Eseguire manualmente le operazioni di manutenzione durante le ore non di punta. Questa tecnica impedisce al database di raggiungere la soglia per le operazioni automatiche.
+ Per tabelle molto grandi, prendi in considerazione il partizionamento. Questa tecnica riduce il sovraccarico delle operazioni di manutenzione. Il database accede solo alle partizioni che richiedono manutenzione.
+ Quando si acquisiscono grandi quantità di dati, prendere in considerazione la possibilità di disabilitare la funzione di analisi automatica.

La funzione autovacuum viene attivata automaticamente per una tabella quando la formula seguente è vera.

```
pg_stat_user_tables.n_dead_tup > (pg_class.reltuples x autovacuum_vacuum_scale_factor) + autovacuum_vacuum_threshold
```

La vista `pg_stat_user_tables` e il catalogo `pg_class` hanno più righe. Una riga può corrispondere a una riga della tabella. Questa formula presuppone che i `reltuples` sono per una tabella specifica. I parametri `autovacuum_vacuum_scale_factor` (0,20 per impostazione predefinita) e `autovacuum_vacuum_threshold` (50 tuple per impostazione predefinita) sono generalmente impostate globalmente per l'intera istanza. Tuttavia, è possibile impostare valori diversi per una tabella specifica.

**Topics**
+ [Ricerca delle tabelle che consumano spazio inutile](#apg-waits.iodatafileread.actions.maintenance.tables)
+ [Trova tabelle che consumano spazio inutile](#apg-waits.iodatafileread.actions.maintenance.indexes)
+ [Trova tabelle idonee per l'autovacuum](#apg-waits.iodatafileread.actions.maintenance.autovacuumed)

#### Ricerca delle tabelle che consumano spazio inutile
<a name="apg-waits.iodatafileread.actions.maintenance.tables"></a>

Per trovare le tabelle che consumano spazio più del necessario, esegui la query riportata di seguito. Quando questa query viene eseguita da un utente del database che non ha il ruolo `rds_superuser`, restituisce informazioni solo sulle tabelle per cui il ruolo utente ha le autorizzazioni di lettura. Questa query è supportata da PostgreSQL 12 e versioni successive. 

```
WITH report AS (
   SELECT   schemaname
           ,tblname
           ,n_dead_tup
           ,n_live_tup
           ,block_size*tblpages AS real_size
           ,(tblpages-est_tblpages)*block_size AS extra_size
           ,CASE WHEN tblpages - est_tblpages > 0
              THEN 100 * (tblpages - est_tblpages)/tblpages::float
              ELSE 0
            END AS extra_ratio, fillfactor, (tblpages-est_tblpages_ff)*block_size AS bloat_size
           ,CASE WHEN tblpages - est_tblpages_ff > 0
              THEN 100 * (tblpages - est_tblpages_ff)/tblpages::float
              ELSE 0
            END AS bloat_ratio
           ,is_na
    FROM (
           SELECT  ceil( reltuples / ( (block_size-page_hdr)/tpl_size ) ) + ceil( toasttuples / 4 ) AS est_tblpages
                  ,ceil( reltuples / ( (block_size-page_hdr)*fillfactor/(tpl_size*100) ) ) + ceil( toasttuples / 4 ) AS est_tblpages_ff
                  ,tblpages
                  ,fillfactor
                  ,block_size
                  ,tblid
                  ,schemaname
                  ,tblname
                  ,n_dead_tup
                  ,n_live_tup
                  ,heappages
                  ,toastpages
                  ,is_na
             FROM (
                    SELECT ( 4 + tpl_hdr_size + tpl_data_size + (2*ma)
                               - CASE WHEN tpl_hdr_size%ma = 0 THEN ma ELSE tpl_hdr_size%ma END
                               - CASE WHEN ceil(tpl_data_size)::int%ma = 0 THEN ma ELSE ceil(tpl_data_size)::int%ma END
                           ) AS tpl_size
                           ,block_size - page_hdr AS size_per_block
                           ,(heappages + toastpages) AS tblpages
                           ,heappages
                           ,toastpages
                           ,reltuples
                           ,toasttuples
                           ,block_size
                           ,page_hdr
                           ,tblid
                           ,schemaname
                           ,tblname
                           ,fillfactor
                           ,is_na
                           ,n_dead_tup
                           ,n_live_tup
                          FROM (
                                SELECT  tbl.oid                       AS tblid
                                       ,ns.nspname                    AS schemaname
                                       ,tbl.relname                   AS tblname
                                       ,tbl.reltuples                 AS reltuples
                                       ,tbl.relpages                  AS heappages
                                       ,coalesce(toast.relpages, 0)   AS toastpages
                                       ,coalesce(toast.reltuples, 0)  AS toasttuples
                                       ,psat.n_dead_tup               AS n_dead_tup
                                       ,psat.n_live_tup               AS n_live_tup
                                       ,24                            AS page_hdr
                                       ,current_setting('block_size')::numeric AS block_size
                                       ,coalesce(substring( array_to_string(tbl.reloptions, ' ') FROM 'fillfactor=([0-9]+)')::smallint, 100) AS fillfactor
                                       ,CASE WHEN version()~'mingw32' OR version()~'64-bit|x86_64|ppc64|ia64|amd64' THEN 8 ELSE 4 END        AS ma
                                       ,23 + CASE WHEN MAX(coalesce(null_frac,0)) > 0 THEN ( 7 + count(*) ) / 8 ELSE 0::int END              AS tpl_hdr_size
                                       ,sum( (1-coalesce(s.null_frac, 0)) * coalesce(s.avg_width, 1024) )                                    AS tpl_data_size
                                       ,bool_or(att.atttypid = 'pg_catalog.name'::regtype) OR count(att.attname) <> count(s.attname)         AS is_na
                                  FROM  pg_attribute       AS att
                                  JOIN  pg_class           AS tbl    ON (att.attrelid = tbl.oid)
                                  JOIN  pg_stat_all_tables AS psat   ON (tbl.oid = psat.relid)
                                  JOIN  pg_namespace       AS ns     ON (ns.oid = tbl.relnamespace)
                             LEFT JOIN  pg_stats           AS s      ON (s.schemaname=ns.nspname AND s.tablename = tbl.relname AND s.inherited=false AND s.attname=att.attname)
                             LEFT JOIN  pg_class           AS toast  ON (tbl.reltoastrelid = toast.oid)
                                 WHERE  att.attnum > 0
                                   AND  NOT att.attisdropped
                                   AND  tbl.relkind = 'r'
                              GROUP BY  tbl.oid, ns.nspname, tbl.relname, tbl.reltuples, tbl.relpages, toastpages, toasttuples, fillfactor, block_size, ma, n_dead_tup, n_live_tup
                              ORDER BY  schemaname, tblname
                           ) AS s
                 ) AS s2
       ) AS s3
 ORDER BY bloat_size DESC
)
  SELECT * 
    FROM report 
   WHERE bloat_ratio != 0
 -- AND schemaname = 'public'
 -- AND tblname = 'pgbench_accounts'
;

-- WHERE NOT is_na
--   AND tblpages*((pst).free_percent + (pst).dead_tuple_percent)::float4/100 >= 1
```

Puoi verificare l'aumento delle dimensioni della tabella e dell'indice nell'applicazione. Per ulteriori informazioni, consulta [Diagnosi delle dimensioni della tabella e dell'indice](AuroraPostgreSQL.diag-table-ind-bloat.md).

#### Trova tabelle che consumano spazio inutile
<a name="apg-waits.iodatafileread.actions.maintenance.indexes"></a>

Per trovare tabelle che richiedono spazio inutile, esegui la query riportata.

```
-- WARNING: run with a nonsuperuser role, the query inspects
-- only indexes on tables you have permissions to read.
-- WARNING: rows with is_na = 't' are known to have bad statistics ("name" type is not supported).
-- This query is compatible with PostgreSQL 8.2 and later.

SELECT current_database(), nspname AS schemaname, tblname, idxname, bs*(relpages)::bigint AS real_size,
  bs*(relpages-est_pages)::bigint AS extra_size,
  100 * (relpages-est_pages)::float / relpages AS extra_ratio,
  fillfactor, bs*(relpages-est_pages_ff) AS bloat_size,
  100 * (relpages-est_pages_ff)::float / relpages AS bloat_ratio,
  is_na
  -- , 100-(sub.pst).avg_leaf_density, est_pages, index_tuple_hdr_bm, 
  -- maxalign, pagehdr, nulldatawidth, nulldatahdrwidth, sub.reltuples, sub.relpages 
  -- (DEBUG INFO)
FROM (
  SELECT coalesce(1 +
       ceil(reltuples/floor((bs-pageopqdata-pagehdr)/(4+nulldatahdrwidth)::float)), 0 
       -- ItemIdData size + computed avg size of a tuple (nulldatahdrwidth)
    ) AS est_pages,
    coalesce(1 +
       ceil(reltuples/floor((bs-pageopqdata-pagehdr)*fillfactor/(100*(4+nulldatahdrwidth)::float))), 0
    ) AS est_pages_ff,
    bs, nspname, table_oid, tblname, idxname, relpages, fillfactor, is_na
    -- , stattuple.pgstatindex(quote_ident(nspname)||'.'||quote_ident(idxname)) AS pst, 
    -- index_tuple_hdr_bm, maxalign, pagehdr, nulldatawidth, nulldatahdrwidth, reltuples 
    -- (DEBUG INFO)
  FROM (
    SELECT maxalign, bs, nspname, tblname, idxname, reltuples, relpages, relam, table_oid, fillfactor,
      ( index_tuple_hdr_bm +
          maxalign - CASE -- Add padding to the index tuple header to align on MAXALIGN
            WHEN index_tuple_hdr_bm%maxalign = 0 THEN maxalign
            ELSE index_tuple_hdr_bm%maxalign
          END
        + nulldatawidth + maxalign - CASE -- Add padding to the data to align on MAXALIGN
            WHEN nulldatawidth = 0 THEN 0
            WHEN nulldatawidth::integer%maxalign = 0 THEN maxalign
            ELSE nulldatawidth::integer%maxalign
          END
      )::numeric AS nulldatahdrwidth, pagehdr, pageopqdata, is_na
      -- , index_tuple_hdr_bm, nulldatawidth -- (DEBUG INFO)
    FROM (
      SELECT
        i.nspname, i.tblname, i.idxname, i.reltuples, i.relpages, i.relam, a.attrelid AS table_oid,
        current_setting('block_size')::numeric AS bs, fillfactor,
        CASE -- MAXALIGN: 4 on 32bits, 8 on 64bits (and mingw32 ?)
          WHEN version() ~ 'mingw32' OR version() ~ '64-bit|x86_64|ppc64|ia64|amd64' THEN 8
          ELSE 4
        END AS maxalign,
        /* per page header, fixed size: 20 for 7.X, 24 for others */
        24 AS pagehdr,
        /* per page btree opaque data */
        16 AS pageopqdata,
        /* per tuple header: add IndexAttributeBitMapData if some cols are null-able */
        CASE WHEN max(coalesce(s.null_frac,0)) = 0
          THEN 2 -- IndexTupleData size
          ELSE 2 + (( 32 + 8 - 1 ) / 8) 
          -- IndexTupleData size + IndexAttributeBitMapData size ( max num filed per index + 8 - 1 /8)
        END AS index_tuple_hdr_bm,
        /* data len: we remove null values save space using it fractionnal part from stats */
        sum( (1-coalesce(s.null_frac, 0)) * coalesce(s.avg_width, 1024)) AS nulldatawidth,
        max( CASE WHEN a.atttypid = 'pg_catalog.name'::regtype THEN 1 ELSE 0 END ) > 0 AS is_na
      FROM pg_attribute AS a
        JOIN (
          SELECT nspname, tbl.relname AS tblname, idx.relname AS idxname, 
            idx.reltuples, idx.relpages, idx.relam,
            indrelid, indexrelid, indkey::smallint[] AS attnum,
            coalesce(substring(
              array_to_string(idx.reloptions, ' ')
               from 'fillfactor=([0-9]+)')::smallint, 90) AS fillfactor
          FROM pg_index
            JOIN pg_class idx ON idx.oid=pg_index.indexrelid
            JOIN pg_class tbl ON tbl.oid=pg_index.indrelid
            JOIN pg_namespace ON pg_namespace.oid = idx.relnamespace
          WHERE pg_index.indisvalid AND tbl.relkind = 'r' AND idx.relpages > 0
        ) AS i ON a.attrelid = i.indexrelid
        JOIN pg_stats AS s ON s.schemaname = i.nspname
          AND ((s.tablename = i.tblname AND s.attname = pg_catalog.pg_get_indexdef(a.attrelid, a.attnum, TRUE)) 
          -- stats from tbl
          OR  (s.tablename = i.idxname AND s.attname = a.attname))
          -- stats from functionnal cols
        JOIN pg_type AS t ON a.atttypid = t.oid
      WHERE a.attnum > 0
      GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9
    ) AS s1
  ) AS s2
    JOIN pg_am am ON s2.relam = am.oid WHERE am.amname = 'btree'
) AS sub
-- WHERE NOT is_na
ORDER BY 2,3,4;
```

#### Trova tabelle idonee per l'autovacuum
<a name="apg-waits.iodatafileread.actions.maintenance.autovacuumed"></a>

Per trovare tabelle idonee per l'autovacuum, esegui la query riportata.

```
--This query shows tables that need vacuuming and are eligible candidates.
--The following query lists all tables that are due to be processed by autovacuum. 
-- During normal operation, this query should return very little.
WITH  vbt AS (SELECT setting AS autovacuum_vacuum_threshold 
              FROM pg_settings WHERE name = 'autovacuum_vacuum_threshold')
    , vsf AS (SELECT setting AS autovacuum_vacuum_scale_factor 
              FROM pg_settings WHERE name = 'autovacuum_vacuum_scale_factor')
    , fma AS (SELECT setting AS autovacuum_freeze_max_age 
              FROM pg_settings WHERE name = 'autovacuum_freeze_max_age')
    , sto AS (SELECT opt_oid, split_part(setting, '=', 1) as param, 
                split_part(setting, '=', 2) as value 
              FROM (SELECT oid opt_oid, unnest(reloptions) setting FROM pg_class) opt)
SELECT
    '"'||ns.nspname||'"."'||c.relname||'"' as relation
    , pg_size_pretty(pg_table_size(c.oid)) as table_size
    , age(relfrozenxid) as xid_age
    , coalesce(cfma.value::float, autovacuum_freeze_max_age::float) autovacuum_freeze_max_age
    , (coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) + 
         coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) * c.reltuples) 
         as autovacuum_vacuum_tuples
    , n_dead_tup as dead_tuples
FROM pg_class c 
JOIN pg_namespace ns ON ns.oid = c.relnamespace
JOIN pg_stat_all_tables stat ON stat.relid = c.oid
JOIN vbt on (1=1) 
JOIN vsf ON (1=1) 
JOIN fma on (1=1)
LEFT JOIN sto cvbt ON cvbt.param = 'autovacuum_vacuum_threshold' AND c.oid = cvbt.opt_oid
LEFT JOIN sto cvsf ON cvsf.param = 'autovacuum_vacuum_scale_factor' AND c.oid = cvsf.opt_oid
LEFT JOIN sto cfma ON cfma.param = 'autovacuum_freeze_max_age' AND c.oid = cfma.opt_oid
WHERE c.relkind = 'r' 
AND nspname <> 'pg_catalog'
AND (
    age(relfrozenxid) >= coalesce(cfma.value::float, autovacuum_freeze_max_age::float)
    or
    coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) + 
      coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) * c.reltuples <= n_dead_tup
    -- or 1 = 1
)
ORDER BY age(relfrozenxid) DESC;
```

### Rispondere a un numero elevato di connessioni
<a name="apg-waits.iodatafileread.actions.connections"></a>

Quando monitori Amazon CloudWatch, potresti scoprire che la `DatabaseConnections` metrica aumenta. Questo aumento indica un numero maggiore di connessioni al database. Consigliamo quanto segue:
+ Limita il numero di connessioni che l'applicazione può aprire con ciascuna istanza. Se l'applicazione dispone di una funzione di connection pool incorporata, impostare un numero ragionevole di connessioni. Basa il numero su ciò che la v della tua istanza può parallelizzare CPUs in modo efficace.

  Se l’applicazione non utilizza una funzione di connection pool, considera l'utilizzo di Amazon RDS Proxy o un'alternativa. Questo approccio consente all'applicazione di aprire più connessioni con il bilanciamento del carico. Il bilanciatore può quindi aprire un numero limitato di connessioni con il database. Poiché un numero inferiore di connessioni sono in esecuzione in parallelo, l'istanza DB esegue meno commutazione di contesto nel kernel. Le query dovrebbero progredire più velocemente, causando un minor numero di eventi di attesa. Per ulteriori informazioni, consulta [Proxy Amazon RDS per Aurora](rds-proxy.md).
+ Quando possibile, approfitta dei nodi di lettore per Aurora PostgreSQL e leggi le repliche per RDS per PostgreSQL. Quando l'applicazione esegue un'operazione di sola lettura, inviare queste richieste all'endpoint di sola lettura. Questa tecnica distribuisce le richieste delle applicazioni su tutti i nodi di lettura, riducendo la I/O pressione sul nodo writer.
+ Prendi in considerazione la possibilità di scalare l'istanza database. Una classe di istanza a maggiore capacità fornisce più memoria, il che offre ad Aurora PostgreSQL un buffer pool condiviso più ampio per contenere le pagine. Le dimensioni maggiori offrono inoltre all'istanza DB una maggiore capacità CPUs di gestire le connessioni. More v CPUs sono particolarmente utili quando le operazioni che generano eventi di `IO:DataFileRead` attesa sono scritture.

# IO:XactSync
<a name="apg-waits.xactsync"></a>

L’evento `IO:XactSync` si verifica quando un processo di backend è in attesa che il sottosistema di storage Aurora riconosca il commit di una transazione regolare o il commit o il rollback di una transazione preparata. Una transazione preparata fa parte del supporto di PostgreSQL per un commit in due fasi. Questo evento può verificarsi anche quando una query è in attesa del commit di un’altra transazione, in particolare nei casi in cui il commit automatico è disattivato. In tali scenari, potrebbe sembrare che gli aggiornamenti siano in attesa di XactSync anche se non sono ancora stati eseguiti.

**Topics**
+ [Versioni del motore supportate](#apg-waits.xactsync.context.supported)
+ [Contesto](#apg-waits.xactsync.context)
+ [Probabili cause di aumento delle attese](#apg-waits.xactsync.causes)
+ [Azioni](#apg-waits.xactsync.actions)

## Versioni del motore supportate
<a name="apg-waits.xactsync.context.supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-waits.xactsync.context"></a>

L’evento `IO:XactSync` indica che l’istanza sta dedicando tempo ad aspettare che il sottosistema di storage Aurora confermi che i dati delle transazioni sono stati elaborati.

## Probabili cause di aumento delle attese
<a name="apg-waits.xactsync.causes"></a>

Quando l’evento `IO:XactSync` si verifica più del normale, probabilmente indicando un problema di prestazioni, le cause tipiche includono le seguenti.

**Saturazione di rete**  
Il traffico tra i client e l’istanza database o il traffico verso il sottosistema di storage potrebbe essere troppo pesante per la larghezza di banda della rete.

**Pressione della CPU**  
Un carico di lavoro pesante potrebbe impedire al daemon di archiviazione Aurora di ottenere un tempo sufficiente per la CPU.

## Azioni
<a name="apg-waits.xactsync.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa.

**Topics**
+ [Monitoraggio delle risorse](#apg-waits.xactsync.actions.monitor)
+ [Ridimensionamento della CPU](#apg-waits.xactsync.actions.scalecpu)
+ [Aumentare la larghezza di banda di rete](#apg-waits.xactsync.actions.scalenetwork)
+ [Riduzione del numero di commit](#apg-waits.xactsync.actions.commits)

### Monitoraggio delle risorse
<a name="apg-waits.xactsync.actions.monitor"></a>

Per determinare la causa dell’aumento degli eventi `IO:XactSync`, controlla i seguenti parametri:
+ `WriteThroughput` e `CommitThroughput` — Le modifiche del throughput di scrittura o del throughput di commit possono mostrare un aumento del carico di lavoro.
+ `WriteLatency` e `CommitLatency` — Le modifiche alla latenza di scrittura o alla latenza di commit possono mostrare che al sottosistema di storage viene chiesto di svolgere più lavoro.
+ `CPUUtilization` — Se l’utilizzo della CPU dell’istanza è superiore al 90%, il daemon di archiviazione Aurora potrebbe non avere tempo sufficiente per la CPU. In questo caso, le prestazioni I/O diminuiscono.

Per ulteriori informazioni su questi parametri, consulta [Parametri a livello di istanza per Amazon Aurora](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances).

### Ridimensionamento della CPU
<a name="apg-waits.xactsync.actions.scalecpu"></a>

Per risolvere i problemi di fame della CPU, prendi in considerazione la possibilità di passare a un tipo di istanza con maggiore capacità della CPU. Per informazioni sulla capacità della CPU per una classe di istanza database, consulta [Specifiche hardware per le classi di istanze DB per Aurora](Concepts.DBInstanceClass.Summary.md).

### Aumentare la larghezza di banda di rete
<a name="apg-waits.xactsync.actions.scalenetwork"></a>

Per determinare se l’istanza sta raggiungendo i limiti di larghezza di banda di rete, verificare la presenza degli altri eventi di attesa seguenti: 
+ `IO:DataFileRead`, `IO:BufferRead`, `IO:BufferWrite` e `IO:XactWrite` — Le query che utilizzano grandi quantità di I/O possono generare più di questi eventi di attesa.
+ `Client:ClientRead` e `Client:ClientWrite` — Le query con grandi quantità di comunicazioni client possono generare più di questi eventi di attesa.

Se la larghezza di banda di rete è un problema, considera la possibilità di passare a un tipo di istanza con maggiore larghezza di banda di rete. Per informazioni sulle prestazioni di rete per una classe di istanza database, consulta [Specifiche hardware per le classi di istanze DB per Aurora](Concepts.DBInstanceClass.Summary.md).

### Riduzione del numero di commit
<a name="apg-waits.xactsync.actions.commits"></a>

Per ridurre il numero di commit, combinare le dichiarazioni in blocchi di transazione.

# IPC:DamRecordTxAck
<a name="apg-waits.ipcdamrecordtxac"></a>

L’evento `IPC:DamRecordTxAck` si verifica quando Aurora PostgreSQL in una sessione che utilizza flussi di attività del database genera un evento di flusso di attività, quindi attende che tale evento diventi duraturo. 

**Topics**
+ [Versioni di motori pertinenti](#apg-waits.ipcdamrecordtxac.context.supported)
+ [Context](#apg-waits.ipcdamrecordtxac.context)
+ [Cause](#apg-waits.ipcdamrecordtxac.causes)
+ [Azioni](#apg-waits.ipcdamrecordtxac.actions)

## Versioni di motori pertinenti
<a name="apg-waits.ipcdamrecordtxac.context.supported"></a>

Queste informazioni sugli eventi di attesa sono rilevanti per tutte le versioni di Aurora PostgreSQL 10.7 e successive 10, 11.4 e versioni successive 11 e tutte le versioni 12 e 13.

## Context
<a name="apg-waits.ipcdamrecordtxac.context"></a>

In modalità sincrona, la durata degli eventi del flusso di attività è favorita rispetto alle prestazioni del database. In attesa di una scrittura duratura dell'evento, la sessione blocca le altre attività del database, causando l’evento di attesa `IPC:DamRecordTxAck`.

## Cause
<a name="apg-waits.ipcdamrecordtxac.causes"></a>

La causa più comune per l'evento `IPC:DamRecordTxAck` che appare nelle prime attese è che la funzione Database Activity Streams (DAS) è un audit olistico. L'attività SQL superiore genera eventi di flusso di attività che devono essere registrati.

## Azioni
<a name="apg-waits.ipcdamrecordtxac.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell'evento di attesa:
+ Riduci il numero di istruzioni SQL o disattiva i flussi di attività del database. In questo modo, è possibile ridurre il numero di eventi che richiedono scritture durevoli.
+ Passa alla modalità asincrona. Ciò aiuta a ridurre le contese sull’evento di attesa `IPC:DamRecordTxAck`.

  Tuttavia, la funzione DAS non può garantire la durata di ogni evento in modalità asincrona.

# Eventi di attesa IPC:parallel
<a name="apg-ipc-parallel"></a>

I seguenti `IPC:parallel wait events` indicano che una sessione è in attesa della comunicazione tra processi relativa alle operazioni di esecuzione di query parallele.
+ `IPC:BgWorkerStartup`: un processo è in attesa che un processo worker parallelo completi la sequenza di avvio. Ciò si verifica durante l’inizializzazione dei worker per l’esecuzione di query parallele.
+ `IPC:BgWorkerShutdown`: un processo è in attesa che un processo worker parallelo completi la sequenza di arresto. Ciò si verifica durante la fase di pulizia dell’esecuzione di query parallele.
+ `IPC:ExecuteGather`: un processo è in attesa di ricevere dati da processi worker paralleli durante l’esecuzione di query. Ciò si verifica quando il processo leader deve raccogliere i risultati dai propri worker.
+ `IPC:ParallelFinish`: un processo è in attesa che i worker paralleli completino l’esecuzione e riportino i risultati finali. Ciò avviene durante la fase di completamento dell’esecuzione di query parallele.

**Topics**
+ [Versioni del motore supportate](#apg-ipc-parallel-context-supported)
+ [Contesto](#apg-ipc-parallel-context)
+ [Probabili cause di aumento delle attese](#apg-ipc-parallel-causes)
+ [Azioni](#apg-ipc-parallel-actions)

## Versioni del motore supportate
<a name="apg-ipc-parallel-context-supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-ipc-parallel-context"></a>

L’esecuzione parallela delle query in PostgreSQL implica la collaborazione di più processi per elaborare una singola query. Quando si determina che una query è adatta alla parallelizzazione, un processo leader si coordina con uno o più processi worker paralleli in base all’impostazione del parametro `max_parallel_workers_per_gather`. Il processo leader divide il lavoro tra i worker, ciascuno dei quali elabora la propria porzione di dati in modo indipendente, e i risultati vengono raccolti dal processo leader.

**Nota**  
Ogni worker parallelo opera come un processo separato con requisiti di risorse simili a quelli di una sessione utente completa. Ciò significa che una query parallela con 4 worker può consumare fino a 5 volte le risorse (CPU, memoria, I/O larghezza di banda) rispetto a una query non parallela, poiché sia il processo leader che ogni processo di lavoro mantengono le proprie allocazioni di risorse. Ad esempio, impostazioni come `work_mem` vengono applicate singolarmente a ciascun worker, moltiplicando potenzialmente l’utilizzo totale della memoria in tutti i processi.

L’architettura di query parallela è composta da tre componenti principali:
+ Processo leader: il processo principale che avvia l’operazione parallela, divide il carico di lavoro e si coordina con i processi worker.
+ Processi worker: processi in background che eseguono parti della query in parallelo.
+ Gather/Gather merge: operazioni che combinano i risultati di più processi worker e li restituiscono al leader

Durante l’esecuzione parallela, i processi devono comunicare tra loro tramite meccanismi di comunicazione tra processi (IPC). Questi eventi di attesa IPC si verificano durante diverse fasi:
+ Avvio del worker: quando i worker paralleli vengono inizializzati
+ Scambio di dati: quando i worker elaborano i dati e inviano i risultati al leader
+ Arresto del worker: quando l’esecuzione parallela viene completata e i worker vengono terminati
+ Punti di sincronizzazione: quando i processi devono coordinarsi o attendere che altri processi completino le proprie attività

La comprensione di questi eventi di attesa è fondamentale per diagnosticare i problemi di prestazioni relativi all’esecuzione di query parallele, specialmente in ambienti ad alta concorrenza in cui più query parallele possono essere eseguite contemporaneamente.

## Probabili cause di aumento delle attese
<a name="apg-ipc-parallel-causes"></a>

Diversi fattori possono contribuire a un aumento degli eventi di attesa IPC correlati alle query parallele:

**Elevata concorrenza di query parallele**  
L’esecuzione simultanea di più query parallele può portare a un conflitto di risorse e a un aumento dei tempi di attesa per le operazioni IPC. Ciò è particolarmente comune nei sistemi con elevati volumi di transazioni o carichi di lavoro analitici.

**Piani di query parallele non ottimali**  
Se il pianificatore di query sceglie piani paralleli inefficienti, ciò può comportare una parallelizzazione non necessaria o una scarsa distribuzione del lavoro tra i worker. Ciò può comportare un aumento delle attese IPC, in particolare per gli eventi IPC: e IPC:. ExecuteGather ParallelFinish Questi problemi di pianificazione spesso derivano da statistiche obsolete e dal rigonfiamento. table/index 

**Avvio e arresto frequenti dei worker paralleli**  
Le query di breve durata che avviano e terminano frequentemente i worker paralleli possono causare un aumento degli eventi `IPC:BgWorkerStartup` e `IPC:BgWorkerShutdown`. Ciò si verifica spesso nei carichi di lavoro OLTP con molte query di piccole dimensioni e parallelizzabili.

**Vincoli delle risorse**  
CPU, memoria o I/O capacità limitate possono causare colli di bottiglia nell'esecuzione parallela, con conseguente aumento dei tempi di attesa in tutti gli eventi IPC. Ad esempio, se la CPU è satura, i processi worker potrebbero impiegare più tempo per avviarsi o elaborare la relativa parte di lavoro.

**Strutture di query complesse**  
Le query con più livelli di parallelismo (ad esempio, join paralleli seguiti da aggregazioni parallele) possono portare a modelli IPC più complessi e tempi di attesa potenzialmente maggiori, soprattutto per gli eventi `IPC:ExecuteGather`.

**Serie di risultati di grandi dimensioni**  
Le query che producono set di risultati di grandi dimensioni possono aumentare i tempi di attesa `IPC:ExecuteGather` poiché il processo leader dedica più tempo alla raccolta e all’elaborazione dei risultati dei processi worker.

La comprensione di questi fattori può aiutare a diagnosticare e risolvere i problemi di prestazioni relativi all’esecuzione di query parallele in Aurora PostgreSQL.

## Azioni
<a name="apg-ipc-parallel-actions"></a>

Quando si verificano attese relative a query parallele, in genere significa che un processo di backend sta coordinando o attendendo processi worker paralleli. Queste attese sono comuni durante l’esecuzione di piani paralleli. È possibile analizzare e mitigare l’impatto di queste attese monitorando l’utilizzo dei worker paralleli, esaminando le impostazioni dei parametri e ottimizzando l’esecuzione delle query e l’allocazione delle risorse.

**Topics**
+ [Analizzare i piani di query per individuare eventuali parallelismi inefficienti](#apg-ipc-parallel-analyze-plans)
+ [Monitorare l’utilizzo delle query parallele](#apg-ipc-parallel-monitor)
+ [Esaminare e modificare le impostazioni delle interrogazioni parallele](#apg-ipc-parallel-adjust-settings)
+ [Ottimizzare l’allocazione delle risorse](#apg-ipc-parallel-optimize-resources)
+ [Esaminare la gestione delle connessioni](#apg-ipc-parallel-connection-management)
+ [Esaminare e ottimizzare le operazioni di manutenzione](#apg-ipc-parallel-maintenance)
+ [Utilizzare Query Plan Management (QPM)](#apg-ipc-parallel-query-plan-management)

### Analizzare i piani di query per individuare eventuali parallelismi inefficienti
<a name="apg-ipc-parallel-analyze-plans"></a>

L’esecuzione parallela delle query può spesso portare a instabilità del sistema, picchi di CPU e variazioni imprevedibili delle prestazioni delle query. È fondamentale analizzare a fondo se il parallelismo migliora effettivamente il carico di lavoro specifico. Utilizzare EXPLAIN ANALYZE per esaminare i piani di esecuzione delle query parallele.

Disattivare temporaneamente il parallelismo a livello di sessione per confrontare l’efficienza del piano:

```
SET max_parallel_workers_per_gather = 0;
EXPLAIN ANALYZE <your_query>;
```

Riattivare il parallelismo e confrontare:

```
RESET max_parallel_workers_per_gather;
EXPLAIN ANALYZE <your_query>;
```

Se la disabilitazione del parallelismo produce risultati migliori o più coerenti, prendere in considerazione la possibilità di disabilitarlo per query specifiche a livello di sessione utilizzando i comandi SET. Per un impatto più ampio, è possibile voler disabilitare il parallelismo a livello di istanza regolando i parametri pertinenti nel cluster o nel gruppo di parametri dell’istanza. Per ulteriori informazioni, consulta [Amazon Aurora PostgreSQL parametri](AuroraPostgreSQL.Reference.ParameterGroups.md).

### Monitorare l’utilizzo delle query parallele
<a name="apg-ipc-parallel-monitor"></a>

Utilizzare le seguenti query per ottenere visibilità sull’attività e sulla capacità delle query parallele:

Controllare i processi worker paralleli attivi:

```
SELECT
    COUNT(*)
FROM
    pg_stat_activity
WHERE
    backend_type = 'parallel worker';
```

Questa query mostra il numero di processi worker paralleli attivi. Un valore elevato può indicare che `max\$1parallel\$1workers` è configurato con un valore elevato e potrebbe essere opportuno ridurlo.

Controllare le query parallele simultanee:

```
SELECT
    COUNT(DISTINCT leader_pid)
FROM
    pg_stat_activity
WHERE
    leader_pid IS NOT NULL;
```

Questa query restituisce il numero di processi leader distinti che hanno avviato query parallele. Un numero elevato indica che più sessioni eseguono query parallele contemporaneamente, il che può aumentare la richiesta di CPU e memoria.

### Esaminare e modificare le impostazioni delle interrogazioni parallele
<a name="apg-ipc-parallel-adjust-settings"></a>

Controllare i seguenti parametri per assicurarsi che siano in linea con il carico di lavoro:
+ `max_parallel_workers`: numero totale di worker paralleli in tutte le sessioni.
+ `max_parallel_workers_per_gather`: numero massimo di worker per query.

Per i carichi di lavoro OLAP, l’aumento di questi valori può migliorare le prestazioni. Per i carichi di lavoro OLTP, in genere sono preferiti valori inferiori.

```
SHOW max_parallel_workers;
SHOW max_parallel_workers_per_gather;
```

### Ottimizzare l’allocazione delle risorse
<a name="apg-ipc-parallel-optimize-resources"></a>

Monitora l'utilizzo della CPU e valuta la possibilità di regolare il numero di v CPUs se è costantemente elevato e se l'applicazione trae vantaggio dalle query parallele. Assicurarsi che sia disponibile una memoria adeguata per le operazioni parallele.
+ Utilizzare le metriche di Approfondimenti sulle prestazioni per determinare se il sistema è legato alla CPU.
+ Ogni worker parallelo utilizza il proprio `work_mem`. Assicurarsi che l’utilizzo totale della memoria rientri nei limiti delle istanze.

Le query parallele possono consumare molte più risorse rispetto alle query non parallele, poiché ogni processo worker è un processo completamente separato che ha all’incirca lo stesso impatto sul sistema di una sessione utente aggiuntiva. Questo deve essere tenuto in considerazione quando si sceglie un valore per questa impostazione, nonché quando si configurano altre impostazioni che controllano l’utilizzo delle risorse come `work_mem`. Per ulteriori informazioni, consultare la [documentazione di PostgreSQL](https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-WORK-MEM). I limiti delle risorse come `work_mem` vengono applicati individualmente a ciascun worker, il che significa che l’utilizzo totale può essere molto più elevato in tutti i processi rispetto a quanto sarebbe normalmente per ogni singolo processo.

Prendi in considerazione l'aumento di v CPUs o l'ottimizzazione dei parametri di memoria se il carico di lavoro è fortemente parallelizzato.

### Esaminare la gestione delle connessioni
<a name="apg-ipc-parallel-connection-management"></a>

In caso di esaurimento delle connessioni, esaminare le strategie di pooling delle connessioni dell’applicazione. Prendere in considerazione l’implementazione del pooling delle connessioni a livello di applicazione, se non è già in uso.

### Esaminare e ottimizzare le operazioni di manutenzione
<a name="apg-ipc-parallel-maintenance"></a>

Coordinare la creazione degli indici e le altre attività di manutenzione per prevenire il conflitto di risorse. Prendere in considerazione la possibilità di pianificare queste operazioni durante le ore non di picco. Evitare di pianificare una manutenzione intensa (ad esempio, build di indici paralleli) durante i periodi di elevato carico di query da parte degli utenti. Queste operazioni possono consumare worker paralleli e influire sulle prestazioni delle query regolari.

### Utilizzare Query Plan Management (QPM)
<a name="apg-ipc-parallel-query-plan-management"></a>

In Aurora PostgreSQL, la funzionalità Query Plan Management (QPM) è progettata per garantire l’adattabilità e la stabilità del piano indipendentemente dalle modifiche apportate all’ambiente di database che potrebbero causare la regressione del piano di query. Per maggiori informazioni, consulta [Panoramica della gestione del piano di query per Aurora PostgreSQL](AuroraPostgreSQL.Optimize.overview.md). QPM fornisce un certo controllo sull’ottimizzatore. Esaminare i piani approvati in QPM per assicurarsi che siano in linea con le attuali impostazioni di parallelismo. Aggiornare o rimuovere i piani obsoleti che potrebbero forzare un’esecuzione parallela non ottimale.

È anche possibile correggere i piani utilizzando pg\$1hint\$1plan. Per ulteriori informazioni, consulta [Correzione dei piani mediante pg\$1hint\$1plan](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.pg_hint_plan). È possibile utilizzare l’hint denominato `Parallel` per imporre l’esecuzione parallela. Per maggiori informazioni, consulta la pagina relativa agli [hint per i piani paralleli](https://github.com/ossc-db/pg_hint_plan/blob/master/docs/hint_table.md#hints-for-parallel-plans).

# IPC: ProcArrayGroupUpdate
<a name="apg-rpg-ipcprocarraygroup"></a>

L'`IPC:ProcArrayGroupUpdate`evento si verifica quando una sessione è in attesa che il capogruppo aggiorni lo stato della transazione al termine dell'operazione. Sebbene PostgreSQL generalmente associ eventi di attesa di tipo IPC a operazioni di query parallele, questo particolare evento di attesa non è specifico delle query parallele.

**Topics**
+ [Versioni del motore supportate](#apg-rpg-ipcprocarraygroup.supported)
+ [Contesto](#apg-rpg-ipcprocarraygroup.context)
+ [Probabili cause di aumento delle attese](#apg-rpg-ipcprocarraygroup.causes)
+ [Azioni](#apg-rpg-ipcprocarraygroup.actions)

## Versioni del motore supportate
<a name="apg-rpg-ipcprocarraygroup.supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-rpg-ipcprocarraygroup.context"></a>

**Comprendere l'array di processi** — L'array process (proc) è una struttura di memoria condivisa in PostgreSQL. Contiene informazioni su tutti i processi in esecuzione, inclusi i dettagli delle transazioni. Durante il completamento della transazione (`COMMIT`o`ROLLBACK`), ProcArray deve essere aggiornato per riflettere la modifica e cancellare il TransactionID dall'array. La sessione che tenta di completare la transazione deve acquisire un blocco esclusivo su. ProcArray Ciò impedisce ad altri processi di ottenere blocchi condivisi o esclusivi su di esso.

**Meccanismo di aggiornamento di gruppo**: durante l'esecuzione di un COMMIT o ROLLBACK, se un processo di backend non riesce a ottenerne uno ProcArrayLock in modalità esclusiva, aggiorna un campo speciale chiamato. ProcArrayGroupMember Ciò aggiunge la transazione all'elenco delle sessioni che intendono terminare. Questo processo di backend quindi dorme e il tempo in cui dorme viene utilizzato come evento di attesa. ProcArrayGroupUpdate Il primo processo ProcArray con procArrayGroup Member, denominato processo leader, acquisisce la modalità esclusiva. ProcArrayLock Quindi cancella l'elenco dei processi in attesa della cancellazione del gruppo TransactionID. Una volta completata questa operazione, il leader rilascia ProcArrayLock e quindi riattiva tutti i processi in questo elenco, notificando loro che la transazione è stata completata.

## Probabili cause di aumento delle attese
<a name="apg-rpg-ipcprocarraygroup.causes"></a>

Maggiore è il numero di processi in esecuzione, più a lungo un leader rimarrà aggrappato procArrayLock a una modalità esclusiva. Di conseguenza, più transazioni di scrittura finiscono in uno scenario di aggiornamento di gruppo, causando un potenziale accumulo di processi in attesa dell'evento di `ProcArrayGroupUpdate` attesa. Nella visualizzazione SQL principale di Database Insights, vedrete che COMMIT è l'istruzione con la maggior parte di questo evento di attesa. Ciò è previsto, ma richiederà un'analisi più approfondita dello specifico SQL di scrittura in esecuzione per determinare l'azione appropriata da intraprendere.

## Azioni
<a name="apg-rpg-ipcprocarraygroup.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa. Identifica `IPC:ProcArrayGroupUpdate` gli eventi utilizzando Amazon RDS Performance Insights o interrogando la vista del sistema PostgreSQL. `pg_stat_activity`

**Topics**
+ [Monitoraggio delle operazioni di conferma e rollback delle transazioni](#apg-rpg-ipcprocarraygroup.actions.monitor)
+ [Ridurre la concorrenza](#apg-rpg-ipcprocarraygroup.actions.concurrency)
+ [Implementazione del pool di connessioni](#apg-rpg-ipcprocarraygroup.actions.pooling)

### Monitoraggio delle operazioni di conferma e rollback delle transazioni
<a name="apg-rpg-ipcprocarraygroup.actions.monitor"></a>

**Monitora i commit e i rollback**: un numero maggiore di commit e rollback può comportare una maggiore pressione su. ProcArray Ad esempio, se un'istruzione SQL inizia a fallire a causa di un aumento delle violazioni di chiavi duplicate, è possibile che si verifichi un aumento dei rollback che può aumentare la contesa e il sovraccarico delle tabelle. ProcArray

Amazon RDS Database Insights fornisce i `xact_commit` parametri di PostgreSQL e riporta il numero di commit `xact_rollback` e rollback al secondo.

### Ridurre la concorrenza
<a name="apg-rpg-ipcprocarraygroup.actions.concurrency"></a>

**Transazioni in batch**: ove possibile, operazioni in batch in singole transazioni per ridurre commit/rollback le operazioni.

**Limita la concorrenza**: riduci il numero di transazioni attive contemporaneamente per alleviare la contesa tra blocchi su. ProcArray Sebbene richiederà alcuni test, la riduzione del numero totale di connessioni simultanee può ridurre i conflitti e mantenere la velocità effettiva.

### Implementazione del pool di connessioni
<a name="apg-rpg-ipcprocarraygroup.actions.pooling"></a>

**Soluzioni di pool di connessioni**: utilizza il pool di connessioni per gestire in modo efficiente le connessioni al database, riducendo il numero totale di backend e quindi il carico di lavoro sul. ProcArray Sebbene richieda alcuni test, la riduzione del numero totale di connessioni simultanee può ridurre i conflitti e mantenere la velocità effettiva.

Per ulteriori informazioni, consulta [Connection pooling per Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.BestPractices.connection_pooling.html).

**Riduci le tempeste di connessione**: allo stesso modo, uno schema di creazione e interruzione frequenti delle connessioni causa una pressione aggiuntiva su. ProcArray Riducendo questo modello, si riduce la contesa complessiva.

# Lock:advisory
<a name="apg-waits.lockadvisory"></a>

L’evento `Lock:advisory` si verifica quando un'applicazione PostgreSQL utilizza un blocco per coordinare l'attività su più sessioni.

**Topics**
+ [Versioni di motori pertinenti](#apg-waits.lockadvisory.context.supported)
+ [Context](#apg-waits.lockadvisory.context)
+ [Cause](#apg-waits.lockadvisory.causes)
+ [Azioni](#apg-waits.lockadvisory.actions)

## Versioni di motori pertinenti
<a name="apg-waits.lockadvisory.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per Aurora PostgreSQL versione 9.6 e successive.

## Context
<a name="apg-waits.lockadvisory.context"></a>

I blocchi di consulenza PostgreSQL sono blocchi cooperativi a livello di applicazione esplicitamente bloccati e sbloccati dal codice dell'applicazione dell'utente. Un'applicazione PostgreSQL può utilizzare un blocco per coordinare l'attività su più sessioni. A differenza dei normali blocchi a livello di oggetto o riga, l'applicazione ha il pieno controllo sulla durata del blocco. Per ulteriori informazioni consulta [Blocchi di consulenza](https://www.postgresql.org/docs/12/explicit-locking.html#ADVISORY-LOCKS) nella documentazione di PostgreSQL.

I blocchi di consulenza possono essere rilasciati prima della fine di una transazione o essere trattenuti da una sessione tra le transazioni. Ciò tuttavia non è vero per i blocchi impliciti e applicati al sistema, come un blocco esclusivo di accesso su una tabella acquisita da una dichiarazione `CREATE INDEX`.

Per una descrizione delle funzioni utilizzate per acquisire (bloccare) e rilasciare (sbloccare) i blocchi di consulenza, vedere [Funzioni di Advisory Lock](https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS) nella documentazione di PostgreSQL.

I blocchi di consulenza sono implementati sopra il normale sistema di blocco PostgreSQL e sono visibili nella visualizzazione di sistema `pg_locks`.

## Cause
<a name="apg-waits.lockadvisory.causes"></a>

Questo tipo di blocco è controllato esclusivamente da un'applicazione che lo utilizza esplicitamente. I blocchi di consulenza acquisiti per ogni riga come parte di una query possono causare un picco di blocchi o un accumulo a lungo termine.

Questi effetti si verificano quando la query viene eseguita in un modo che acquisisce blocchi su più righe di quelle restituite dalla query. L'applicazione dovrà comunque rilasciare ogni blocco, ma se i blocchi vengono acquisiti su righe che non vengono restituite, l'applicazione non riesce a trovare tutti i blocchi.

L'esempio seguente è tratto da [Blocchi di consulenza](https://www.postgresql.org/docs/12/explicit-locking.html#ADVISORY-LOCKS) nella documentazione di PostgreSQL.

```
SELECT pg_advisory_lock(id) FROM foo WHERE id > 12345 LIMIT 100;
```

In questo esempio, la clausola `LIMIT` può arrestare l'output della query solo dopo che le righe sono già state selezionate internamente e i relativi valori ID bloccati. Ciò può accadere improvvisamente quando un volume di dati crescente fa sì che il pianificatore scelga un piano di esecuzione diverso che non è stato testato durante lo sviluppo. L'accumulo in questo caso avviene perché l'applicazione chiama esplicitamente `pg_advisory_unlock` per ogni valore ID bloccato. Tuttavia, in questo caso non è possibile trovare il set di blocchi acquisiti su righe che non sono state restituite. Poiché i blocchi vengono acquisiti a livello di sessione, non vengono rilasciati automaticamente alla fine della transazione.

Un'altra possibile causa di picchi nei tentativi di blocco bloccati sono i conflitti non intenzionali. In questi conflitti, parti non correlate dell'applicazione condividono per errore lo stesso spazio ID di blocco.

## Azioni
<a name="apg-waits.lockadvisory.actions"></a>

Esaminare l'utilizzo delle applicazioni dei blocchi di consulenza e i dettagli su dove e quando nel flusso dell'applicazione viene acquisito e rilasciato ogni tipo di blocco consultivo.

Determina se una sessione sta acquisendo troppi blocchi o che una sessione di lunga durata non rilascia blocchi abbastanza presto, causando un lento accumulo di blocchi. È possibile correggere un lento accumulo di blocchi a livello di sessione terminando la sessione utilizzando `pg_terminate_backend(pid)`. 

Viene visualizzato un client in attesa di un blocco di avviso in `pg_stat_activity` con `wait_event_type=Lock` e `wait_event=advisory`. È possibile ottenere valori di blocco specifici eseguendo una query nella vista di sistema `pg_locks` per lo stesso `pid`, cercando `locktype=advisory` e `granted=f`.

È quindi possibile identificare la sessione di blocco interrogando `pg_locks` per lo stesso blocco consultivo `granted=t`, come mostrato nell'esempio seguente.

```
SELECT blocked_locks.pid AS blocked_pid,
         blocking_locks.pid AS blocking_pid,
         blocked_activity.usename AS blocked_user,
         blocking_activity.usename AS blocking_user,
         now() - blocked_activity.xact_start AS blocked_transaction_duration,
         now() - blocking_activity.xact_start AS blocking_transaction_duration,
         concat(blocked_activity.wait_event_type,':',blocked_activity.wait_event) AS blocked_wait_event,
         concat(blocking_activity.wait_event_type,':',blocking_activity.wait_event) AS blocking_wait_event,
         blocked_activity.state AS blocked_state,
         blocking_activity.state AS blocking_state,
         blocked_locks.locktype AS blocked_locktype,
         blocking_locks.locktype AS blocking_locktype,
         blocked_activity.query AS blocked_statement,
         blocking_activity.query AS blocking_statement
    FROM pg_catalog.pg_locks blocked_locks
    JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
    JOIN pg_catalog.pg_locks blocking_locks
        ON blocking_locks.locktype = blocked_locks.locktype
        AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
        AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
        AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
        AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
        AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
        AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
        AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
        AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
        AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
        AND blocking_locks.pid != blocked_locks.pid
    JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
    WHERE NOT blocked_locks.GRANTED;
```

Tutte le funzioni API di blocco consultivo hanno due serie di argomenti, un argomento `bigint` o due argomenti `integer`:
+ Per le funzioni API con un argomento `bigint`, i 32 bit superiori sono in `pg_locks.classid` e i 32 bit inferiori sono in `pg_locks.objid`.
+ Per le funzioni API con due argomenti `integer`, il primo argomento è `pg_locks.classid` e il secondo argomento è `pg_locks.objid`.

Il valore `pg_locks.objsubid` indica quale modulo API è stato utilizzato: `1` significa un argomento `bigint`; `2` significa due argomenti `integer`.

# Lock:extend
<a name="apg-waits.lockextend"></a>

L’evento `Lock:extend` si verifica quando un processo di back-end è in attesa di bloccare una relazione per estenderla mentre un altro processo ha un blocco su tale relazione per lo stesso scopo.

**Topics**
+ [Versioni del motore supportate](#apg-waits.lockextend.context.supported)
+ [Context](#apg-waits.lockextend.context)
+ [Probabili cause di aumento delle attese](#apg-waits.lockextend.causes)
+ [Azioni](#apg-waits.lockextend.actions)

## Versioni del motore supportate
<a name="apg-waits.lockextend.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per tutte el versioni di Aurora PostgreSQL.

## Context
<a name="apg-waits.lockextend.context"></a>

L'evento `Lock:extend` indica che un processo di back-end è in attesa di estendere una relazione su cui un altro processo di backend mantiene un blocco mentre sta estendendo tale relazione. Poiché solo un processo alla volta può estendere una relazione, il sistema genera un evento di attesa `Lock:extend`. Le operazioni `INSERT`, `COPY`, e `UPDATE` possono generare questo evento.

## Probabili cause di aumento delle attese
<a name="apg-waits.lockextend.causes"></a>

Quando l'evento `Lock:extend` si verifica più del normale, probabilmente indicando un problema di prestazioni, le cause tipiche includono le seguenti.

**Aumento degli inserti simultanei o degli aggiornamenti della stessa tabella **  
Potrebbe esserci un aumento del numero di sessioni simultanee con query che inseriscono o aggiornano la stessa tabella.

**Larghezza di banda di rete insufficiente**  
La larghezza di banda di rete sull'istanza database potrebbe essere insufficiente per le esigenze di comunicazione di storage del carico di lavoro corrente. Ciò può contribuire alla latenza dello storage che causa un aumento degli eventi `Lock:extend`.

## Azioni
<a name="apg-waits.lockextend.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell'evento di attesa.

**Topics**
+ [Riduci gli inserti e gli aggiornamenti simultanei alla stessa relazione](#apg-waits.lockextend.actions.action1)
+ [Aumentare la larghezza di banda di rete](#apg-waits.lockextend.actions.increase-network-bandwidth)

### Riduci gli inserti e gli aggiornamenti simultanei alla stessa relazione
<a name="apg-waits.lockextend.actions.action1"></a>

Innanzitutto, determinare se c'è un aumento dei parametri `tup_inserted` e `tup_updated` e un aumento di questi eventi di attesa. In tal caso, verificare quali relazioni sono in forte contesa per le operazioni di inserimento e aggiornamento. Per determinarlo, interrogare la vista `pg_stat_all_tables` per i valori nei campi `n_tup_ins` e `n_tup_upd`. Per ulteriori informazioni sulla vista `pg_stat_all_tables`, consultare [pg\$1stat\$1all\$1tables](https://www.postgresql.org/docs/13/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW) nella documentazione PostgreSQL. 

Per ottenere ulteriori informazioni sul blocco e le query bloccate, eseguire una query `pg_stat_activity` come nel seguente esempio:

```
SELECT
    blocked.pid,
    blocked.usename,
    blocked.query,
    blocking.pid AS blocking_id,
    blocking.query AS blocking_query,
    blocking.wait_event AS blocking_wait_event,
    blocking.wait_event_type AS blocking_wait_event_type
FROM pg_stat_activity AS blocked
JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(blocked.pid))
where
blocked.wait_event = 'extend'
and blocked.wait_event_type = 'Lock';
 
   pid  | usename  |            query             | blocking_id |                         blocking_query                           | blocking_wait_event | blocking_wait_event_type
  ------+----------+------------------------------+-------------+------------------------------------------------------------------+---------------------+--------------------------
   7143 |  myuser  | insert into tab1 values (1); |        4600 | INSERT INTO tab1 (a) SELECT s FROM generate_series(1,1000000) s; | DataFileExtend      | IO
```

Dopo aver identificato le relazioni che contribuiscono ad aumentare gli eventi `Lock:extend`, utilizza le seguenti tecniche per ridurre la contesa:
+ Scopri se è possibile utilizzare il partizionamento per ridurre le contese per la stessa tabella. La separazione delle tuple inserite o aggiornate in diverse partizioni può ridurre le contese. Per informazioni sulle partizioni, consulta [Gestione delle partizioni PostgreSQL con l'estensione pg\$1partman](PostgreSQL_Partitions.md).
+ Se l'evento di attesa è dovuto principalmente all'attività di aggiornamento, considerare di ridurre il valore del fattore di riempimento della relazione. Ciò può ridurre le richieste di nuovi blocchi durante l'aggiornamento. Il fattore di riempimento è un parametro di archiviazione per una tabella che determina la quantità massima di spazio per l'imballaggio di una pagina di tabella. Viene espresso come percentuale dello spazio totale per una pagina. Per ulteriori informazioni sul parametro fillfactor, consulta [CREA TABELLA](https://www.postgresql.org/docs/13/sql-createtable.html) nella documentazione di PostgreSQL. 
**Importante**  
Si consiglia vivamente di testare il sistema se si modifica il fattore di riempimento perché la modifica di questo valore può influire negativamente sulle prestazioni, a seconda del carico di lavoro.

### Aumentare la larghezza di banda di rete
<a name="apg-waits.lockextend.actions.increase-network-bandwidth"></a>

Per vedere se c'è un aumento della latenza di scrittura, controlla il parametro `WriteLatency` in CloudWatch. Se è presente, usa i parametri Amazon CloudWatch `WriteThroughput` e `ReadThroughput` per monitorare il traffico relativo allo storage sul cluster DB. Questi parametri possono aiutarti a determinare se la larghezza di banda della rete è sufficiente per il tuo carico di lavoro.

Se la larghezza di banda della rete non è sufficiente, aumentala. Se il file client o l’istanza DB sta raggiungendo i limiti di larghezza di banda di rete, l'unico modo per aumentare la larghezza di banda è aumentare la dimensione dell'istanza DB.

Per ulteriori informazioni sui parametri CloudWatch, consultare [CloudWatch Parametri Amazon per Amazon Aurora](Aurora.AuroraMonitoring.Metrics.md). Per informazioni sulle prestazioni di rete per una classe di istanza database, consulta [Specifiche hardware per le classi di istanze DB per Aurora](Concepts.DBInstanceClass.Summary.md).

# Lock:Relation
<a name="apg-waits.lockrelation"></a>

L’evento `Lock:Relation` si verifica quando una query è in attesa di acquisire un blocco su una tabella o vista (relazione) attualmente bloccata da un’altra transazione.

**Topics**
+ [Versioni del motore supportate](#apg-waits.lockrelation.context.supported)
+ [Contesto](#apg-waits.lockrelation.context)
+ [Probabili cause di aumento delle attese](#apg-waits.lockrelation.causes)
+ [Azioni](#apg-waits.lockrelation.actions)

## Versioni del motore supportate
<a name="apg-waits.lockrelation.context.supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-waits.lockrelation.context"></a>

La maggior parte dei comandi PostgreSQL utilizza implicitamente i blocchi per controllare l’accesso simultaneo ai dati nelle tabelle. È inoltre possibile utilizzare questi blocchi esplicitamente nel codice dell’applicazione con il comando `LOCK`. Molte modalità di blocco non sono compatibili tra loro e possono bloccare le transazioni quando cercano di accedere allo stesso oggetto. Quando ciò accade, Aurora PostgreSQL genera un evento `Lock:Relation`. Di seguito sono riportati alcuni esempi comuni:
+ Blocchi esclusivi come `ACCESS EXCLUSIVE` possono bloccare tutti gli accessi simultanei. Le operazioni DDL (Data Definition Language) come `DROP TABLE`, `TRUNCATE`, `VACUUM FULL`, e `CLUSTER` acquisiscono implicitamente i blocchi `ACCESS EXCLUSIVE`. `ACCESS EXCLUSIVE` è anche la modalità di blocco predefinita per le istruzioni `LOCK TABLE` che non specificano esplicitamente una modalità.
+ L’uso di `CREATE INDEX (without CONCURRENT)` su una tabella è in conflitto con le istruzioni DML (Data Manipulation Language) `UPDATE`, `DELETE`, e `INSERT`, che acquisiscono i blocchi `ROW EXCLUSIVE`.

Per ulteriori informazioni sui blocchi a livello di tabella e sulle modalità di blocco in conflitto, vedere [Blocco esplicito](https://www.postgresql.org/docs/13/explicit-locking.html) nella documentazione di PostgreSQL.

Il blocco di query e transazioni in genere si sblocca in uno dei seguenti modi:
+ Query di blocco: l’applicazione può annullare la query o l’utente può terminare il processo. Il motore può anche forzare la fine della query a causa del timeout dell’istruzione di una sessione o di un meccanismo di rilevamento del deadlock.
+ Blocco della transazione: una transazione smette di bloccarsi quando esegue un’istruzione `ROLLBACK` o `COMMIT`. I rollback si verificano automaticamente anche quando le sessioni vengono disconnesse da un client o da problemi di rete o terminano. Le sessioni possono essere terminate quando il motore di database è spento, quando il sistema è fuori memoria e così via.

## Probabili cause di aumento delle attese
<a name="apg-waits.lockrelation.causes"></a>

Quando l’evento `Lock:Relation` si verifica più frequentemente del normale, può indicare un problema di prestazioni. Le cause tipiche sono:

**Sessioni simultanee aumentate con blocchi di tabella in conflitto**  
Potrebbe esserci un aumento del numero di sessioni simultanee con query che inseriscono o aggiornano la stessa tabella.

**Operazioni di manutenzione**  
Le operazioni di manutenzione Health come `VACUUM` e `ANALYZE` possono aumentare significativamente il numero di blocchi in conflitto. `VACUUM FULL` acquisisce un blocco `ACCESS EXCLUSIVE`, e `ANALYZE` acquisisce un blocco `SHARE UPDATE EXCLUSIVE`. Entrambi i tipi di blocchi possono causare un evento di attesa `Lock:Relation`. Le operazioni di manutenzione dei dati delle applicazioni, come l’aggiornamento di una vista materializzata, possono anche aumentare le query e le transazioni bloccate.

**Blocchi sulle istanze del lettore**  
È possibile che si verifichi un conflitto tra i blocchi di relazione tenuti dallo scrittore e dai lettori. Attualmente solo i blocchi di relazione `ACCESS EXCLUSIVE` vengono replicati nelle istanze del lettore. Tuttavia, il blocco di relazione `ACCESS EXCLUSIVE` sarà in conflitto con qualsiasi blocco di relazione `ACCESS SHARE` tenuto dal lettore. Questo conflitto può causare un aumento degli eventi di attesa della relazione di blocco sul lettore. 

## Azioni
<a name="apg-waits.lockrelation.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa.

**Topics**
+ [Riduci l’impatto del blocco delle istruzioni SQL](#apg-waits.lockrelation.actions.reduce-blocks)
+ [Riduci al minimo l’effetto delle operazioni di manutenzione](#apg-waits.lockrelation.actions.maintenance)
+ [Verifica la presenza di blocchi del lettore](#apg-waits.lockrelation.actions.readerlocks)

### Riduci l’impatto del blocco delle istruzioni SQL
<a name="apg-waits.lockrelation.actions.reduce-blocks"></a>

Per ridurre l’impatto del blocco delle istruzioni SQL, modificare il codice dell’applicazione laddove possibile. Di seguito sono riportate due tecniche comuni per ridurre i blocchi:
+ Utilizzo dell’opzione `NOWAIT` — Alcuni comandi SQL, come le istruzioni `SELECT` e `LOCK`, supportano questa opzione. La direttiva `NOWAIT` annulla la query richiedente il blocco se il blocco non può essere acquisito immediatamente. Questa tecnica può aiutare a impedire che una sessione di blocco provochi un accumulo di sessioni bloccate dietro di essa.

  Ad esempio: si supponga che la transazione A sia in attesa di un blocco trattenuto dalla transazione B. Ora, se B richiede un blocco su una tabella bloccata dalla transazione C, la transazione A potrebbe essere bloccata fino al completamento della transazione C. Ma se la transazione B utilizza un `NOWAIT` quando richiede il blocco su C, può fallire rapidamente e garantire che la transazione A non debba attendere indefinitamente.
+ Utilizza `SET lock_timeout` — Imposta un valore `lock_timeout` per limitare il tempo in cui un’istruzione SQL attende di acquisire un blocco su una relazione. Se il blocco non viene acquisito entro il timeout specificato, la transazione che richiede il blocco viene annullata. Impostare questo valore a livello di sessione.

### Riduci al minimo l’effetto delle operazioni di manutenzione
<a name="apg-waits.lockrelation.actions.maintenance"></a>

Operazioni di manutenzione come `VACUUM` e `ANALYZE` sono importanti. Si consiglia di non spegnerli qualora vengano trovati eventi di attesa `Lock:Relation` relativi a queste operazioni di manutenzione. I seguenti approcci possono ridurre al minimo l’effetto di queste operazioni:
+ Eseguire manualmente le operazioni di manutenzione durante le ore non di punta.
+ Per ridurre le attese `Lock:Relation` causate da attività autovacuum, eseguire qualsiasi sintonizzazione automatica necessaria. Per informazioni sulla sintonizzazione autovacuum, fai riferimento a [Funzionamento di PostgreSQL Autovacuum in Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Autovacuum.html) nella *Guida per l’utente di Amazon RDS*.

### Verifica la presenza di blocchi del lettore
<a name="apg-waits.lockrelation.actions.readerlocks"></a>

Puoi vedere come le sessioni simultanee su uno scrittore e sui lettori potrebbero tenere blocchi che si bloccano a vicenda. A questo scopo, puoi eseguire le query che restituiscono il tipo di blocco e la relazione. Nella tabella è possibile trovare una sequenza di query su due sessioni simultanee, una sessione di scrittura e una sessione di lettura.

Il processo di riproduzione attende la durata impostata per `max_standby_streaming_delay` prima di annullare la query dell’istanza di lettura. Come mostrato nell’esempio, il timeout di blocco di 100 ms è ben al di sotto del valore di default di `max_standby_streaming_delay` di 30 secondi. Il timeout di blocco si verifica prima che si verifichi un problema. 


| Evento di sequenza | Sessione | Comando o output | 
| --- | --- | --- | 
|  Imposta una variabile di ambiente denominata READER con il valore specificato e tenta di connettersi all’istanza database con questo endpoint.  |  Sessione lettore  |  Comando della CLI: <pre>export READER=aurorapg2.12345678910.us-west-1.rds.amazonaws.com<br /><br />psql -h $READER</pre> Output: 

```
psql (15devel, server 10.14)
Type "help" for help.
```  | 
|  Imposta una variabile di ambiente denominata WRITER e tenta di connettersi all’istanza database con questo endpoint.  |  Sessione di scrittura  |  Comando della CLI: <pre>export WRITER=aurorapg1.12345678910.us-west-1.rds.amazonaws.com<br />psql -h $WRITER</pre> Output: 

```
psql (15devel, server 10.14) 
Type "help" for help.
```  | 
|  La sessione di scrittura crea la tabella t1 sull’istanza di scrittura.  |  Sessione di scrittura  |  Query PostgreSQL: <pre>postgres=> CREATE TABLE t1(b integer);<br />CREATE TABLE</pre>  | 
|  Se non ci sono query in conflitto sullo scrittore, il blocco ACCESS EXCLUSIVE viene acquisito immediatamente sull’istanza di scrittura.  |  Sessione di scrittura  |  Blocco `ACCESS EXCLUSIVE` abilitato  | 
|  La sessione del lettore imposta un intervallo di timeout di blocco di 100 millisecondi.  |  Sessione lettore  |  Query PostgreSQL: <pre>postgres=> SET lock_timeout=100;<br />SET</pre>  | 
|  La sessione dell’istanza di lettura tenta di leggere i dati dalla tabella t1 sull’istanza di lettura.  |  Sessione lettore  |  Query PostgreSQL: <pre>postgres=> SELECT * FROM t1;</pre> Output di esempio: 

```
b
---
(0 rows)
```  | 
|  La sessione di scrittura elimina t1.  |  Sessione di scrittura  |  Query PostgreSQL: <pre>postgres=> BEGIN;<br />BEGIN<br />postgres=> DROP TABLE t1;<br />DROP TABLE<br />postgres=></pre>  | 
|  La query scade e viene annullata sul lettore.  |  Sessione lettore  |  Query PostgreSQL: <pre>postgres=> SELECT * FROM t1;</pre> Output di esempio: 

```
ERROR:  canceling statement due to lock timeout
LINE 1: SELECT * FROM t1;
                      ^
```  | 
|  Per determinare la causa dell’errore, la sessione dell’istanza di lettura interroga `pg_locks` e `pg_stat_activity`.  |  Sessione lettore  |  Query PostgreSQL: <pre>postgres=> SELECT locktype, relation, mode, backend_type<br />postgres=> FROM pg_locks l, pg_stat_activity t1<br />postgres=> WHERE l.pid=t1.pid AND relation = 't1'::regclass::oid;</pre>  | 
|  Il risultato indica che il processo `aurora wal replay` è in possesso di un blocco `ACCESS EXCLUSIVE` sulla tabella t1.  |  Sessione lettore  |  Risultato della query: <pre> locktype | relation |        mode         |   backend_type<br />----------+----------+---------------------+-------------------<br /> relation | 68628525 | AccessExclusiveLock | aurora wal replay<br />(1 row)</pre>  | 

# Lock:transactionid
<a name="apg-waits.locktransactionid"></a>

L’evento `Lock:transactionid` si verifica quando una transazione è in attesa di un blocco a livello di riga.

**Topics**
+ [Versioni del motore supportate](#apg-waits.locktransactionid.context.supported)
+ [Contesto](#apg-waits.locktransactionid.context)
+ [Probabili cause di aumento delle attese](#apg-waits.locktransactionid.causes)
+ [Azioni](#apg-waits.locktransactionid.actions)

## Versioni del motore supportate
<a name="apg-waits.locktransactionid.context.supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-waits.locktransactionid.context"></a>

L'evento `Lock:transactionid` si verifica quando una transazione sta tentando di acquisire un blocco a livello di riga già concesso a una transazione in esecuzione contemporaneamente. La sessione che mostra il l'evento di attesa `Lock:transactionid` è bloccato a causa di questo blocco. Dopo che la transazione di blocco termina in un’istruzione `COMMIT` o `ROLLBACK`, la transazione bloccata può procedere.

La semantica multiversione di controllo della concorrenza di Aurora PostgreSQL garantisce che i lettori non bloccano gli scrittori e gli scrittori non bloccano i lettori. Affinché si verifichino conflitti a livello di riga, le transazioni bloccate e bloccate devono emettere dichiarazioni in conflitto dei seguenti tipi:
+ `UPDATE`
+ `SELECT … FOR UPDATE`
+ `SELECT … FOR KEY SHARE`

L’istruzione `SELECT … FOR KEY SHARE` è un caso speciale. Il database utilizza la clausola `FOR KEY SHARE` per ottimizzare le prestazioni dell'integrità referenziale. Un blocco a livello di riga su una fila può bloccare i comandi `INSERT`, `UPDATE`, e `DELETE` su altre tabelle che fanno riferimento alla riga.

## Probabili cause di aumento delle attese
<a name="apg-waits.locktransactionid.causes"></a>

Quando questo evento appare più del normale, la causa è in genere un’istruzione `UPDATE`, `SELECT … FOR UPDATE`, oppure `SELECT … FOR KEY SHARE` combinate con le seguenti condizioni.

**Topics**
+ [Elevata concorrenza](#apg-waits.locktransactionid.concurrency)
+ [Inattivo in transazione](#apg-waits.locktransactionid.idle)
+ [Transazioni di lunga durata](#apg-waits.locktransactionid.long-running)

### Elevata concorrenza
<a name="apg-waits.locktransactionid.concurrency"></a>

Aurora PostgreSQL può utilizzare la semantica di blocco granulare a livello di riga. La probabilità di conflitti a livello di riga aumenta quando vengono soddisfatte le seguenti condizioni:
+ Un carico di lavoro altamente simultaneo è conteso per le stesse righe.
+ Aumenta la concorrenza.

### Inattivo in transazione
<a name="apg-waits.locktransactionid.idle"></a>

A volte la colonna `pg_stat_activity.state` mostra il valore `idle in transaction`. Questo valore viene visualizzato per le sessioni che hanno avviato una transazione, ma non hanno ancora emesso un `COMMIT` o `ROLLBACK`. Se il valore `pg_stat_activity.state` non è `active`, la query mostrata in `pg_stat_activity` è la versione più recente a terminare l’esecuzione. La sessione di blocco non sta elaborando attivamente una query perché una transazione aperta contiene un blocco.

Se una transazione inattiva ha acquisito un blocco a livello di riga, potrebbe impedire ad altre sessioni di acquisirlo. Questa condizione porta al frequente verificarsi dell'evento di attesa `Lock:transactionid`. Per diagnosticare il problema, esaminare l'output da `pg_stat_activity` e `pg_locks`.

### Transazioni di lunga durata
<a name="apg-waits.locktransactionid.long-running"></a>

Le transazioni che vengono eseguite a lungo ricevono blocchi per un lungo periodo di tempo. Questi blocchi a tenuta lunga possono impedire l'esecuzione di altre transazioni.

## Azioni
<a name="apg-waits.locktransactionid.actions"></a>

Il blocco delle righe è un conflitto tra le istruzioni `UPDATE`, `SELECT … FOR UPDATE`, oppure `SELECT … FOR KEY SHARE`. Prima di tentare una soluzione, scopri quando queste istruzioni sono in esecuzione sulla stessa riga. Utilizzare queste informazioni per scegliere una strategia descritta nelle sezioni seguenti.

**Topics**
+ [Rispondere a un'elevata concorrenza](#apg-waits.locktransactionid.actions.problem)
+ [Rispondere alle transazioni inattive](#apg-waits.locktransactionid.actions.find-blocker)
+ [Rispondere alle transazioni di lunga durata](#apg-waits.locktransactionid.actions.concurrency)

### Rispondere a un'elevata concorrenza
<a name="apg-waits.locktransactionid.actions.problem"></a>

Se il problema è la concorrenza, prova una delle seguenti tecniche:
+ Riduci la concorrenza nell'applicazione. Ad esempio, diminuisci il numero di sessioni attive.
+ Implementa un pool di connessioni. Per informazioni su come mettere in pool le connessioni con RDS Proxy, vedere [Proxy Amazon RDS per Aurora](rds-proxy.md).
+ Progettare l'applicazione o il modello di dati per evitare di contendere le istruzioni `UPDATE` e `SELECT … FOR UPDATE`. È inoltre possibile ridurre il numero di chiavi esterne a cui accedono le istruzioni `SELECT … FOR KEY SHARE`.

### Rispondere alle transazioni inattive
<a name="apg-waits.locktransactionid.actions.find-blocker"></a>

Se `pg_stat_activity.state` mostra `idle in transaction`, utilizza le seguenti strategie:
+ Attiva autocommit laddove possibile. Questo approccio impedisce alle transazioni di bloccare altre transazioni durante l'attesa di un `COMMIT` o `ROLLBACK`.
+ Cerca percorsi di codice a cui manca `COMMIT`, `ROLLBACK`, oppure `END`.
+ Assicurati che la logica di gestione delle eccezioni nell'applicazione abbia sempre un percorso per un `end of transaction` valido.
+ Assicurati che l'applicazione elabori i risultati delle query dopo aver terminato la transazione con `COMMIT` o `ROLLBACK`.

### Rispondere alle transazioni di lunga durata
<a name="apg-waits.locktransactionid.actions.concurrency"></a>

Se le transazioni di lunga durata causano il frequente verificarsi di `Lock:transactionid`, prova le seguenti strategie:
+ Tieni i blocchi di riga fuori dalle transazioni di lunga durata.
+ Limita la durata delle query implementando autocommit quando possibile.

# Lock:tuple
<a name="apg-waits.locktuple"></a>

L’evento `Lock:tuple` si verifica quando un processo di backend aspetta di acquisire un blocco su una tupla.

**Topics**
+ [Versioni del motore supportate](#apg-waits.locktuple.context.supported)
+ [Context](#apg-waits.locktuple.context)
+ [Probabili cause di aumento delle attese](#apg-waits.locktuple.causes)
+ [Azioni](#apg-waits.locktuple.actions)

## Versioni del motore supportate
<a name="apg-waits.locktuple.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per tutte el versioni di Aurora PostgreSQL.

## Context
<a name="apg-waits.locktuple.context"></a>

L’evento `Lock:tuple` indica che un backend è in attesa di acquisire un blocco su una tupla mentre un altro backend tiene un blocco in conflitto sulla stessa tupla. Nella tabella seguente viene illustrato uno scenario in cui le sessioni generano l’evento `Lock:tuple`.


|  Orario  |  Sessione 1  |  Sessione 2  |  Sessione 3  | 
| --- | --- | --- | --- | 
|  t1  |  Inizia una transazione.  |    |    | 
|  t2  |  Aggiorna la riga 1.  |    |    | 
|  t3  |    |  Aggiorna la riga 1. La sessione acquisisce un blocco esclusivo sulla tupla e quindi attende che la sessione 1 rilasci il blocco eseguendo il commit o il rollback.  |    | 
|  t4  |    |    |  Aggiorna la riga 1. La sessione attende che la sessione 2 rilasci il blocco esclusivo sulla tupla.  | 

Oppure puoi simulare questo evento di attesa utilizzando lo strumento di benchmarking `pgbench`. Configurare un numero elevato di sessioni simultanee per aggiornare la stessa riga in una tabella con un file SQL personalizzato.

Per ulteriori informazioni sulle modalità di blocco in conflitto, vedere [Blocco esplicito](https://www.postgresql.org/docs/current/explicit-locking.html) nella documentazione di PostgreSQL. Per ulteriori informazioni su `pgbench`, consulta [pgbench](https://www.postgresql.org/docs/current/pgbench.html) nella documentazione di PostgreSQL.

## Probabili cause di aumento delle attese
<a name="apg-waits.locktuple.causes"></a>

Quando l'evento si verifica più del normale, probabilmente indicando un problema di prestazioni, le cause tipiche includono le seguenti:
+ Un numero elevato di sessioni simultanee sta cercando di acquisire un blocco in conflitto per la stessa tupla eseguendo istruzioni `UPDATE` o `DELETE`.
+ Sessioni altamente simultanee stanno eseguendo un’istruzione `SELECT` usando le modalità di blocco `FOR UPDATE` o `FOR NO KEY UPDATE`.
+ Diversi fattori spingono le applicazioni o i connection pool ad aprire più sessioni per eseguire le stesse operazioni. Mentre le nuove sessioni stanno tentando di modificare le stesse righe, il carico del DB può aumentare e `Lock:tuple` può apparire.

Per ulteriori informazioni consulta [Blocchi a livello di riga](https://www.postgresql.org/docs/current/explicit-locking.html#LOCKING-ROWS) nella documentazione di PostgreSQL.

## Azioni
<a name="apg-waits.locktuple.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell'evento di attesa.

**Topics**
+ [Indagare la logica dell’applicazione](#apg-waits.locktuple.actions.problem)
+ [Trova la sessione responsabile del blocco](#apg-waits.locktuple.actions.find-blocker)
+ [Riduci la concorrenza quando è alta](#apg-waits.locktuple.actions.concurrency)
+ [Risoluzione dei problemi dei colli di bottiglia](#apg-waits.locktuple.actions.bottlenecks)

### Indagare la logica dell’applicazione
<a name="apg-waits.locktuple.actions.problem"></a>

Scopri se una sessione bloccante è rimasta in stato `idle in transaction` per lungo tempo. In tal caso, considera di terminare la sessione di blocco come soluzione a breve termine. È anche possibile usare la funzione `pg_terminate_backend`. Per ulteriori informazioni su questa funzione, consulta [Funzioni di segnalazione server](https://www.postgresql.org/docs/13/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL) nella documentazione di PostgreSQL.

Per una soluzione a lungo termine, fai quanto seguente:
+ Regola la logica dell'applicazione.
+ Utilizzo del parametro `idle_in_transaction_session_timeout`. Questo parametro termina qualsiasi sessione con una transazione aperta che è rimasta inattiva per un periodo di tempo superiore al periodo di tempo specificato. Per ulteriori informazioni, consulta la pagina [Errori connessione client](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-IDLE-IN-TRANSACTION-SESSION-TIMEOUT) nella documentazione di PostgreSQL.
+ Usa autocommit il più possibile. Per ulteriori informazioni, consulta la pagina [CONFIGURA AUTOCOMMIT](https://www.postgresql.org/docs/current/ecpg-sql-set-autocommit.html) nella documentazione di PostgreSQL.

### Trova la sessione responsabile del blocco
<a name="apg-waits.locktuple.actions.find-blocker"></a>

Mentre si verifica l’evento di attesa `Lock:tuple`, identifica il blocco e la sessione bloccata scoprendo quali blocchi dipendono l'uno dall'altro. Per ulteriori informazioni, consulta [Informazioni sulle dipendenze dei blocchi](https://wiki.postgresql.org/wiki/Lock_dependency_information) nel wiki di PostgreSQL. Per analizzare gli eventi `Lock:tuple` passati, usa la funzione Aurora `aurora_stat_backend_waits`. 

L'esempio seguente esegue una query su tutte le sessioni, filtrando su `tuple` e ordinando per `wait_time`.

```
--AURORA_STAT_BACKEND_WAITS
      SELECT a.pid, 
             a.usename, 
             a.app_name, 
             a.current_query,
             a.current_wait_type, 
             a.current_wait_event, 
             a.current_state, 
             wt.type_name AS wait_type, 
             we.event_name AS wait_event, 
             a.waits, 
             a.wait_time
        FROM (SELECT pid, 
                     usename, 
                     left(application_name,16) AS app_name,
                     coalesce(wait_event_type,'CPU') AS current_wait_type,
                     coalesce(wait_event,'CPU') AS current_wait_event, 
                     state AS current_state,
                     left(query,80) as current_query,
                     (aurora_stat_backend_waits(pid)).* 
                FROM pg_stat_activity 
               WHERE pid <> pg_backend_pid()
                 AND usename<>'rdsadmin') a
NATURAL JOIN aurora_stat_wait_type() wt 
NATURAL JOIN aurora_stat_wait_event() we
WHERE we.event_name = 'tuple'
    ORDER BY a.wait_time;

  pid  | usename | app_name |                 current_query                  | current_wait_type | current_wait_event | current_state | wait_type | wait_event | waits | wait_time
-------+---------+----------+------------------------------------------------+-------------------+--------------------+---------------+-----------+------------+-------+-----------
 32136 | sys     | psql     | /*session3*/ update tab set col=1 where col=1; | Lock              | tuple              | active        | Lock      | tuple      |     1 |   1000018
 11999 | sys     | psql     | /*session4*/ update tab set col=1 where col=1; | Lock              | tuple              | active        | Lock      | tuple      |     1 |   1000024
```

### Riduci la concorrenza quando è alta
<a name="apg-waits.locktuple.actions.concurrency"></a>

L’evento `Lock:tuple` potrebbe verificarsi costantemente, soprattutto in un tempo di carico di lavoro occupato. In questa situazione, si consideri di ridurre l'elevata concorrenza per le file molto occupate. Spesso, solo poche righe controllano una coda o la logica booleana, il che rende queste righe molto occupate.

È possibile ridurre la concorrenza utilizzando approcci diversi in base ai requisiti aziendali, alla logica dell'applicazione e al tipo di carico di lavoro. Ad esempio, puoi eseguire le operazioni seguenti:
+ Riprogetta la tua tabella e la logica dei dati per ridurre la concorrenza elevata.
+ Modificare la logica dell'applicazione per ridurre la concorrenza elevata a livello di riga.
+ Sfrutta e riprogetta le query con i blocchi a livello di riga.
+ Utilizzo della clausola `NOWAIT` con operazioni di riprova.
+ Prendi in considerazione l'utilizzo di un controllo della concorrenza logico ottimistico e ibrido.
+ Valuta la possibilità di modificare il livello di isolamento del database.

### Risoluzione dei problemi dei colli di bottiglia
<a name="apg-waits.locktuple.actions.bottlenecks"></a>

`Lock:tuple` può verificarsi con colli di bottiglia come la fame di CPU o il massimo utilizzo della larghezza di banda Amazon EBS. Per ridurre i colli di bottiglia, valuta i seguenti approcci:
+ Ridimensiona il tipo di classe di istanza.
+ Ottimizza le query a uso intensivo di risorse.
+ Modificare la logica dell'applicazione.
+ Archivia i dati a cui si accede raramente.

# LWLock:contenuto\$1buffer () BufferContent
<a name="apg-waits.lockbuffercontent"></a>

L’evento `LWLock:buffer_content` si verifica quando una sessione è in attesa di accedere in lettura o scrittura a una pagina dati in memoria mentre un'altra sessione ha bloccato la pagina in scrittura. In Aurora PostgreSQL 13 e versioni successive, questo evento di attesa viene chiamato `BufferContent`.

**Topics**
+ [Versioni del motore supportate](#apg-waits.lockbuffercontent.context.supported)
+ [Contesto](#apg-waits.lockbuffercontent.context)
+ [Probabili cause di aumento delle attese](#apg-waits.lockbuffercontent.causes)
+ [Azioni](#apg-waits.lockbuffercontent.actions)

## Versioni del motore supportate
<a name="apg-waits.lockbuffercontent.context.supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-waits.lockbuffercontent.context"></a>

Per leggere o manipolare i dati, PostgreSQL vi accede tramite buffer di memoria condivisa. Per leggere dal buffer, un processo ottiene un blocco leggero (LWLock) sul contenuto del buffer in modalità condivisa. Per scrivere sul buffer, ottiene quel blocco in modalità esclusiva. I blocchi condivisi consentono ad altri processi di acquisire contemporaneamente blocchi condivisi su quel contenuto. I blocchi esclusivi impediscono ad altri processi di ottenere qualsiasi tipo di blocco.

L'evento `LWLock:buffer_content` (`BufferContent`) indica che più processi stanno tentando di ottenere blocchi leggeri (LWLocks) sul contenuto di un buffer specifico.

## Probabili cause di aumento delle attese
<a name="apg-waits.lockbuffercontent.causes"></a>

Quando l’evento `LWLock:buffer_content` (`BufferContent`) si verifica più del normale, probabilmente indicando un problema di prestazioni, le cause tipiche includono le seguenti.

**Aggiornamenti simultanei aumentati degli stessi dati**  
Potrebbe esserci un aumento del numero di sessioni simultanee con query che inseriscono o aggiornano la stessa tabella. Questa contesa può essere più marcata sulle tabelle con molti indici.

**I dati del carico di lavoro non sono in memoria**  
Quando i dati elaborati dal carico di lavoro attivo non sono in memoria, questi eventi di attesa possono aumentare. Questo effetto è dovuto al fatto che i processi che mantengono i blocchi possono mantenerli più a lungo mentre eseguono operazioni su disco. I/O 

**Uso eccessivo di vincoli di chiave esterna**  
I vincoli di chiave esterna possono aumentare la quantità di tempo che un processo mantiene su un blocco del contenuto del buffer. Questo effetto è dovuto al fatto che le operazioni di lettura richiedono un blocco del contenuto del buffer condiviso sulla chiave di riferimento mentre quella chiave viene aggiornata.

## Azioni
<a name="apg-waits.lockbuffercontent.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa. Potresti identificare eventi `LWLock:buffer_content` (`BufferContent`) utilizzando Amazon RDS Performance Insights o interrogando la vista `pg_stat_activity`.

**Topics**
+ [Migliora l’efficienza in memoria](#apg-waits.lockbuffercontent.actions.in-memory)
+ [Riduzione dell’utilizzo di vincoli di chiave esterna](#apg-waits.lockbuffercontent.actions.foreignkey)
+ [Rimuovere gli indici inutilizzati](#apg-waits.lockbuffercontent.actions.indexes)
+ [Rimuovere gli indici duplicati](#apg-waits.lockbuffercontent.actions.duplicate-indexes)
+ [Eseguire eliminazione o REINDEX per gli indici non validi](#apg-waits.lockbuffercontent.actions.invalid-indexes)
+ [Utilizzare gli indici parziali](#apg-waits.lockbuffercontent.actions.partial-indexes)
+ [Rimuovere il bloat di tabelle e indici](#apg-waits.lockbuffercontent.actions.bloat)

### Migliora l’efficienza in memoria
<a name="apg-waits.lockbuffercontent.actions.in-memory"></a>

Per aumentare la probabilità che i dati del carico di lavoro attivo si trovino in memoria, partizionare tabelle o scalare la classe di istanza. Per informazioni sulle classi di istanza database, consulta [Classi di istanze DB Amazon Aurora](Concepts.DBInstanceClass.md).

Monitorare la metrica `BufferCacheHitRatio`, che misura la percentuale di richieste gestite dalla cache del buffer di un’istanza database nel cluster di database. Questa metrica fornisce informazioni sulla quantità di dati gestiti dalla memoria. Una percentuale di riscontri elevata indica che l’istanza database dispone di memoria sufficiente per il set di dati di lavoro, mentre una percentuale bassa suggerisce che le query accedono frequentemente ai dati dalla risorsa di archiviazione.

I riscontri di lettura nella cache per tabella e i riscontri di lettura nella cache per indice nella sezione Impostazioni memoria del report [PG Collector](https://github.com/awslabs/pg-collector) possono fornire informazioni dettagliate sul rapporto di riscontri nella cache di tabelle e indici.

### Riduzione dell’utilizzo di vincoli di chiave esterna
<a name="apg-waits.lockbuffercontent.actions.foreignkey"></a>

Indagare sui carichi di lavoro con un numero elevato di eventi di attesa `LWLock:buffer_content` (`BufferContent`) per l’utilizzo di vincoli di chiave esterna. Rimuovere i vincoli di chiave esterna non necessari.

### Rimuovere gli indici inutilizzati
<a name="apg-waits.lockbuffercontent.actions.indexes"></a>

Per carichi di lavoro con un numero elevato di eventi di attesa `LWLock:buffer_content` (`BufferContent`), identificare gli indici inutilizzati e rimuoverli.

La sezione degli indici inutilizzati del report [PG Collector](https://github.com/awslabs/pg-collector) può fornire informazioni dettagliate sugli indici inutilizzati nel database.

### Rimuovere gli indici duplicati
<a name="apg-waits.lockbuffercontent.actions.duplicate-indexes"></a>

Identificare gli indici duplicati e rimuoverli.

La sezione degli indici duplicati del report [PG Collector](https://github.com/awslabs/pg-collector) può fornire informazioni dettagliate sugli indici duplicati nel database.

### Eseguire eliminazione o REINDEX per gli indici non validi
<a name="apg-waits.lockbuffercontent.actions.invalid-indexes"></a>

Gli indici non validi si verificano in genere quando si utilizza `CREATE INDEX CONCURRENTLY` o `REINDEX CONCURRENTLY` e il comando ha esito negativo o viene interrotto.

Gli indici non validi non possono essere utilizzati per le query, ma verranno comunque aggiornati e occuperanno spazio su disco.

La sezione degli indici non validi del report [PG Collector](https://github.com/awslabs/pg-collector) può fornire informazioni dettagliate sugli indici non validi nel database.

### Utilizzare gli indici parziali
<a name="apg-waits.lockbuffercontent.actions.partial-indexes"></a>

Gli indici parziali possono essere utilizzati per migliorare le prestazioni delle query e ridurre le dimensioni dell’indice. Un indice parziale è un indice creato su un sottoinsieme di una tabella, con il sottoinsieme definito da un’espressione condizionale. Come descritto nella documentazione sugli [indici parziali](https://www.postgresql.org/docs/current/indexes-partial.html), gli indici parziali possono ridurre il sovraccarico di gestione degli indici, poiché PostgreSQL non ha bisogno di aggiornare l’indice in tutti i casi.

### Rimuovere il bloat di tabelle e indici
<a name="apg-waits.lockbuffercontent.actions.bloat"></a>

Un eccessivo bloat di tabelle e indici può influire negativamente sulle prestazioni del database. Un bloat delle tabelle e degli indici aumenta le dimensioni del set di lavoro attivo, riducendo l’efficienza della memoria. Inoltre, il bloat aumenta i costi di archiviazione e rallenta l’esecuzione delle query. Per diagnosticare un bloat, consulta [Diagnosi delle dimensioni della tabella e dell'indice](AuroraPostgreSQL.diag-table-ind-bloat.md). Inoltre, la sezione Fragmentation (Bloat) del report [PG Collector](https://github.com/awslabs/pg-collector) può fornire informazioni dettagliate sul bloat di tabelle e indici.

Per risolvere il problema del bloat di tabelle e indici, sono disponibili alcune opzioni:

**VACUUM FULL**  
`VACUUM FULL` crea una nuova copia della tabella, copiando solo le tuple attive, quindi sostituisce la vecchia tabella con quella nuova mantenendo un blocco `ACCESS EXCLUSIVE`. Ciò impedisce qualsiasi lettura o scrittura sulla tabella, che può causare un’interruzione. Inoltre, `VACUUM FULL` richiederà più tempo se la tabella è di grandi dimensioni.

**pg\$1repack**  
`pg_repack` è utile in situazioni in cui `VACUUM FULL` potrebbe non essere adatto. Crea una nuova tabella che contiene i dati della tabella con bloat, tiene traccia delle modifiche rispetto alla tabella originale e quindi sostituisce la tabella originale con quella nuova. Non blocca la tabella originale per le operazioni di lettura o scrittura durante la creazione della nuova tabella. Per ulteriori informazioni su come utilizzare `pg_repack`, consulta [Rimozione del bloat con pg\$1repack](https://docs.aws.amazon.com/prescriptive-guidance/latest/postgresql-maintenance-rds-aurora/pg-repack.html) e [pg\$1repack](https://reorg.github.io/pg_repack/).

**REINDEX**  
Il comando `REINDEX` può essere utilizzato per risolvere il problema del bloat dell’indice. `REINDEX` scrive una nuova versione dell’indice senza le pagine inattive o le pagine vuote o quasi vuote, riducendo così il consumo di spazio dell’indice. Per informazioni dettagliate sul comando [https://www.postgresql.org/docs/current/sql-reindex.html](https://www.postgresql.org/docs/current/sql-reindex.html), consulta la documentazione di REINDEX.

Dopo aver rimosso il bloat dalle tabelle e dagli indici, potrebbe essere necessario aumentare la frequenza dell’autovacuum su tali tabelle. L’implementazione di impostazioni aggressive dell’autovacuum a livello di tabella può aiutare a prevenire il verificarsi di futuri bloat. Per ulteriori informazioni, consulta la documentazione su [https://docs.aws.amazon.com/prescriptive-guidance/latest/postgresql-maintenance-rds-aurora/autovacuum.html](https://docs.aws.amazon.com/prescriptive-guidance/latest/postgresql-maintenance-rds-aurora/autovacuum.html).

# LWLock:mappatura\$1buffer
<a name="apg-waits.lwl-buffer-mapping"></a>

Questo evento si verifica quando un processo di backend è in attesa di associare un blocco di dati a un buffer nel pool di buffer condiviso.

**Nota**  
Questo evento appare come `LWLock:buffer_mapping` in Aurora PostgreSQL versione 12 e versioni successive e `LWLock:BufferMapping` nella versione 13 e successive.

**Topics**
+ [Versioni del motore supportate](#apg-waits.lwl-buffer-mapping.context.supported)
+ [Contesto](#apg-waits.lwl-buffer-mapping.context)
+ [Cause](#apg-waits.lwl-buffer-mapping.causes)
+ [Azioni](#apg-waits.lwl-buffer-mapping.actions)

## Versioni del motore supportate
<a name="apg-waits.lwl-buffer-mapping.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per Aurora PostgreSQL versione 9.6 e successive.

## Contesto
<a name="apg-waits.lwl-buffer-mapping.context"></a>

Il *pool buffer condiviso* è un'area di memoria Aurora PostgreSQL che contiene tutte le pagine che sono o sono state utilizzate dai processi. Quando un processo ha bisogno di una pagina, legge la pagina nel buffer pool condiviso. Il parametro `shared_buffers` imposta le dimensioni del buffer condiviso e riserva un'area di memoria per memorizzare la tabella e le pagine indice. Se si modifica questo parametro, assicurarsi di riavviare il database. Per ulteriori informazioni, consulta [Buffer condivisi](AuroraPostgreSQL.Tuning.concepts.md#AuroraPostgreSQL.Tuning.concepts.buffer-pool).

L’evento di attesa `LWLock:buffer_mapping` si verifica nei seguenti scenari:
+ Un processo ricerca nella tabella buffer una pagina e acquisisce un blocco di mappatura buffer condiviso.
+ Un processo carica una pagina nel buffer pool e acquisisce un esclusivo blocco di mappatura del buffer.
+ Un processo rimuove una pagina dal pool e acquisisce un blocco esclusivo di mappatura del buffer.

## Cause
<a name="apg-waits.lwl-buffer-mapping.causes"></a>

Quando questo evento appare più del normale, probabilmente indicando un problema di prestazioni, il database sta eseguendo il paging in entrata e in uscita dal buffer pool condiviso. Le cause tipiche sono:
+ Query di grandi dimensioni
+ Indici e tabelle gonfie
+ Scansioni complete della tabella
+ Dimensioni del pool condiviso più piccole del set di lavoro

## Azioni
<a name="apg-waits.lwl-buffer-mapping.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa.

**Topics**
+ [Monitora i parametri relativi al buffer](#apg-waits.lwl-buffer-mapping.actions.monitor-metrics)
+ [Valuta la tua strategia di indicizzazione](#apg-waits.lwl-buffer-mapping.actions.indexes)
+ [Riduci il numero di buffer che devono essere allocati rapidamente](#apg-waits.lwl-buffer-mapping.actions.buffers)

### Monitora i parametri relativi al buffer
<a name="apg-waits.lwl-buffer-mapping.actions.monitor-metrics"></a>

Quando `LWLock:buffer_mapping` aspetta il picco, indaga il rapporto di hit del buffer. È possibile utilizzare questi parametri per comprendere meglio cosa sta accadendo nella cache del buffer. Esamina i seguenti parametri:

`BufferCacheHitRatio`  
Questa CloudWatch metrica di Amazon misura la percentuale di richieste servite dalla buffer cache di un'istanza DB nel cluster di database. È possibile che questo parametro diminuisca in anticipo all’evento di attesa `LWLock:buffer_mapping`.

`blks_hit`  
Questo parametro contatore Performance Insights indica il numero di blocchi recuperati dal buffer pool condiviso. Dopo che appare l’evento di attesa `LWLock:buffer_mapping`, potresti osservare un picco in `blks_hit`.

`blks_read`  
Questa metrica contatore di Performance Insights indica il numero di blocchi che I/O devono essere letti nel pool di buffer condiviso. Potresti osservare un picco in `blks_read` in vista dell’evento di attesa `LWLock:buffer_mapping`.

### Valuta la tua strategia di indicizzazione
<a name="apg-waits.lwl-buffer-mapping.actions.indexes"></a>

Per confermare che la strategia di indicizzazione non sta peggiorando le prestazioni, verifica quanto segue:

Index bloat  
Assicurati che il bloat di indice e tabella non porti alla lettura di pagine non necessarie nel buffer condiviso. Se le tabelle contengono righe inutilizzate, considera l'archiviazione dei dati e la rimozione delle righe dalle tabelle. È quindi possibile ricostruire gli indici per le tabelle ridimensionate.

Indici per query utilizzate di frequente  
Per determinare se disponi degli indici ottimali, monitora i parametri del motore DB in Performance Insights. Il parametro `tup_returned` mostra il numero di righe lette. Il parametro `tup_fetched` mostra il numero di righe restituite al client. Se `tup_returned` è significativamente più grande di `tup_fetched`, i dati potrebbero non essere indicizzati correttamente. Inoltre, le statistiche della tabella potrebbero non essere aggiornate.

### Riduci il numero di buffer che devono essere allocati rapidamente
<a name="apg-waits.lwl-buffer-mapping.actions.buffers"></a>

Per ridurre gli eventi di attesa `LWLock:buffer_mapping`, cercare di ridurre il numero di buffer che devono essere allocati rapidamente. Una strategia consiste nell'eseguire operazioni di batch di dimensioni ridotte. Potresti essere in grado di ottenere batch più piccoli partizionando le tabelle.

# LWLock:BufferIO (IPC:BufferIO)
<a name="apg-waits.lwlockbufferio"></a>

L’evento `LWLock:BufferIO` si verifica quando Aurora PostgreSQL o RDS per PostgreSQL sono in attesa che altri processi finiscano le operazioni di input/output (I/O) quando si tenta contemporaneamente di accedere a una pagina. Il suo scopo è quello di leggere la stessa pagina nel buffer condiviso.

**Topics**
+ [Versioni di motori pertinenti](#apg-waits.lwlockbufferio.context.supported)
+ [Context](#apg-waits.lwlockbufferio.context)
+ [Cause](#apg-waits.lwlockbufferio.causes)
+ [Azioni](#apg-waits.lwlockbufferio.actions)

## Versioni di motori pertinenti
<a name="apg-waits.lwlockbufferio.context.supported"></a>

Queste informazioni relative all'evento di attesa sono rilevanti per tutte le versioni di Aurora PostgreSQL. Per Aurora PostgreSQL 12 e versioni precedenti questo evento di attesa è denominato lwlock:buffer\$1io mentre in Aurora PostgreSQL versione 13 è denominato lwlock:bufferio. In Aurora PostgreSQL versione 14, l'evento di attesa BufferIO è stato spostato da `LWLock` al tipo di evento di attesa `IPC` (IPC:BufferIO). 

## Context
<a name="apg-waits.lwlockbufferio.context"></a>

Ogni buffer condiviso ha un blocco I/O associato all’evento di attesa `LWLock:BufferIO`, ogni volta che un blocco (o una pagina) deve essere recuperato all'esterno del buffer pool condiviso.

Questo blocco viene utilizzato per gestire più sessioni che richiedono tutte l'accesso allo stesso blocco. Questo blocco deve essere letto dall'esterno del buffer pool condiviso, definito dal parametro `shared_buffers`.

Non appena la pagina viene letta all'interno del buffer pool condiviso, il blocco `LWLock:BufferIO` viene rilasciato.

**Nota**  
L'evento di attesa `LWLock:BufferIO` precede l’evento di attesa [IO: DataFileRead](apg-waits.iodatafileread.md). L’evento di attesa `IO:DataFileRead` si verifica mentre i dati vengono letti dallo storage.

Per ulteriori informazioni sui blocchi leggeri, consulta[Panoramica dei blocchi](https://github.com/postgres/postgres/blob/65dc30ced64cd17f3800ff1b73ab1d358e92efd8/src/backend/storage/lmgr/README#L20).

## Cause
<a name="apg-waits.lwlockbufferio.causes"></a>

Le cause comuni della comparsa dell'evento `LWLock:BufferIO` che appare nelle prime attese includono:
+ Più backend o connessioni che tentano di accedere alla stessa pagina in attesa di un'operazione di I/O
+ Il rapporto tra le dimensioni del buffer pool condiviso (definito dal parametro `shared_buffers`) e il numero di buffer necessari per il carico di lavoro corrente
+ La dimensione del buffer pool condiviso non è ben bilanciata con il numero di pagine sfrattate da altre operazioni
+ Indici grandi o gonfi che richiedono al motore di leggere più pagine del necessario nel buffer pool condiviso
+ Mancanza di indici che costringe il motore DB a leggere più pagine dalle tabelle del necessario
+ Picchi improvvisi per le connessioni al database che tentano di eseguire operazioni sulla stessa pagina

## Azioni
<a name="apg-waits.lwlockbufferio.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell'evento di attesa:
+ Osservare i parametri di Amazon CloudWatch per la correlazione tra forti diminuzioni degli eventi di attesa `BufferCacheHitRatio` e `LWLock:BufferIO`. Questo effetto può significare che hai una piccola impostazione dei buffer condivisi. Potrebbe essere necessario aumentarlo o scalare la classe di istanza DB. È possibile dividere il carico di lavoro in più nodi di lettore.
+ Verifica se hai indici inutilizzati, quindi rimuovili.
+ Utilizzare tabelle partizionate (che hanno anche indici partizionati). Ciò aiuta a mantenere basso il riordino dell'indice e ne riduce l'impatto.
+ Evitare di indicizzare inutilmente le colonne.
+ Evita improvvisi picchi di connessione al database utilizzando un connection pool.
+ Limitare il numero massimo di connessioni al database come best practice.

# LWLock:lock\$1manager
<a name="apg-waits.lw-lock-manager"></a>

Questo evento si verifica quando il motore Aurora PostgreSQL mantiene l'area di memoria del blocco condiviso per allocare, controllare e dislocare un blocco quando non è possibile un blocco rapido del percorso.

**Topics**
+ [Versioni del motore supportate](#apg-waits.lw-lock-manager.context.supported)
+ [Contesto](#apg-waits.lw-lock-manager.context)
+ [Probabili cause di aumento delle attese](#apg-waits.lw-lock-manager.causes)
+ [Azioni](#apg-waits.lw-lock-manager.actions)

## Versioni del motore supportate
<a name="apg-waits.lw-lock-manager.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per Aurora PostgreSQL versione 9.6 e successive. 

## Contesto
<a name="apg-waits.lw-lock-manager.context"></a>

Quando si emette un'istruzione SQL, Aurora PostgreSQL registra i blocchi per proteggere la struttura, i dati e l'integrità del database durante le operazioni simultanee. Il motore può raggiungere questo obiettivo utilizzando un blocco veloce del percorso o un blocco del percorso che non è veloce. Un blocco del percorso che non è veloce è più costoso e crea più sovraccarico di un blocco veloce del percorso.

### Blocco rapido del percorso
<a name="apg-waits.lw-lock-manager.context.fast-path"></a>

Per ridurre il sovraccarico dei blocchi che vengono presi e rilasciati frequentemente, ma che raramente sono in conflitto, i processi di backend possono utilizzare il blocco rapido del percorso. Il database utilizza questo meccanismo per i blocchi che soddisfano i seguenti criteri:
+ Usano il metodo di blocco DEFAULT.
+ Rappresentano un blocco su una relazione di database anziché una relazione condivisa.
+ Sono blocchi deboli che difficilmente entrino in conflitto.
+ Il motore può verificare rapidamente che non siano presenti blocchi in conflitto.

Il motore non può utilizzare il blocco rapido del percorso quando una di queste condizioni è vera:
+ Il blocco non soddisfa i criteri precedenti.
+ Non sono disponibili più slot per il processo di backend.

Per ulteriori informazioni sul blocco rapido del percorso, consulta [percorso rapido](https://github.com/postgres/postgres/blob/master/src/backend/storage/lmgr/README#L70-L76) nel gestore di blocco PostgreSQL README e [pg-locks](https://www.postgresql.org/docs/15/view-pg-locks.html) nella documentazione di PostgreSQL. 

### Esempio di problema di scalabilità per il blocco manager
<a name="apg-waits.lw-lock-manager.context.lock-manager"></a>

In questo esempio, una tabella denominata `purchases` memorizza cinque anni di dati, partizionati per giorno. Ogni partizione ha due indici. Si verifica la seguente sequenza di eventi:

1. Si interrogano dati su diversi giorni, il che richiede al database di leggere molte partizioni.

1. Il database crea una voce di blocco per ogni partizione. Se gli indici di partizione fanno parte del percorso di accesso dell'ottimizzatore, il database crea anche una voce di blocco per loro.

1. Quando il numero di voci di blocco richieste per lo stesso processo di back-end è superiore a 16, ovvero il valore di `FP_LOCK_SLOTS_PER_BACKEND`, il gestore di blocco utilizza il metodo di blocco del percorso non veloce.

Le applicazioni moderne potrebbero avere centinaia di sessioni. Se le sessioni simultanee eseguono una query sul genitore senza un'adeguata scrematura delle partizioni, il database potrebbe creare centinaia o addirittura migliaia di blocchi di percorso non veloci. In genere, quando questa concorrenza è superiore al numero di vCPUs, viene visualizzato l'evento di attesa. `LWLock:lock_manager`

**Nota**  
L’evento di attesa `LWLock:lock_manager` non è correlato al numero di partizioni o indici in uno schema di database. Al contrario, è correlato al numero di blocchi di percorso non veloci che il database deve controllare.

## Probabili cause di aumento delle attese
<a name="apg-waits.lw-lock-manager.causes"></a>

Quando l’evento di attesa `LWLock:lock_manager` si verifica più del normale, probabilmente indicando un problema di prestazioni, le cause più probabili di picchi improvvisi sono le seguenti:
+ Le sessioni attive simultanee eseguono query che non utilizzano blocchi di percorso veloci. Queste sessioni superano anche la vCPU massima.
+ Un gran numero di sessioni attive simultanee sta accedendo a una tabella fortemente partizionata. Ogni partizione ha più indici.
+ Il database sta vivendo una tempesta di connessione. Per impostazione predefinita, alcune applicazioni e software del connection pool creano più connessioni quando il database è lento. Questa pratica peggiora il problema. Ottimizza il software del pool di connessioni in modo che non si verifichino tempeste di connessione.
+ Un numero elevato di sessioni esegue una query su una tabella padre senza potare le partizioni.
+ Un DDL (Data Definition Language), DML (Data Manipolation Language) o un comando di manutenzione blocca esclusivamente una relazione occupata o tuple a cui si accede frequentemente o modificate.

## Azioni
<a name="apg-waits.lw-lock-manager.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa.

**Topics**
+ [Usare la potatura delle partizioni](#apg-waits.lw-lock-manager.actions.pruning)
+ [Rimuovere indici non necessari](#apg-waits.lw-lock-manager.actions.indexes)
+ [Ottimizza le tue query per bloccare rapidamente i percorsi](#apg-waits.lw-lock-manager.actions.tuning)
+ [Sintonizzati per altri eventi di attesa](#apg-waits.lw-lock-manager.actions.other-waits)
+ [Riduzione dei colli di bottiglia hardware](#apg-waits.lw-lock-manager.actions.hw-bottlenecks)
+ [Utilizzare un connection pooler](#apg-waits.lw-lock-manager.actions.pooler)
+ [Aggiorna la versione Aurora PostgreSQL](#apg-waits.lw-lock-manager.actions.pg-version)

### Usare la potatura delle partizioni
<a name="apg-waits.lw-lock-manager.actions.pruning"></a>

*Potatura delle partizioni* è una strategia di ottimizzazione delle query che esclude le partizioni non necessarie dalle scansioni di tabelle, migliorando così le prestazioni. La potatura delle partizioni è attivata per impostazione predefinita. Se è spento, accenderlo come segue.

```
SET enable_partition_pruning = on;
```

Le query possono trarre vantaggio dalla potatura delle partizioni quando la clausola `WHERE` contiene la colonna utilizzata per il partizionamento. Per ulteriori informazioni, consulta [Potatura delle partizioni](https://www.postgresql.org/docs/current/ddl-partitioning.html#DDL-PARTITION-PRUNING) nella documentazione di PostgreSQL.

### Rimuovere indici non necessari
<a name="apg-waits.lw-lock-manager.actions.indexes"></a>

Il database potrebbe contenere indici inutilizzati o usati raramente. In tal caso, considera la possibilità di eliminarli. Esegui una delle operazioni seguenti:
+ Scopri come trovare indici non necessari consultanto [Indici non utilizzati](https://wiki.postgresql.org/wiki/Index_Maintenance#Unused_Indexes) nel wiki di PostgreSQL.
+ Esegui PG Collector. Questo script SQL raccoglie le informazioni del database e le presenta in un report HTML consolidato. Controlla la sezione «Indici non utilizzati». Per ulteriori informazioni, consulta [pg-collector](https://github.com/awslabs/pg-collector) nel repository Labs. AWS GitHub 

### Ottimizza le tue query per bloccare rapidamente i percorsi
<a name="apg-waits.lw-lock-manager.actions.tuning"></a>

Per scoprire se le tue query utilizzano il blocco rapido dei percorsi, esegui una query nella colonna `fastpath` della tabella `pg_locks`. Se le query non utilizzano il blocco rapido dei percorsi, provare a ridurre il numero di relazioni per query a meno di 16.

### Sintonizzati per altri eventi di attesa
<a name="apg-waits.lw-lock-manager.actions.other-waits"></a>

Se `LWLock:lock_manager` è il primo o il secondo nell'elenco delle prime attese, controlla se nell'elenco vengono visualizzati anche i seguenti eventi di attesa:
+ `Lock:Relation`
+ `Lock:transactionid`
+ `Lock:tuple`

Se gli eventi precedenti appaiono in alto nell'elenco, prendi in considerazione prima l'ottimizzazione di questi eventi di attesa. Questi eventi possono essere un driver per `LWLock:lock_manager`.

### Riduzione dei colli di bottiglia hardware
<a name="apg-waits.lw-lock-manager.actions.hw-bottlenecks"></a>

Potresti avere un collo di bottiglia hardware, come la fame di CPU o il massimo utilizzo della larghezza di banda Amazon EBS. In questi casi, valuta la riduzione dei colli di bottiglia hardware. Prendi in considerazione le seguenti azioni:
+ Ridimensiona la tua classe di istanza.
+ Ottimizza le query che consumano grandi quantità di CPU e memoria.
+ Cambia la logica dell'applicazione.
+ Archivia i tuoi dati.

Per ulteriori informazioni su CPU, memoria e larghezza di banda di rete EBS, vedere [Tipi di istanza Amazon RDS](https://aws.amazon.com/rds/instance-types/).

### Utilizzare un connection pooler
<a name="apg-waits.lw-lock-manager.actions.pooler"></a>

Se il numero totale di connessioni attive supera la vCPU massima, più processi del sistema operativo richiedono CPU di quella supportata dal tipo di istanza. In questo caso, valuta l'utilizzo o l'ottimizzazione di un connection pool. Per ulteriori informazioni sulla v CPUs per il tuo tipo di istanza, consulta [Amazon RDS Instance Types](https://aws.amazon.com/rds/instance-types/).

Per ulteriori informazioni sul connection pool, consulta le risorse seguenti:
+ [Proxy Amazon RDS per Aurora](rds-proxy.md)
+ [pgbouncer](http://www.pgbouncer.org/usage.html)
+ [Connection pool e origini dati](https://www.postgresql.org/docs/7.4/jdbc-datasource.html) nella *Documentazione di PostgreSQL*

### Aggiorna la versione Aurora PostgreSQL
<a name="apg-waits.lw-lock-manager.actions.pg-version"></a>

Se la versione attuale di Aurora PostgreSQL è inferiore a 12, esegui l'aggiornamento alla versione 12 o superiore. Le versioni 12 e 13 di PostgreSQL hanno un meccanismo di partizione migliorato. Per ulteriori informazioni sui miglioramenti nella versioni 12, consulta [PostgreSQL 12 Release Notes]( https://www.postgresql.org/docs/release/12.0/). Per ulteriori informazioni sulle versioni di Aurora PostgreSQL, consulta [Aggiornamenti del motore di database Amazon Aurora PostgreSQL per 02/06/2020](AuroraPostgreSQL.Updates.md).

# LWLock:MultiXact
<a name="apg-waits.lwlockmultixact"></a>

Gli eventi di attesa `LWLock:MultiXactMemberBuffer`, `LWLock:MultiXactOffsetBuffer`, `LWLock:MultiXactMemberSLRU` e `LWLock:MultiXactOffsetSLRU` indicano che una sessione è in attesa di recuperare un elenco di transazioni che modifica la stessa riga di una determinata tabella. 
+ `LWLock:MultiXactMemberBuffer`: un processo è in attesa di I/O su un buffer semplice utilizzato meno di recente (SLRU) per un membro multixact.
+ `LWLock:MultiXactMemberSLRU`: un processo è in attesa di accedere alla cache semplice utilizzata meno di recente (SLRU) per un membro multixact.
+ `LWLock:MultiXactOffsetBuffer`: un processo è in attesa di I/O su un buffer semplice utilizzato meno di recente (SLRU) per un offset multixact.
+ `LWLock:MultiXactOffsetSLRU`: un processo è in attesa di accedere alla cache semplice utilizzata meno di recente (SLRU) per un offset multixact.

**Topics**
+ [Versioni del motore supportate](#apg-waits.xactsync.context.supported)
+ [Contesto](#apg-waits.lwlockmultixact.context)
+ [Probabili cause di aumento delle attese](#apg-waits.lwlockmultixact.causes)
+ [Azioni](#apg-waits.lwlockmultixact.actions)

## Versioni del motore supportate
<a name="apg-waits.xactsync.context.supported"></a>

Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.

## Contesto
<a name="apg-waits.lwlockmultixact.context"></a>

Un *multixact* è una struttura dati che memorizza un elenco di ID transazione (XID) che modificano la stessa riga della tabella. Quando una singola transazione fa riferimento alla riga di una tabella, l’ID transazione viene memorizzato nella riga di intestazione della tabella. Quando più transazioni fanno riferimento alla stessa riga di una tabella, l’elenco degli ID transazione viene memorizzato nella struttura dati multixact. Gli eventi di attesa multixact indicano che una sessione sta recuperando dalla struttura dei dati l’elenco delle transazioni che fanno riferimento a una determinata riga di una tabella.

## Probabili cause di aumento delle attese
<a name="apg-waits.lwlockmultixact.causes"></a>

Di seguito sono indicate tre cause comuni dell’uso di multixact:
+ **Sottotransazioni da punti di salvataggio espliciti**: la creazione esplicita di un punto di salvataggio nelle transazioni genera nuove transazioni per la stessa riga. Ad esempio, utilizzando `SELECT FOR UPDATE`, `SAVEPOINT` e quindi `UPDATE`. 

  Alcuni driver, ORM (Object-Relational Mapper) e livelli di astrazione dispongono di opzioni di configurazione per eseguire automaticamente il wrapping di tutte le operazioni con punti di salvataggio. Questo comportamento può generare molti eventi di attesa multixact in alcuni carichi di lavoro. L’opzione `autosave` del driver PostgreSQL JDBC ne è un esempio. Per ulteriori informazioni, consulta [pgJDBC](https://jdbc.postgresql.org/) nella documentazione di PostgreSQL JDBC. Un altro esempio è il driver PostgreSQL ODBC e l’opzione `protocol`. Per ulteriori informazioni, consulta [psqlODBC Configuration Options](https://odbc.postgresql.org/docs/config.html) (Opzioni di configurazione di psqlODBC) nella documentazione del driver PostgreSQL ODBC. 
+ **Sottotransazioni da clausole PL/pgSQL EXCEPTION**: ogni clausola `EXCEPTION` scritta nelle funzioni o procedure PL/pgSQL crea internamente un oggetto `SAVEPOINT`.
+ **Chiavi esterne.** Più transazioni acquisiscono un blocco di condivisione nel record padre.

Quando una determinata riga è inclusa in un’operazione con transazioni multiple, l’elaborazione della riga richiede il recupero degli ID transazione dagli elenchi `multixact`. Se le ricerche non riescono a ottenere il multixact dalla cache di memoria, la struttura dei dati deve essere letta dal livello di archiviazione di Aurora. Questa operazione I/O dall’archiviazione significa che le query SQL possono richiedere più tempo. Gli errori nella cache di memoria possono iniziare a verificarsi con l’utilizzo intensivo, a causa del numero elevato di transazioni multiple. Tutti questi fattori contribuiscono ad un aumento di questo evento di attesa.

## Azioni
<a name="apg-waits.lwlockmultixact.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa. Alcune di queste azioni possono aiutare a ridurre immediatamente gli eventi di attesa. Tuttavia, altre potrebbero richiedere indagini e correzioni per scalare il carico di lavoro.

**Topics**
+ [Eseguire il congelamento del vacuum sulle tabelle con questo evento di attesa](#apg-waits.lwlockmultixact.actions.vacuumfreeze)
+ [Aumentare la frequenza di autovacuum sulle tabelle con questo evento di attesa](#apg-waits.lwlockmultixact.actions.autovacuum)
+ [Aumentare i parametri di memoria](#apg-waits.lwlockmultixact.actions.memoryparam)
+ [Ridurre le transazioni di lunga durata](#apg-waits.lwlockmultixact.actions.longtransactions)
+ [Azioni a lungo termine](#apg-waits.lwlockmultixact.actions.longactions)

### Eseguire il congelamento del vacuum sulle tabelle con questo evento di attesa
<a name="apg-waits.lwlockmultixact.actions.vacuumfreeze"></a>

Se questo evento di attesa si verifica all’improvviso e influisce sull’ambiente di produzione, è possibile utilizzare uno dei seguenti metodi temporanei per ridurne il numero.
+ Utilizzare *VACUUM FREEZE* sulla tabella o sulla partizione di tabella interessata per risolvere immediatamente il problema. Per ulteriori informazioni, consulta [VACUUM](https://www.postgresql.org/docs/current/sql-vacuum.html).
+ Utilizzare la clausola VACUUM (FREEZE, INDEX\$1CLEANUP FALSE) per eseguire un processo di vacuum rapido saltando gli indici. Per ulteriori informazioni, consulta [Vacuum di una tabella il più rapidamente possibile](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Autovacuum.LargeIndexes.html#Appendix.PostgreSQL.CommonDBATasks.Autovacuum.LargeIndexes.Executing).

### Aumentare la frequenza di autovacuum sulle tabelle con questo evento di attesa
<a name="apg-waits.lwlockmultixact.actions.autovacuum"></a>

Dopo aver scansionato tutte le tabelle in tutti i database, VACUUM rimuoverà infine i multixact e i relativi valori multixact meno recenti verranno avanzati. Per ulteriori informazioni, consulta [Multixact e wraparound](https://www.postgresql.org/docs/current/routine-vacuuming.html#VACUUM-FOR-MULTIXACT-WRAPAROUND). Per ridurre al minimo gli eventi di attesa LWLock:MultiXact, è necessario eseguire VACUUM tutte le volte che è necessario. A tale scopo, assicurarsi che VACUUM nel cluster di database Aurora PostgreSQL sia configurato in modo ottimale.

Se l’utilizzo di VACUUM FREEZE sulla tabella o sulla partizione di tabella interessata risolve il problema dell’evento di attesa, è consigliabile utilizzare un pianificatore, ad esempio `pg_cron`, per eseguire VACUUM invece di regolare l’autovacuum a livello di istanza. 

Per aumentare la frequenza di autovacuum, è possibile ridurre il valore del parametro di archiviazione `autovacuum_multixact_freeze_max_age` nella tabella interessata. Per ulteriori informazioni, consulta [autovacuum\$1multixact\$1freeze\$1max\$1age](https://www.postgresql.org/docs/current/runtime-config-autovacuum.html#GUC-AUTOVACUUM-MULTIXACT-FREEZE-MAX-AGE).

### Aumentare i parametri di memoria
<a name="apg-waits.lwlockmultixact.actions.memoryparam"></a>

È possibile ottimizzare l’utilizzo della memoria per le cache multixact regolando i seguenti parametri. Queste impostazioni controllano la quantità di memoria riservata a queste cache, il che può aiutare a ridurre gli eventi di attesa multixact nel carico di lavoro. Per iniziare, è consigliabile utilizzare i seguenti valori:

Per Aurora PostgreSQL 17 e versioni successive:  
+ `multixact_offset_buffers` = 128
+ `multixact_member_buffers` = 256

Per Aurora PostgreSQL 16 e versioni precedenti:  
+ `multixact_offsets_cache_size` = 128
+ `multixact_members_cache_size` = 256

**Nota**  
In Aurora PostgreSQL 17, i nomi dei parametri vengono modificati da `multixact_offsets_cache_size` a `multixact_offset_buffers` e da `multixact_members_cache_size` a `multixact_member_buffers` per allinearli alla versione Community PostgreSQL 17.

È possibile impostare questi parametri a livello di cluster in modo che tutte le istanze del cluster rimangano coerenti. È consigliabile testare e modificare i valori per adattarli al meglio ai requisiti specifici del carico di lavoro e alla classe di istanza. È necessario riavviare l’istanza di scrittura affinché le modifiche ai parametri abbiano effetto.

I parametri sono espressi in termini di voci di cache multixact. Ogni voce di cache utilizza `8 KB` di memoria. Per calcolare la memoria totale riservata, moltiplicare il valore di ogni parametro per `8 KB`. Ad esempio, se si imposta un parametro su 128, la memoria riservata totale sarà `128 * 8 KB = 1 MB`.

### Ridurre le transazioni di lunga durata
<a name="apg-waits.lwlockmultixact.actions.longtransactions"></a>

Le transazioni di lunga durata fanno sì che le informazioni sulle transazioni vengano mantenute nel vacuum fino al commit della transazione o fino alla chiusura della transazione di sola lettura. Ti consigliamo di monitorare e gestire in modo proattivo le transazioni di lunga durata. Per ulteriori informazioni, consulta [Il database ha una connessione di transazione inattiva da molto tempo](PostgreSQL.Tuning_proactive_insights.md#proactive-insights.idle-txn). Provare a modificare l’applicazione per evitare o ridurre al minimo l’uso di transazioni di lunga durata.

### Azioni a lungo termine
<a name="apg-waits.lwlockmultixact.actions.longactions"></a>

Esaminare il carico di lavoro per scoprire la causa dello spillover multixact. È necessario risolvere il problema per scalare il carico di lavoro e ridurre l’evento di attesa.
+ È necessario analizzare il DDL (Data Definition Language) utilizzato per creare le tabelle. Assicurarsi che le strutture e gli indici delle tabelle siano ben progettati.
+ Se le tabelle interessate hanno chiavi esterne, stabilire se sono necessarie o se esiste un altro modo per applicare l’integrità referenziale.
+ Quando una tabella ha indici inutilizzati di grandi dimensioni, l’autovacuum può non adattarsi al carico di lavoro e potrebbe impedirne l’esecuzione. Per evitare ciò, verificare la presenza di indici non utilizzati e rimuoverli completamente. Per ulteriori informazioni, consulta [Gestione dell’autovacuum con indici di grandi dimensioni](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Autovacuum.LargeIndexes.html).
+ Ridurre l’uso di punti di salvataggio nelle transazioni.

# LWLock:pg\$1stat\$1statements
<a name="apg-rpg-lwlockpgstat"></a>

L'evento di LWLock aspetta:pg\$1stat\$1statements si verifica quando l'estensione blocca in modo esclusivo la tabella hash che tiene traccia delle istruzioni SQL. `pg_stat_statements` Ciò accade nei seguenti scenari:
+ Quando il numero di istruzioni tracciate raggiunge il valore del parametro `pg_stat_statements.max` configurato ed è necessario lasciare spazio a ulteriori voci, l’estensione esegue un ordinamento in base al numero di chiamate, rimuove il 5% delle istruzioni meno eseguite e ripopola l’hash con le voci rimanenti.
+ Quando `pg_stat_statements` esegue un’operazione `garbage collection` sul file `pgss_query_texts.stat` su disco e riscrive il file.

**Topics**
+ [Versioni del motore supportate](#apg-rpg-lwlockpgstat.supported)
+ [Contesto](#apg-rpg-lwlockpgstat.context)
+ [Probabili cause di aumento delle attese](#apg-rpg-lwlockpgstat.causes)
+ [Azioni](#apg-rpg-lwlockpgstat.actions)

## Versioni del motore supportate
<a name="apg-rpg-lwlockpgstat.supported"></a>

 Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL. 

## Contesto
<a name="apg-rpg-lwlockpgstat.context"></a>

**Comprendere l’estensione pg\$1stat\$1statements**: l’estensione pg\$1stat\$1statements tiene traccia delle statistiche di esecuzione delle istruzioni SQL in una tabella hash. L’estensione tiene traccia delle istruzioni SQL fino al limite definito dal parametro `pg_stat_statements.max`. Questo parametro determina il numero massimo di istruzioni che possono essere tracciate che corrisponde al numero massimo di righe nella vista pg\$1stat\$1statements.

**Persistenza delle statistiche delle istruzioni**: l’estensione mantiene le statistiche delle istruzioni tra i riavvii dell’istanza mediante:
+ Scrittura di dati in un file denominato pg\$1stat\$1statements.stat
+ Utilizzo del parametro pg\$1statements.save per controllare il comportamento di persistenza

Quando pg\$1statements.save è impostato su:
+ on (impostazione predefinita): le statistiche vengono salvate all’arresto e ricaricate all’avvio del server
+ off: le statistiche non vengono salvate all’arresto né ricaricate all’avvio del server

**Archiviazione del testo delle query**: l’estensione archivia il testo delle query tracciate in un file denominato `pgss_query_texts.stat`. Questo file può aumentare fino a raddoppiare la dimensione media di tutte le istruzioni SQL tracciate prima che si verifichi la rimozione di oggetti inutili. L’estensione richiede un blocco esclusivo sulla tabella hash durante le operazioni di pulizia e riscrittura del file `pgss_query_texts.stat`.

**Processo di deallocazione delle istruzioni**: quando il numero di istruzioni tracciate raggiunge il limite `pg_stat_statements.max` ed è necessario tenere traccia delle nuove istruzioni, l’estensione:
+ Richiede un blocco esclusivo (:pg\$1stat\$1statements) sulla tabella hash. LWLock
+ Carica i dati esistenti nella memoria locale.
+ Esegue un ordinamento rapido in base al numero di chiamate.
+ Rimuove le istruzioni meno chiamate (inferiore al 5%).
+ Ripopola la tabella hash con le voci rimanenti.

**Monitoraggio della deallocazione delle istruzioni**: in PostgreSQL 14 e versioni successive, è possibile monitorare la deallocazione delle istruzioni utilizzando la vista pg\$1stat\$1statements\$1info. Questa visualizzazione include una colonna dealloc che mostra quante volte le istruzioni sono state deallocate per fare spazio a quelle nuove

Se la deallocazione delle istruzioni si verifica frequentemente, ciò comporterà una rimozione di oggetti inutili più frequente del file `pgss_query_texts.stat` su disco.

## Probabili cause di aumento delle attese
<a name="apg-rpg-lwlockpgstat.causes"></a>

Le cause tipiche dell’aumento delle attese di `LWLock:pg_stat_statements` includono:
+ Un aumento del numero di query univoche utilizzate dall’applicazione.
+ Il valore del parametro `pg_stat_statements.max` è piccolo rispetto al numero di query univoche utilizzate.

## Azioni
<a name="apg-rpg-lwlockpgstat.actions"></a>

Consigliamo azioni diverse a seconda delle cause dell’evento di attesa. È possibile identificare gli eventi `LWLock:pg_stat_statements` utilizzando Approfondimenti sulle prestazioni di Amazon RDS o eseguendo una query sulla vista `pg_stat_activity`.

Regola i seguenti `pg_stat_statements` parametri per controllare il comportamento di tracciamento e ridurre gli eventi di attesa delle istruzioni pg\$1stat\$1. LWLock

**Topics**
+ [Disabilitare il parametro pg\$1stat\$1statements.track](#apg-rpg-lwlockpgstat.actions.disabletrack)
+ [Aumentare il parametro pg\$1stat\$1statements.max](#apg-rpg-lwlockpgstat.actions.increasemax)
+ [Disabilitare il parametro pg\$1stat\$1statements.track\$1utility](#apg-rpg-lwlockpgstat.actions.disableutility)

### Disabilitare il parametro pg\$1stat\$1statements.track
<a name="apg-rpg-lwlockpgstat.actions.disabletrack"></a>

Se l'evento di LWLock aspetta:pg\$1stat\$1statements ha un impatto negativo sulle prestazioni del database ed è necessaria una soluzione rapida prima di un'ulteriore analisi della vista `pg_stat_statements` per identificare la causa principale, il parametro può essere disabilitato impostandolo su. `pg_stat_statements.track` `none` In questo modo verrà disabilitata la raccolta delle statistiche sulle istruzioni.

### Aumentare il parametro pg\$1stat\$1statements.max
<a name="apg-rpg-lwlockpgstat.actions.increasemax"></a>

Per ridurre la deallocazione e minimizzare la rimozione di oggetti inutili del file `pgss_query_texts.stat` su disco, aumentare il valore del parametro `pg_stat_statements.max`. Il valore predefinito è `5,000`.

**Nota**  
Il parametro `pg_stat_statements.max` è statico. È necessario riavviare l’istanza database per applicare le modifiche a questo parametro. 

### Disabilitare il parametro pg\$1stat\$1statements.track\$1utility
<a name="apg-rpg-lwlockpgstat.actions.disableutility"></a>

È possibile analizzare la vista pg\$1stat\$1statements per determinare quali comandi di utilità stanno consumando la maggior parte delle risorse monitorate da `pg_stat_statements`.

Il parametro `pg_stat_statements.track_utility` controlla se il modulo tiene traccia dei comandi di utilità, che includono tutti i comandi tranne SELECT, INSERT, UPDATE, DELETE e MERGE. Il valore del parametro è `on` per impostazione predefinita.

Ad esempio, quando l’applicazione utilizza molte query sui punti di salvataggio, che sono intrinsecamente univoche, può aumentare la deallocazione delle istruzioni. Per risolvere questo problema, è possibile disabilitare il parametro `pg_stat_statements.track_utility` per impedire a `pg_stat_statements` di monitorare le query sui punti di salvataggio.

**Nota**  
Il parametro `pg_stat_statements.track_utility` è un parametro dinamico. È possibile modificarne il valore senza riavviare l’istanza database.

**Example Esempio di query univoche sui punti di salvataggio in pg\$1stat\$1statements**  <a name="savepoint-queries"></a>

```
                     query                       |       queryid       
-------------------------------------------------+---------------------
 SAVEPOINT JDBC_SAVEPOINT_495701                 | -7249565344517699703
 SAVEPOINT JDBC_SAVEPOINT_1320                   | -1572997038849006629
 SAVEPOINT JDBC_SAVEPOINT_26739                  |  54791337410474486
 SAVEPOINT JDBC_SAVEPOINT_1294466                |  8170064357463507593
 ROLLBACK TO SAVEPOINT JDBC_SAVEPOINT_65016      | -33608214779996400
 SAVEPOINT JDBC_SAVEPOINT_14185                  | -2175035613806809562
 SAVEPOINT JDBC_SAVEPOINT_45837                  | -6201592986750645383
 SAVEPOINT JDBC_SAVEPOINT_1324                   |  6388797791882029332
```

PostgreSQL 17 introduce diversi miglioramenti per il tracciamento dei comandi di utilità:
+ I nomi dei punti di salvataggio vengono ora visualizzati come costanti.
+ La transazione globale IDs (GIDs) dei comandi di commit in due fasi viene ora visualizzata come costanti.
+ I nomi delle istruzioni DEALLOCATE vengono visualizzati come costanti.
+ I parametri CALL vengono ora visualizzati come costanti.

# Timeout: PG Sleep
<a name="apg-waits.timeoutpgsleep"></a>

L’evento `Timeout:PgSleep` si verifica quando un processo server ha chiamato la funzione `pg_sleep` e sta aspettando la scadenza del timeout del sonno.

**Topics**
+ [Versioni del motore supportate](#apg-waits.timeoutpgsleep.context.supported)
+ [Probabili cause di aumento delle attese](#apg-waits.timeoutpgsleep.causes)
+ [Azioni](#apg-waits.timeoutpgsleep.actions)

## Versioni del motore supportate
<a name="apg-waits.timeoutpgsleep.context.supported"></a>

Queste informazioni relative all'evento di attesa sono supportate per tutte el versioni di Aurora PostgreSQL.

## Probabili cause di aumento delle attese
<a name="apg-waits.timeoutpgsleep.causes"></a>

Questo evento di attesa si verifica quando un'applicazione, una funzione memorizzata o un utente emette un'istruzione SQL che chiama una delle seguenti funzioni:
+ `pg_sleep`
+ `pg_sleep_for`
+ `pg_sleep_until`

Le funzioni precedenti ritardano l'esecuzione fino a quando non è trascorso il numero di secondi specificato. Ad esempio: `SELECT pg_sleep(1)` si ferma per 1 secondo. Per ulteriori informazioni, consulta [Ritardo dell'esecuzione](https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-DELAY) nella documentazione di PostgreSQL.

## Azioni
<a name="apg-waits.timeoutpgsleep.actions"></a>

Identificare la dichiarazione che stava eseguendo la funzione `pg_sleep`. Determina se l'uso della funzione è appropriato.