Informazioni sulla memoria condivisa di PostgreSQL

Completato

PostgreSQL usa la memoria che può essere classificata come:

  • memoria locale allocata a ogni processo
  • memoria condivisa usata da tutti i processi

Memoria locale

Ogni processo in PostgreSQL richiede memoria per l'elaborazione delle query. I parametri del server seguenti consentono di definire l'utilizzo della memoria:

work_mem definisce la memoria necessaria per l'ordinamento delle tuple per le operazioni ORDER BY e DISTINCT. Questo parametro determina la quantità di memoria disponibile per le operazioni di ordinamento interne e le tabelle hash. Se si dispone di una grande quantità di memoria disponibile e il carico di lavoro dispone di query con ordinamento complesso, l'aumento di questo valore di parametro potrebbe migliorare le prestazioni consentendo analisi di dimensioni maggiori in memoria prima della distribuzione su disco.

Tuttavia, una query complessa potrebbe avere molte operazioni di ordinamento e hash in esecuzione simultaneamente. Ogni operazione usa la quantità di memoria consentita da questo valore prima di iniziare a scrivere in file temporanei basati su disco. In un sistema occupato, pertanto, l'utilizzo totale della memoria è molte volte quello di un singolo parametro work_mem.

Per ottimizzare questo valore, usare Total RAM * 0,25 / max_connections come valore iniziale.

maintenance_work_mem è la memoria richiesta da vacuum e reindex. Questo parametro determina la quantità di memoria disponibile per le operazioni di ordinamento interne e le tabelle hash. Il valore predefinito è 64 KB, ma aumentando questo valore si migliorano le prestazioni per la pulizia della memoria.

autovacuum_work_mem imposta la memoria massima da usare per ogni processo autovacuum.

temp_buffers definisce la memoria per l'archiviazione di tabelle temporanee. Questo parametro imposta il numero massimo di buffer temporanei utilizzati da ogni sessione del database.

effective_cache_size definisce la quantità di memoria disponibile per la memorizzazione nella cache del disco dal sistema operativo e all'interno del database. PostgreSQL Query Planner determina se questa memoria è fissa nella RAM. È molto probabile che le analisi degli indici vengano usate in base a valori più elevati; in caso contrario, le analisi sequenziali vengono usate se il valore è basso.

Impostare effective_cache_size su 50% della RAM totale della macchina.

Memoria condivisa

La memoria condivisa viene allocata all'avvio. La memoria condivisa viene usata per:

shared_buffers definisce i buffer di memoria condivisa usati dal server. PostgreSQL carica pagine di tabelle e indici dall'archiviazione permanente a un pool di buffer condiviso e quindi li lavora in memoria. Questo pool di buffer condiviso è il componente principale della memoria condivisa usata dal server. Il valore predefinito è 128 MB (a seconda del livello di calcolo). Se si decide di allocare più memoria, è necessario riavviare il server.

wal_buffers definisce il numero di buffer di pagine del disco nella memoria condivisa per il logging anticipato (WAL) prima di scriverle su archiviazione persistente.

In sintesi, i parametri importanti del server relativi alla memoria che è possibile ottimizzare sono:

  • shared_buffers
  • work_mem
  • dimensione_cache_effettiva