Condividi tramite


Utilizzo delle risorse / Memoria

autovacuum_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per ogni processo di lavoro autovacuum.
Tipo di dati integer
Valore predefinito -1
Valori consentiti -1-2097151
Tipo di parametro dynamic
Documentation autovacuum_work_mem

commit_timestamp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache del timestamp di commit. Specificare 0 per fare in modo che questo valore sia determinato come frazione di shared_buffers.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 0-131072
Tipo di parametro Statica
Documentation commit_timestamp_buffers

tipo_di_memoria_condivisa_dinamica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa dinamica usata.
Tipo di dati enumeration
Valore predefinito posix
Valori consentiti posix
Tipo di parametro Sola lettura
Documentation tipo_memoria_condivisa_dinamica

hash_mem_multiplier

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Multiplo di "work_mem" da usare per le tabelle hash.
Tipo di dati NUMERIC
Valore predefinito 2
Valori consentiti 1-1000
Tipo di parametro dynamic
Documentation hash_mem_multiplier

huge_pages

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Uso di grandi pagine in Linux o Windows.
Tipo di dati enumeration
Valore predefinito try
Valori consentiti on,off,try
Tipo di parametro Statica
Documentation huge_pages

Description

Le pagine enormi sono una funzionalità che consente la gestione della memoria in blocchi più grandi. In genere è possibile gestire blocchi fino a 2 MB, anziché le pagine standard da 4 KB.

L'uso di pagine enormi può offrire vantaggi in termini di prestazioni che consentono di eseguire in modo efficace l'offload della CPU:

  • Riducono il sovraccarico associato alle attività di gestione della memoria, diminuendo ad esempio il numero di mancati riscontri nel TLB.
  • Riducono il tempo necessario per la gestione della memoria.

In particolare, in PostgreSQL è possibile usare grandi pagine solo per l'area di memoria condivisa. Una parte significativa dell'area di memoria condivisa viene allocata per i buffer condivisi.

Un altro vantaggio è che grandi pagine impediscono lo scambio dell'area di memoria condivisa su disco, che stabilizza ulteriormente le prestazioni.

Recommendations

  • Per i server con risorse di memoria significative, evitare di disabilitare grandi pagine. La disabilitazione di grandi pagine potrebbe compromettere le prestazioni.
  • Se si inizia con un server più piccolo che non supporta pagine di grandi dimensioni, ma si prevede di aumentare le prestazioni fino a un server che lo fa, mantenere l'impostazione huge_pages su TRY per una transizione senza interruzioni e prestazioni ottimali.

Note specifiche su Azure

Per i server con quattro o più vCore, le pagine di grandi dimensioni vengono allocate automaticamente dal sistema operativo sottostante. La funzionalità non è disponibile per i server con meno di quattro vCore. Il numero delle pagine grandi viene modificato automaticamente se vengono modificate le impostazioni di memoria condivisa, incluse le modifiche a shared_buffers.

huge_page_size

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Dimensioni di una pagina molto grande che deve essere richiesta.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation huge_page_size

io_combine_limit

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Limita le dimensioni delle letture e delle scritture di dati.
Tipo di dati integer
Valore predefinito 16
Valori consentiti 1-128
Tipo di parametro dynamic
Documentation io_combine_limit

io_max_combine_limit

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Limite a livello di server che blocca io_combine_limit.
Tipo di dati integer
Valore predefinito 16
Valori consentiti 1-128
Tipo di parametro dynamic
Documentation io_max_combine_limit

io_max_concurrency

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Numero massimo di operazioni di I/O che un processo può eseguire contemporaneamente.
Tipo di dati integer
Valore predefinito 64
Valori consentiti -1-1024
Tipo di parametro Statica
Documentation io_max_concurrency

io_metodo

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona il metodo per l'esecuzione di operazioni di I/O asincrone.
Tipo di dati enumeration
Valore predefinito worker
Valori consentiti worker,sync
Tipo di parametro Statica
Documentation io_method

io_workers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Numero di processi di lavoro di I/O per io_method=worker.
Tipo di dati integer
Valore predefinito 3
Valori consentiti 1-32
Tipo di parametro dynamic
Documentation io_workers

logical_decoding_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per la decodifica logica. Questa quantità di memoria può essere usata da ogni buffer di riordinamento interno prima della distribuzione su disco.
Tipo di dati integer
Valore predefinito 65536
Valori consentiti 64-2147483647
Tipo di parametro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da utilizzare per le operazioni di manutenzione. Sono incluse operazioni come VACUUM e CREATE INDEX.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 1024-2097151
Tipo di parametro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem è un parametro di configurazione in PostgreSQL. Controlla la quantità di memoria allocata per le operazioni di manutenzione, ad esempio VACUUM, CREATE INDEXe ALTER TABLE. A differenza di work_mem, che influisce sull'allocazione di memoria per le operazioni di query, maintenance_work_mem è riservata alle attività che mantengono e ottimizzano la struttura del database.

! [NOTA] Impostare maintenance_work_mem su valori eccessivamente aggressivi potrebbe causare periodicamente un errore di memoria insufficiente nel sistema. È estremamente importante comprendere la quantità di memoria disponibile nel server e il numero di operazioni simultanee che potrebbero allocare memoria per le attività descritte in precedenza, prima di apportare modifiche a questo parametro.

Punti chiave

  • Limite di memoria per le operazioni vacuum : se si vuole velocizzare la rimozione delle tuple inattive aumentando il valore di maintenance_work_mem, tenere presente che in VACUUM è presente una limitazione predefinita per la raccolta di identificatori di tuple inattive. Può usare fino a 1 GB di memoria per questo processo.
  • Separazione della memoria per autovacuum: è possibile usare l'impostazione autovacuum_work_mem per controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset di maintenance_work_mem. È possibile decidere la quantità di memoria usata dall'autovacuum senza influire sull'allocazione di memoria per altre attività di manutenzione e operazioni di definizione dei dati.

Note specifiche su Azure

Il valore predefinito per il parametro del server maintenance_work_mem viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto al calcolo che supporta il server flessibile non avranno alcun effetto sul valore predefinito per il parametro server maintenance_work_mem di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il maintenance_work_mem parametro in base ai valori nella formula seguente.

La formula utilizzata per calcolare il valore di maintenance_work_mem è (long)(82.5 * ln(memoryGiB) + 40) * 1024.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di transazioni preparate contemporaneamente.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0-262143
Tipo di parametro Statica
Documentation max_prepared_transactions

max_stack_depth (profondità_massima_dello_stack)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la profondità massima dello stack, in kilobyte.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 2048
Tipo di parametro Sola lettura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Quantità di memoria condivisa dinamica riservata all'avvio.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation min_dynamic_shared_memory

multixact_member_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache dei membri MultiXact.
Tipo di dati integer
Valore predefinito 32
Valori consentiti 16-131072
Tipo di parametro Statica
Documentation multixact_member_buffers

multixact_offset_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache di offset MultiXact.
Tipo di dati integer
Valore predefinito 16
Valori consentiti 16-131072
Tipo di parametro Statica
Documentation multixact_offset_buffers

buffer_di_notifica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache dei messaggi LISTEN/NOTIFY.
Tipo di dati integer
Valore predefinito 16
Valori consentiti 16-131072
Tipo di parametro Statica
Documentation notify_buffers

serializable_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache delle transazioni serializzabile.
Tipo di dati integer
Valore predefinito 32
Valori consentiti 16-131072
Tipo di parametro Statica
Documentation serializable_buffers

shared_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero di buffer di memoria condivisa usati dal server.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 16-1073741823
Tipo di parametro Statica
Documentation shared_buffers

Description

Il shared_buffers parametro di configurazione determina la quantità di memoria di sistema allocata al database PostgreSQL per il buffering dei dati. Funge da pool di memoria centralizzato accessibile a tutti i processi di database.

Quando sono necessari i dati, il processo del database controlla prima di tutto il buffer condiviso. Se i dati necessari sono presenti, vengono recuperati rapidamente e ignora una lettura disco che richiede più tempo. I buffer condivisi fungono da intermediario tra i processi del database e il disco e riducono in modo efficace il numero di operazioni di I/O necessarie.

Note specifiche su Azure

Il valore predefinito per il parametro del server shared_buffers viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto per il calcolo che supporta il server flessibile non hanno alcun effetto sul valore predefinito del shared_buffers parametro server di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il shared_buffers parametro in base ai valori nelle formule seguenti.

Per le macchine virtuali con un massimo di 2 GiB di memoria, la formula usata per calcolare il valore di shared_buffers è memoryGib * 16384.

Per le macchine virtuali con più di 2 GiB, la formula usata per calcolare il valore di shared_buffers è memoryGib * 32768.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_di_memoria_condivisa

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa usata per l'area di memoria condivisa principale.
Tipo di dati enumeration
Valore predefinito mmap
Valori consentiti mmap
Tipo di parametro Sola lettura
Documentation tipo_di_memoria_condivisa

subtransaction_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache di sottotrasmissione. Specificare 0 per fare in modo che questo valore sia determinato come frazione di shared_buffers.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 0-131072
Tipo di parametro Statica
Documentation subtransaction_buffers

temp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di buffer temporanei utilizzati da ogni sessione.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 100-1073741823
Tipo di parametro dynamic
Documentation temp_buffers

buffer_di_transazione

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache dello stato della transazione. Specificare 0 per fare in modo che questo valore sia determinato come frazione di shared_buffers.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 0-131072
Tipo di parametro Statica
Documentation transaction_buffers

vacuum_buffer_usage_limit

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer per VACUUM, ANALYZE e autovacuum.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 0-16777216
Tipo di parametro dynamic
Documentation vacuum_buffer_usage_limit

work_mem (memoria di lavoro)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per le aree di lavoro di query. Questa quantità di memoria può essere usata da ogni operazione di ordinamento interna e tabella hash prima di passare ai file temporanei del disco.
Tipo di dati integer
Valore predefinito 4096
Valori consentiti 4096-2097151
Tipo di parametro dynamic
Documentation work_mem

Description

Il work_mem parametro in PostgreSQL controlla la quantità di memoria allocata per determinate operazioni interne all'interno dell'area di memoria privata di ogni sessione del database. Esempi di queste operazioni sono l'ordinamento e l'hashing.

A differenza dei buffer condivisi, che si trovano nell'area di memoria condivisa, work_mem vengono allocati in uno spazio di memoria privata per sessione o per query. Impostando dimensioni adeguate work_mem , è possibile migliorare significativamente l'efficienza di queste operazioni e ridurre la necessità di scrivere dati temporanei su disco.

Punti chiave

  • Memoria di connessione privata: work_mem fa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa che shared_buffers usa.
  • Utilizzo specifico delle query: non tutte le sessioni o query usano work_mem. È improbabile che le query semplici, ad esempio SELECT 1 , richiedano work_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi di work_mem.
  • Operazioni parallele: per le query che si estendono su più back-end paralleli, ogni back-end potrebbe potenzialmente usare uno o più blocchi di work_mem.

Monitoraggio e regolazione di work_mem

È essenziale monitorare continuamente le prestazioni del sistema e regolare work_mem in base alle esigenze, soprattutto se i tempi di esecuzione delle query correlati all'ordinamento o alle operazioni di hashing sono lenti. Ecco i modi per monitorare le prestazioni usando gli strumenti disponibili nel portale di Azure:

Regolazione granulare

Mentre si gestisce il work_mem parametro, spesso è più efficiente adottare un approccio di regolazione granulare anziché impostare un valore globale. Questo approccio garantisce che allocare la memoria in modo giudizioso in base alle esigenze specifiche di processi e utenti. Riduce inoltre al minimo il rischio di riscontrare problemi di memoria insufficiente. Ecco come procedere:

  • Livello utente: se un utente specifico è coinvolto principalmente nelle attività di aggregazione o creazione di report, che richiedono un utilizzo intensivo della memoria, valutare la possibilità di personalizzare il work_mem valore per tale utente. Usare il ALTER ROLE comando per migliorare le prestazioni delle operazioni dell'utente.

  • Livello di funzione/routine: se funzioni o routine specifiche generano file temporanei sostanziali, l'aumento del work_mem valore a livello di funzione o routine specifico può essere vantaggioso. Usare il ALTER FUNCTION comando o ALTER PROCEDURE per allocare in modo specifico più memoria a queste operazioni.

  • Livello di database: modificare work_mem a livello di database se solo database specifici generano un numero elevato di file temporanei.

  • Livello globale: se un'analisi del sistema rivela che la maggior parte delle query genera piccoli file temporanei, mentre solo alcuni creano file di grandi dimensioni, potrebbe essere prudente aumentare il work_mem valore a livello globale. Questa azione facilita la maggior parte delle query da elaborare in memoria, in modo da evitare operazioni basate su disco e migliorare l'efficienza. Tuttavia, prestare sempre attenzione e monitorare l'utilizzo della memoria nel server per assicurarsi che possa gestire il valore aumentato work_mem .

Determinazione del valore minimo work_mem per le operazioni di ordinamento

Per trovare il valore minimo work_mem per una query specifica, in particolare uno che genera file di disco temporanei durante il processo di ordinamento, iniziare considerando le dimensioni temporanee del file generate durante l'esecuzione della query. Ad esempio, se una query genera un file temporaneo di 20 MB:

  1. Connettersi al database usando psql o il client PostgreSQL preferito.
  2. Impostare un valore iniziale di work_mem leggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio : SET work_mem TO '25MB'.
  3. Nella stessa sessione, eseguire EXPLAIN ANALYZE nella query problematica.
  4. Esaminare l'output per "Sort Method: quicksort Memory: xkB". Se indica "external merge Disk: xkB", aumentare incrementally il valore work_mem e ripetere il test fino a quando appare "quicksort Memory". La presenza di "quicksort Memory" indica che la query è ora in esecuzione in memoria.
  5. Dopo aver determinato il valore tramite questo metodo, è possibile applicarlo a livello globale o su livelli più granulari (come descritto in precedenza) in base alle esigenze operative.

autovacuum_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per ogni processo di lavoro autovacuum.
Tipo di dati integer
Valore predefinito -1
Valori consentiti -1-2097151
Tipo di parametro dynamic
Documentation autovacuum_work_mem

commit_timestamp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache del timestamp di commit. Specificare 0 per fare in modo che questo valore sia determinato come frazione di shared_buffers.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 0-131072
Tipo di parametro Statica
Documentation commit_timestamp_buffers

tipo_di_memoria_condivisa_dinamica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa dinamica usata.
Tipo di dati enumeration
Valore predefinito posix
Valori consentiti posix
Tipo di parametro Sola lettura
Documentation tipo_memoria_condivisa_dinamica

hash_mem_multiplier

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Multiplo di "work_mem" da usare per le tabelle hash.
Tipo di dati NUMERIC
Valore predefinito 2
Valori consentiti 1-1000
Tipo di parametro dynamic
Documentation hash_mem_multiplier

huge_pages

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Uso di grandi pagine in Linux o Windows.
Tipo di dati enumeration
Valore predefinito try
Valori consentiti on,off,try
Tipo di parametro Statica
Documentation huge_pages

Description

Le pagine enormi sono una funzionalità che consente la gestione della memoria in blocchi più grandi. In genere è possibile gestire blocchi fino a 2 MB, anziché le pagine standard da 4 KB.

L'uso di pagine enormi può offrire vantaggi in termini di prestazioni che consentono di eseguire in modo efficace l'offload della CPU:

  • Riducono il sovraccarico associato alle attività di gestione della memoria, diminuendo ad esempio il numero di mancati riscontri nel TLB.
  • Riducono il tempo necessario per la gestione della memoria.

In particolare, in PostgreSQL è possibile usare grandi pagine solo per l'area di memoria condivisa. Una parte significativa dell'area di memoria condivisa viene allocata per i buffer condivisi.

Un altro vantaggio è che grandi pagine impediscono lo scambio dell'area di memoria condivisa su disco, che stabilizza ulteriormente le prestazioni.

Recommendations

  • Per i server con risorse di memoria significative, evitare di disabilitare grandi pagine. La disabilitazione di grandi pagine potrebbe compromettere le prestazioni.
  • Se si inizia con un server più piccolo che non supporta pagine di grandi dimensioni, ma si prevede di aumentare le prestazioni fino a un server che lo fa, mantenere l'impostazione huge_pages su TRY per una transizione senza interruzioni e prestazioni ottimali.

Note specifiche su Azure

Per i server con quattro o più vCore, le pagine di grandi dimensioni vengono allocate automaticamente dal sistema operativo sottostante. La funzionalità non è disponibile per i server con meno di quattro vCore. Il numero delle pagine grandi viene modificato automaticamente se vengono modificate le impostazioni di memoria condivisa, incluse le modifiche a shared_buffers.

huge_page_size

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Dimensioni di una pagina molto grande che deve essere richiesta.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation huge_page_size

io_combine_limit

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Limita le dimensioni delle letture e delle scritture di dati.
Tipo di dati integer
Valore predefinito 16
Valori consentiti 16
Tipo di parametro Sola lettura
Documentation io_combine_limit

logical_decoding_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per la decodifica logica. Questa quantità di memoria può essere usata da ogni buffer di riordinamento interno prima della distribuzione su disco.
Tipo di dati integer
Valore predefinito 65536
Valori consentiti 64-2147483647
Tipo di parametro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da utilizzare per le operazioni di manutenzione. Sono incluse operazioni come VACUUM e CREATE INDEX.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 1024-2097151
Tipo di parametro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem è un parametro di configurazione in PostgreSQL. Controlla la quantità di memoria allocata per le operazioni di manutenzione, ad esempio VACUUM, CREATE INDEXe ALTER TABLE. A differenza di work_mem, che influisce sull'allocazione di memoria per le operazioni di query, maintenance_work_mem è riservata alle attività che mantengono e ottimizzano la struttura del database.

! [NOTA] Impostare maintenance_work_mem su valori eccessivamente aggressivi potrebbe causare periodicamente un errore di memoria insufficiente nel sistema. È estremamente importante comprendere la quantità di memoria disponibile nel server e il numero di operazioni simultanee che potrebbero allocare memoria per le attività descritte in precedenza, prima di apportare modifiche a questo parametro.

Punti chiave

  • Limite di memoria per le operazioni vacuum : se si vuole velocizzare la rimozione delle tuple inattive aumentando il valore di maintenance_work_mem, tenere presente che in VACUUM è presente una limitazione predefinita per la raccolta di identificatori di tuple inattive. Può usare fino a 1 GB di memoria per questo processo.
  • Separazione della memoria per autovacuum: è possibile usare l'impostazione autovacuum_work_mem per controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset di maintenance_work_mem. È possibile decidere la quantità di memoria usata dall'autovacuum senza influire sull'allocazione di memoria per altre attività di manutenzione e operazioni di definizione dei dati.

Note specifiche su Azure

Il valore predefinito per il parametro del server maintenance_work_mem viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto al calcolo che supporta il server flessibile non avranno alcun effetto sul valore predefinito per il parametro server maintenance_work_mem di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il maintenance_work_mem parametro in base ai valori nella formula seguente.

La formula utilizzata per calcolare il valore di maintenance_work_mem è (long)(82.5 * ln(memoryGiB) + 40) * 1024.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di transazioni preparate contemporaneamente.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0-262143
Tipo di parametro Statica
Documentation max_prepared_transactions

max_stack_depth (profondità_massima_dello_stack)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la profondità massima dello stack, in kilobyte.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 2048
Tipo di parametro Sola lettura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Quantità di memoria condivisa dinamica riservata all'avvio.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation min_dynamic_shared_memory

multixact_member_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache dei membri MultiXact.
Tipo di dati integer
Valore predefinito 32
Valori consentiti 16-131072
Tipo di parametro Statica
Documentation multixact_member_buffers

multixact_offset_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache di offset MultiXact.
Tipo di dati integer
Valore predefinito 16
Valori consentiti 16-131072
Tipo di parametro Statica
Documentation multixact_offset_buffers

buffer_di_notifica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache dei messaggi LISTEN/NOTIFY.
Tipo di dati integer
Valore predefinito 16
Valori consentiti 16-131072
Tipo di parametro Statica
Documentation notify_buffers

serializable_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache delle transazioni serializzabile.
Tipo di dati integer
Valore predefinito 32
Valori consentiti 16-131072
Tipo di parametro Statica
Documentation serializable_buffers

shared_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero di buffer di memoria condivisa usati dal server.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 16-1073741823
Tipo di parametro Statica
Documentation shared_buffers

Description

Il shared_buffers parametro di configurazione determina la quantità di memoria di sistema allocata al database PostgreSQL per il buffering dei dati. Funge da pool di memoria centralizzato accessibile a tutti i processi di database.

Quando sono necessari i dati, il processo del database controlla prima di tutto il buffer condiviso. Se i dati necessari sono presenti, vengono recuperati rapidamente e ignora una lettura disco che richiede più tempo. I buffer condivisi fungono da intermediario tra i processi del database e il disco e riducono in modo efficace il numero di operazioni di I/O necessarie.

Note specifiche su Azure

Il valore predefinito per il parametro del server shared_buffers viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto per il calcolo che supporta il server flessibile non hanno alcun effetto sul valore predefinito del shared_buffers parametro server di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il shared_buffers parametro in base ai valori nelle formule seguenti.

Per le macchine virtuali con un massimo di 2 GiB di memoria, la formula usata per calcolare il valore di shared_buffers è memoryGib * 16384.

Per le macchine virtuali con più di 2 GiB, la formula usata per calcolare il valore di shared_buffers è memoryGib * 32768.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_di_memoria_condivisa

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa usata per l'area di memoria condivisa principale.
Tipo di dati enumeration
Valore predefinito mmap
Valori consentiti mmap
Tipo di parametro Sola lettura
Documentation tipo_di_memoria_condivisa

subtransaction_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache di sottotrasmissione. Specificare 0 per fare in modo che questo valore sia determinato come frazione di shared_buffers.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 0-131072
Tipo di parametro Statica
Documentation subtransaction_buffers

temp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di buffer temporanei utilizzati da ogni sessione.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 100-1073741823
Tipo di parametro dynamic
Documentation temp_buffers

buffer_di_transazione

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer dedicato utilizzato per la cache dello stato della transazione. Specificare 0 per fare in modo che questo valore sia determinato come frazione di shared_buffers.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 0-131072
Tipo di parametro Statica
Documentation transaction_buffers

vacuum_buffer_usage_limit

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer per VACUUM, ANALYZE e autovacuum.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 0-16777216
Tipo di parametro dynamic
Documentation vacuum_buffer_usage_limit

work_mem (memoria di lavoro)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per le aree di lavoro di query. Questa quantità di memoria può essere usata da ogni operazione di ordinamento interna e tabella hash prima di passare ai file temporanei del disco.
Tipo di dati integer
Valore predefinito 4096
Valori consentiti 4096-2097151
Tipo di parametro dynamic
Documentation work_mem

Description

Il work_mem parametro in PostgreSQL controlla la quantità di memoria allocata per determinate operazioni interne all'interno dell'area di memoria privata di ogni sessione del database. Esempi di queste operazioni sono l'ordinamento e l'hashing.

A differenza dei buffer condivisi, che si trovano nell'area di memoria condivisa, work_mem vengono allocati in uno spazio di memoria privata per sessione o per query. Impostando dimensioni adeguate work_mem , è possibile migliorare significativamente l'efficienza di queste operazioni e ridurre la necessità di scrivere dati temporanei su disco.

Punti chiave

  • Memoria di connessione privata: work_mem fa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa che shared_buffers usa.
  • Utilizzo specifico delle query: non tutte le sessioni o query usano work_mem. È improbabile che le query semplici, ad esempio SELECT 1 , richiedano work_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi di work_mem.
  • Operazioni parallele: per le query che si estendono su più back-end paralleli, ogni back-end potrebbe potenzialmente usare uno o più blocchi di work_mem.

Monitoraggio e regolazione di work_mem

È essenziale monitorare continuamente le prestazioni del sistema e regolare work_mem in base alle esigenze, soprattutto se i tempi di esecuzione delle query correlati all'ordinamento o alle operazioni di hashing sono lenti. Ecco i modi per monitorare le prestazioni usando gli strumenti disponibili nel portale di Azure:

Regolazione granulare

Mentre si gestisce il work_mem parametro, spesso è più efficiente adottare un approccio di regolazione granulare anziché impostare un valore globale. Questo approccio garantisce che allocare la memoria in modo giudizioso in base alle esigenze specifiche di processi e utenti. Riduce inoltre al minimo il rischio di riscontrare problemi di memoria insufficiente. Ecco come procedere:

  • Livello utente: se un utente specifico è coinvolto principalmente nelle attività di aggregazione o creazione di report, che richiedono un utilizzo intensivo della memoria, valutare la possibilità di personalizzare il work_mem valore per tale utente. Usare il ALTER ROLE comando per migliorare le prestazioni delle operazioni dell'utente.

  • Livello di funzione/routine: se funzioni o routine specifiche generano file temporanei sostanziali, l'aumento del work_mem valore a livello di funzione o routine specifico può essere vantaggioso. Usare il ALTER FUNCTION comando o ALTER PROCEDURE per allocare in modo specifico più memoria a queste operazioni.

  • Livello di database: modificare work_mem a livello di database se solo database specifici generano un numero elevato di file temporanei.

  • Livello globale: se un'analisi del sistema rivela che la maggior parte delle query genera piccoli file temporanei, mentre solo alcuni creano file di grandi dimensioni, potrebbe essere prudente aumentare il work_mem valore a livello globale. Questa azione facilita la maggior parte delle query da elaborare in memoria, in modo da evitare operazioni basate su disco e migliorare l'efficienza. Tuttavia, prestare sempre attenzione e monitorare l'utilizzo della memoria nel server per assicurarsi che possa gestire il valore aumentato work_mem .

Determinazione del valore minimo work_mem per le operazioni di ordinamento

Per trovare il valore minimo work_mem per una query specifica, in particolare uno che genera file di disco temporanei durante il processo di ordinamento, iniziare considerando le dimensioni temporanee del file generate durante l'esecuzione della query. Ad esempio, se una query genera un file temporaneo di 20 MB:

  1. Connettersi al database usando psql o il client PostgreSQL preferito.
  2. Impostare un valore iniziale di work_mem leggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio : SET work_mem TO '25MB'.
  3. Nella stessa sessione, eseguire EXPLAIN ANALYZE nella query problematica.
  4. Esaminare l'output per "Sort Method: quicksort Memory: xkB". Se indica "external merge Disk: xkB", aumentare incrementally il valore work_mem e ripetere il test fino a quando appare "quicksort Memory". La presenza di "quicksort Memory" indica che la query è ora in esecuzione in memoria.
  5. Dopo aver determinato il valore tramite questo metodo, è possibile applicarlo a livello globale o su livelli più granulari (come descritto in precedenza) in base alle esigenze operative.

autovacuum_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per ogni processo di lavoro autovacuum.
Tipo di dati integer
Valore predefinito -1
Valori consentiti -1-2097151
Tipo di parametro dynamic
Documentation autovacuum_work_mem

tipo_di_memoria_condivisa_dinamica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa dinamica usata.
Tipo di dati enumeration
Valore predefinito posix
Valori consentiti posix
Tipo di parametro Sola lettura
Documentation tipo_memoria_condivisa_dinamica

hash_mem_multiplier

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Multiplo di work_mem da utilizzare per tabelle hash.
Tipo di dati NUMERIC
Valore predefinito 2
Valori consentiti 1-1000
Tipo di parametro dynamic
Documentation hash_mem_multiplier

huge_pages

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Abilita/disabilita l'uso di grandi pagine di memoria. Questa impostazione non è applicabile ai server con meno di 4 vCore.
Tipo di dati enumeration
Valore predefinito try
Valori consentiti on,off,try
Tipo di parametro Statica
Documentation huge_pages

Description

Le pagine enormi sono una funzionalità che consente la gestione della memoria in blocchi più grandi. In genere è possibile gestire blocchi fino a 2 MB, anziché le pagine standard da 4 KB.

L'uso di pagine enormi può offrire vantaggi in termini di prestazioni che consentono di eseguire in modo efficace l'offload della CPU:

  • Riducono il sovraccarico associato alle attività di gestione della memoria, diminuendo ad esempio il numero di mancati riscontri nel TLB.
  • Riducono il tempo necessario per la gestione della memoria.

In particolare, in PostgreSQL è possibile usare grandi pagine solo per l'area di memoria condivisa. Una parte significativa dell'area di memoria condivisa viene allocata per i buffer condivisi.

Un altro vantaggio è che grandi pagine impediscono lo scambio dell'area di memoria condivisa su disco, che stabilizza ulteriormente le prestazioni.

Recommendations

  • Per i server con risorse di memoria significative, evitare di disabilitare grandi pagine. La disabilitazione di grandi pagine potrebbe compromettere le prestazioni.
  • Se si inizia con un server più piccolo che non supporta pagine di grandi dimensioni, ma si prevede di aumentare le prestazioni fino a un server che lo fa, mantenere l'impostazione huge_pages su TRY per una transizione senza interruzioni e prestazioni ottimali.

Note specifiche su Azure

Per i server con quattro o più vCore, le pagine di grandi dimensioni vengono allocate automaticamente dal sistema operativo sottostante. La funzionalità non è disponibile per i server con meno di quattro vCore. Il numero delle pagine grandi viene modificato automaticamente se vengono modificate le impostazioni di memoria condivisa, incluse le modifiche a shared_buffers.

huge_page_size

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Dimensioni di una pagina molto grande che deve essere richiesta.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation huge_page_size

logical_decoding_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per la decodifica logica.
Tipo di dati integer
Valore predefinito 65536
Valori consentiti 64-2147483647
Tipo di parametro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per le operazioni di manutenzione, ad esempio VACUUM, Create Index.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 1024-2097151
Tipo di parametro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem è un parametro di configurazione in PostgreSQL. Controlla la quantità di memoria allocata per le operazioni di manutenzione, ad esempio VACUUM, CREATE INDEXe ALTER TABLE. A differenza di work_mem, che influisce sull'allocazione di memoria per le operazioni di query, maintenance_work_mem è riservata alle attività che mantengono e ottimizzano la struttura del database.

! [NOTA] Impostare maintenance_work_mem su valori eccessivamente aggressivi potrebbe causare periodicamente un errore di memoria insufficiente nel sistema. È estremamente importante comprendere la quantità di memoria disponibile nel server e il numero di operazioni simultanee che potrebbero allocare memoria per le attività descritte in precedenza, prima di apportare modifiche a questo parametro.

Punti chiave

  • Limite di memoria per le operazioni vacuum : se si vuole velocizzare la rimozione delle tuple inattive aumentando il valore di maintenance_work_mem, tenere presente che in VACUUM è presente una limitazione predefinita per la raccolta di identificatori di tuple inattive. Può usare fino a 1 GB di memoria per questo processo.
  • Separazione della memoria per autovacuum: è possibile usare l'impostazione autovacuum_work_mem per controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset di maintenance_work_mem. È possibile decidere la quantità di memoria usata dall'autovacuum senza influire sull'allocazione di memoria per altre attività di manutenzione e operazioni di definizione dei dati.

Note specifiche su Azure

Il valore predefinito per il parametro del server maintenance_work_mem viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto al calcolo che supporta il server flessibile non avranno alcun effetto sul valore predefinito per il parametro server maintenance_work_mem di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il maintenance_work_mem parametro in base ai valori nella formula seguente.

La formula utilizzata per calcolare il valore di maintenance_work_mem è (long)(82.5 * ln(memoryGiB) + 40) * 1024.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di transazioni preparate contemporaneamente. Quando si esegue un server di replica, è necessario impostare questo parametro su un valore identico o superiore rispetto a quello per il server primario.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0-262143
Tipo di parametro Statica
Documentation max_prepared_transactions

max_stack_depth (profondità_massima_dello_stack)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la profondità massima dello stack, in kilobyte.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 2048
Tipo di parametro Sola lettura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Quantità di memoria condivisa dinamica riservata all'avvio.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation min_dynamic_shared_memory

shared_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero di buffer di memoria condivisa usati dal server. L'unità è 8 kB. I valori consentiti sono inclusi nell'intervallo compreso tra il 10% e il 75% della memoria disponibile.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 16-1073741823
Tipo di parametro Statica
Documentation shared_buffers

Description

Il shared_buffers parametro di configurazione determina la quantità di memoria di sistema allocata al database PostgreSQL per il buffering dei dati. Funge da pool di memoria centralizzato accessibile a tutti i processi di database.

Quando sono necessari i dati, il processo del database controlla prima di tutto il buffer condiviso. Se i dati necessari sono presenti, vengono recuperati rapidamente e ignora una lettura disco che richiede più tempo. I buffer condivisi fungono da intermediario tra i processi del database e il disco e riducono in modo efficace il numero di operazioni di I/O necessarie.

Note specifiche su Azure

Il valore predefinito per il parametro del server shared_buffers viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto per il calcolo che supporta il server flessibile non hanno alcun effetto sul valore predefinito del shared_buffers parametro server di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il shared_buffers parametro in base ai valori nelle formule seguenti.

Per le macchine virtuali con un massimo di 2 GiB di memoria, la formula usata per calcolare il valore di shared_buffers è memoryGib * 16384.

Per le macchine virtuali con più di 2 GiB, la formula usata per calcolare il valore di shared_buffers è memoryGib * 32768.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_di_memoria_condivisa

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa usata per l'area di memoria condivisa principale.
Tipo di dati enumeration
Valore predefinito mmap
Valori consentiti mmap
Tipo di parametro Sola lettura
Documentation tipo_di_memoria_condivisa

temp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di buffer temporanei usati da ogni sessione del database.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 100-1073741823
Tipo di parametro dynamic
Documentation temp_buffers

vacuum_buffer_usage_limit

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta le dimensioni del pool di buffer per VACUUM, ANALYZE e autovacuum.
Tipo di dati integer
Valore predefinito 256
Valori consentiti 0-16777216
Tipo di parametro dynamic
Documentation vacuum_buffer_usage_limit

work_mem (memoria di lavoro)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la quantità di memoria che deve essere usata dalle operazioni di ordinamento interne e dalle tabelle hash prima della scrittura in file disco temporanei.
Tipo di dati integer
Valore predefinito 4096
Valori consentiti 4096-2097151
Tipo di parametro dynamic
Documentation work_mem

Description

Il work_mem parametro in PostgreSQL controlla la quantità di memoria allocata per determinate operazioni interne all'interno dell'area di memoria privata di ogni sessione del database. Esempi di queste operazioni sono l'ordinamento e l'hashing.

A differenza dei buffer condivisi, che si trovano nell'area di memoria condivisa, work_mem vengono allocati in uno spazio di memoria privata per sessione o per query. Impostando dimensioni adeguate work_mem , è possibile migliorare significativamente l'efficienza di queste operazioni e ridurre la necessità di scrivere dati temporanei su disco.

Punti chiave

  • Memoria di connessione privata: work_mem fa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa che shared_buffers usa.
  • Utilizzo specifico delle query: non tutte le sessioni o query usano work_mem. È improbabile che le query semplici, ad esempio SELECT 1 , richiedano work_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi di work_mem.
  • Operazioni parallele: per le query che si estendono su più back-end paralleli, ogni back-end potrebbe potenzialmente usare uno o più blocchi di work_mem.

Monitoraggio e regolazione di work_mem

È essenziale monitorare continuamente le prestazioni del sistema e regolare work_mem in base alle esigenze, soprattutto se i tempi di esecuzione delle query correlati all'ordinamento o alle operazioni di hashing sono lenti. Ecco i modi per monitorare le prestazioni usando gli strumenti disponibili nel portale di Azure:

Regolazione granulare

Mentre si gestisce il work_mem parametro, spesso è più efficiente adottare un approccio di regolazione granulare anziché impostare un valore globale. Questo approccio garantisce che allocare la memoria in modo giudizioso in base alle esigenze specifiche di processi e utenti. Riduce inoltre al minimo il rischio di riscontrare problemi di memoria insufficiente. Ecco come procedere:

  • Livello utente: se un utente specifico è coinvolto principalmente nelle attività di aggregazione o creazione di report, che richiedono un utilizzo intensivo della memoria, valutare la possibilità di personalizzare il work_mem valore per tale utente. Usare il ALTER ROLE comando per migliorare le prestazioni delle operazioni dell'utente.

  • Livello di funzione/routine: se funzioni o routine specifiche generano file temporanei sostanziali, l'aumento del work_mem valore a livello di funzione o routine specifico può essere vantaggioso. Usare il ALTER FUNCTION comando o ALTER PROCEDURE per allocare in modo specifico più memoria a queste operazioni.

  • Livello di database: modificare work_mem a livello di database se solo database specifici generano un numero elevato di file temporanei.

  • Livello globale: se un'analisi del sistema rivela che la maggior parte delle query genera piccoli file temporanei, mentre solo alcuni creano file di grandi dimensioni, potrebbe essere prudente aumentare il work_mem valore a livello globale. Questa azione facilita la maggior parte delle query da elaborare in memoria, in modo da evitare operazioni basate su disco e migliorare l'efficienza. Tuttavia, prestare sempre attenzione e monitorare l'utilizzo della memoria nel server per assicurarsi che possa gestire il valore aumentato work_mem .

Determinazione del valore minimo work_mem per le operazioni di ordinamento

Per trovare il valore minimo work_mem per una query specifica, in particolare uno che genera file di disco temporanei durante il processo di ordinamento, iniziare considerando le dimensioni temporanee del file generate durante l'esecuzione della query. Ad esempio, se una query genera un file temporaneo di 20 MB:

  1. Connettersi al database usando psql o il client PostgreSQL preferito.
  2. Impostare un valore iniziale di work_mem leggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio : SET work_mem TO '25MB'.
  3. Nella stessa sessione, eseguire EXPLAIN ANALYZE nella query problematica.
  4. Esaminare l'output per "Sort Method: quicksort Memory: xkB". Se indica "external merge Disk: xkB", aumentare incrementally il valore work_mem e ripetere il test fino a quando appare "quicksort Memory". La presenza di "quicksort Memory" indica che la query è ora in esecuzione in memoria.
  5. Dopo aver determinato il valore tramite questo metodo, è possibile applicarlo a livello globale o su livelli più granulari (come descritto in precedenza) in base alle esigenze operative.

autovacuum_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per ogni processo di lavoro autovacuum.
Tipo di dati integer
Valore predefinito -1
Valori consentiti -1-2097151
Tipo di parametro dynamic
Documentation autovacuum_work_mem

tipo_di_memoria_condivisa_dinamica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa dinamica usata.
Tipo di dati enumeration
Valore predefinito posix
Valori consentiti posix
Tipo di parametro Sola lettura
Documentation tipo_memoria_condivisa_dinamica

hash_mem_multiplier

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Multiplo di work_mem da utilizzare per tabelle hash.
Tipo di dati NUMERIC
Valore predefinito 2
Valori consentiti 1-1000
Tipo di parametro dynamic
Documentation hash_mem_multiplier

huge_pages

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Abilita/disabilita l'uso di grandi pagine di memoria. Questa impostazione non è applicabile ai server con meno di 4 vCore.
Tipo di dati enumeration
Valore predefinito try
Valori consentiti on,off,try
Tipo di parametro Statica
Documentation huge_pages

Description

Le pagine enormi sono una funzionalità che consente la gestione della memoria in blocchi più grandi. In genere è possibile gestire blocchi fino a 2 MB, anziché le pagine standard da 4 KB.

L'uso di pagine enormi può offrire vantaggi in termini di prestazioni che consentono di eseguire in modo efficace l'offload della CPU:

  • Riducono il sovraccarico associato alle attività di gestione della memoria, diminuendo ad esempio il numero di mancati riscontri nel TLB.
  • Riducono il tempo necessario per la gestione della memoria.

In particolare, in PostgreSQL è possibile usare grandi pagine solo per l'area di memoria condivisa. Una parte significativa dell'area di memoria condivisa viene allocata per i buffer condivisi.

Un altro vantaggio è che grandi pagine impediscono lo scambio dell'area di memoria condivisa su disco, che stabilizza ulteriormente le prestazioni.

Recommendations

  • Per i server con risorse di memoria significative, evitare di disabilitare grandi pagine. La disabilitazione di grandi pagine potrebbe compromettere le prestazioni.
  • Se si inizia con un server più piccolo che non supporta pagine di grandi dimensioni, ma si prevede di aumentare le prestazioni fino a un server che lo fa, mantenere l'impostazione huge_pages su TRY per una transizione senza interruzioni e prestazioni ottimali.

Note specifiche su Azure

Per i server con quattro o più vCore, le pagine di grandi dimensioni vengono allocate automaticamente dal sistema operativo sottostante. La funzionalità non è disponibile per i server con meno di quattro vCore. Il numero delle pagine grandi viene modificato automaticamente se vengono modificate le impostazioni di memoria condivisa, incluse le modifiche a shared_buffers.

huge_page_size

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Dimensioni di una pagina molto grande che deve essere richiesta.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation huge_page_size

logical_decoding_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per la decodifica logica.
Tipo di dati integer
Valore predefinito 65536
Valori consentiti 64-2147483647
Tipo di parametro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per le operazioni di manutenzione, ad esempio VACUUM, Create Index.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 1024-2097151
Tipo di parametro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem è un parametro di configurazione in PostgreSQL. Controlla la quantità di memoria allocata per le operazioni di manutenzione, ad esempio VACUUM, CREATE INDEXe ALTER TABLE. A differenza di work_mem, che influisce sull'allocazione di memoria per le operazioni di query, maintenance_work_mem è riservata alle attività che mantengono e ottimizzano la struttura del database.

! [NOTA] Impostare maintenance_work_mem su valori eccessivamente aggressivi potrebbe causare periodicamente un errore di memoria insufficiente nel sistema. È estremamente importante comprendere la quantità di memoria disponibile nel server e il numero di operazioni simultanee che potrebbero allocare memoria per le attività descritte in precedenza, prima di apportare modifiche a questo parametro.

Punti chiave

  • Limite di memoria per le operazioni vacuum : se si vuole velocizzare la rimozione delle tuple inattive aumentando il valore di maintenance_work_mem, tenere presente che in VACUUM è presente una limitazione predefinita per la raccolta di identificatori di tuple inattive. Può usare fino a 1 GB di memoria per questo processo.
  • Separazione della memoria per autovacuum: è possibile usare l'impostazione autovacuum_work_mem per controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset di maintenance_work_mem. È possibile decidere la quantità di memoria usata dall'autovacuum senza influire sull'allocazione di memoria per altre attività di manutenzione e operazioni di definizione dei dati.

Note specifiche su Azure

Il valore predefinito per il parametro del server maintenance_work_mem viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto al calcolo che supporta il server flessibile non avranno alcun effetto sul valore predefinito per il parametro server maintenance_work_mem di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il maintenance_work_mem parametro in base ai valori nella formula seguente.

La formula utilizzata per calcolare il valore di maintenance_work_mem è (long)(82.5 * ln(memoryGiB) + 40) * 1024.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di transazioni preparate contemporaneamente. Quando si esegue un server di replica, è necessario impostare questo parametro su un valore identico o superiore rispetto a quello per il server primario.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0-262143
Tipo di parametro Statica
Documentation max_prepared_transactions

max_stack_depth (profondità_massima_dello_stack)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la profondità massima dello stack, in kilobyte.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 2048
Tipo di parametro Sola lettura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Quantità di memoria condivisa dinamica riservata all'avvio.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation min_dynamic_shared_memory

shared_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero di buffer di memoria condivisa usati dal server. L'unità è 8 kB. I valori consentiti sono inclusi nell'intervallo compreso tra il 10% e il 75% della memoria disponibile.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 16-1073741823
Tipo di parametro Statica
Documentation shared_buffers

Description

Il shared_buffers parametro di configurazione determina la quantità di memoria di sistema allocata al database PostgreSQL per il buffering dei dati. Funge da pool di memoria centralizzato accessibile a tutti i processi di database.

Quando sono necessari i dati, il processo del database controlla prima di tutto il buffer condiviso. Se i dati necessari sono presenti, vengono recuperati rapidamente e ignora una lettura disco che richiede più tempo. I buffer condivisi fungono da intermediario tra i processi del database e il disco e riducono in modo efficace il numero di operazioni di I/O necessarie.

Note specifiche su Azure

Il valore predefinito per il parametro del server shared_buffers viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto per il calcolo che supporta il server flessibile non hanno alcun effetto sul valore predefinito del shared_buffers parametro server di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il shared_buffers parametro in base ai valori nelle formule seguenti.

Per le macchine virtuali con un massimo di 2 GiB di memoria, la formula usata per calcolare il valore di shared_buffers è memoryGib * 16384.

Per le macchine virtuali con più di 2 GiB, la formula usata per calcolare il valore di shared_buffers è memoryGib * 32768.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_di_memoria_condivisa

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa usata per l'area di memoria condivisa principale.
Tipo di dati enumeration
Valore predefinito mmap
Valori consentiti mmap
Tipo di parametro Sola lettura
Documentation tipo_di_memoria_condivisa

temp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di buffer temporanei usati da ogni sessione del database.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 100-1073741823
Tipo di parametro dynamic
Documentation temp_buffers

work_mem (memoria di lavoro)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la quantità di memoria che deve essere usata dalle operazioni di ordinamento interne e dalle tabelle hash prima della scrittura in file disco temporanei.
Tipo di dati integer
Valore predefinito 4096
Valori consentiti 4096-2097151
Tipo di parametro dynamic
Documentation work_mem

Description

Il work_mem parametro in PostgreSQL controlla la quantità di memoria allocata per determinate operazioni interne all'interno dell'area di memoria privata di ogni sessione del database. Esempi di queste operazioni sono l'ordinamento e l'hashing.

A differenza dei buffer condivisi, che si trovano nell'area di memoria condivisa, work_mem vengono allocati in uno spazio di memoria privata per sessione o per query. Impostando dimensioni adeguate work_mem , è possibile migliorare significativamente l'efficienza di queste operazioni e ridurre la necessità di scrivere dati temporanei su disco.

Punti chiave

  • Memoria di connessione privata: work_mem fa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa che shared_buffers usa.
  • Utilizzo specifico delle query: non tutte le sessioni o query usano work_mem. È improbabile che le query semplici, ad esempio SELECT 1 , richiedano work_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi di work_mem.
  • Operazioni parallele: per le query che si estendono su più back-end paralleli, ogni back-end potrebbe potenzialmente usare uno o più blocchi di work_mem.

Monitoraggio e regolazione di work_mem

È essenziale monitorare continuamente le prestazioni del sistema e regolare work_mem in base alle esigenze, soprattutto se i tempi di esecuzione delle query correlati all'ordinamento o alle operazioni di hashing sono lenti. Ecco i modi per monitorare le prestazioni usando gli strumenti disponibili nel portale di Azure:

Regolazione granulare

Mentre si gestisce il work_mem parametro, spesso è più efficiente adottare un approccio di regolazione granulare anziché impostare un valore globale. Questo approccio garantisce che allocare la memoria in modo giudizioso in base alle esigenze specifiche di processi e utenti. Riduce inoltre al minimo il rischio di riscontrare problemi di memoria insufficiente. Ecco come procedere:

  • Livello utente: se un utente specifico è coinvolto principalmente nelle attività di aggregazione o creazione di report, che richiedono un utilizzo intensivo della memoria, valutare la possibilità di personalizzare il work_mem valore per tale utente. Usare il ALTER ROLE comando per migliorare le prestazioni delle operazioni dell'utente.

  • Livello di funzione/routine: se funzioni o routine specifiche generano file temporanei sostanziali, l'aumento del work_mem valore a livello di funzione o routine specifico può essere vantaggioso. Usare il ALTER FUNCTION comando o ALTER PROCEDURE per allocare in modo specifico più memoria a queste operazioni.

  • Livello di database: modificare work_mem a livello di database se solo database specifici generano un numero elevato di file temporanei.

  • Livello globale: se un'analisi del sistema rivela che la maggior parte delle query genera piccoli file temporanei, mentre solo alcuni creano file di grandi dimensioni, potrebbe essere prudente aumentare il work_mem valore a livello globale. Questa azione facilita la maggior parte delle query da elaborare in memoria, in modo da evitare operazioni basate su disco e migliorare l'efficienza. Tuttavia, prestare sempre attenzione e monitorare l'utilizzo della memoria nel server per assicurarsi che possa gestire il valore aumentato work_mem .

Determinazione del valore minimo work_mem per le operazioni di ordinamento

Per trovare il valore minimo work_mem per una query specifica, in particolare uno che genera file di disco temporanei durante il processo di ordinamento, iniziare considerando le dimensioni temporanee del file generate durante l'esecuzione della query. Ad esempio, se una query genera un file temporaneo di 20 MB:

  1. Connettersi al database usando psql o il client PostgreSQL preferito.
  2. Impostare un valore iniziale di work_mem leggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio : SET work_mem TO '25MB'.
  3. Nella stessa sessione, eseguire EXPLAIN ANALYZE nella query problematica.
  4. Esaminare l'output per "Sort Method: quicksort Memory: xkB". Se indica "external merge Disk: xkB", aumentare incrementally il valore work_mem e ripetere il test fino a quando appare "quicksort Memory". La presenza di "quicksort Memory" indica che la query è ora in esecuzione in memoria.
  5. Dopo aver determinato il valore tramite questo metodo, è possibile applicarlo a livello globale o su livelli più granulari (come descritto in precedenza) in base alle esigenze operative.

autovacuum_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per ogni processo di lavoro autovacuum.
Tipo di dati integer
Valore predefinito -1
Valori consentiti -1-2097151
Tipo di parametro dynamic
Documentation autovacuum_work_mem

tipo_di_memoria_condivisa_dinamica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa dinamica usata.
Tipo di dati enumeration
Valore predefinito posix
Valori consentiti posix
Tipo di parametro Sola lettura
Documentation tipo_memoria_condivisa_dinamica

hash_mem_multiplier

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Multiplo di work_mem da utilizzare per tabelle hash.
Tipo di dati NUMERIC
Valore predefinito 1
Valori consentiti 1-1000
Tipo di parametro dynamic
Documentation hash_mem_multiplier

huge_pages

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Abilita/disabilita l'uso di grandi pagine di memoria. Questa impostazione non è applicabile ai server con meno di 4 vCore.
Tipo di dati enumeration
Valore predefinito try
Valori consentiti on,off,try
Tipo di parametro Statica
Documentation huge_pages

Description

Le pagine enormi sono una funzionalità che consente la gestione della memoria in blocchi più grandi. In genere è possibile gestire blocchi fino a 2 MB, anziché le pagine standard da 4 KB.

L'uso di pagine enormi può offrire vantaggi in termini di prestazioni che consentono di eseguire in modo efficace l'offload della CPU:

  • Riducono il sovraccarico associato alle attività di gestione della memoria, diminuendo ad esempio il numero di mancati riscontri nel TLB.
  • Riducono il tempo necessario per la gestione della memoria.

In particolare, in PostgreSQL è possibile usare grandi pagine solo per l'area di memoria condivisa. Una parte significativa dell'area di memoria condivisa viene allocata per i buffer condivisi.

Un altro vantaggio è che grandi pagine impediscono lo scambio dell'area di memoria condivisa su disco, che stabilizza ulteriormente le prestazioni.

Recommendations

  • Per i server con risorse di memoria significative, evitare di disabilitare grandi pagine. La disabilitazione di grandi pagine potrebbe compromettere le prestazioni.
  • Se si inizia con un server più piccolo che non supporta pagine di grandi dimensioni, ma si prevede di aumentare le prestazioni fino a un server che lo fa, mantenere l'impostazione huge_pages su TRY per una transizione senza interruzioni e prestazioni ottimali.

Note specifiche su Azure

Per i server con quattro o più vCore, le pagine di grandi dimensioni vengono allocate automaticamente dal sistema operativo sottostante. La funzionalità non è disponibile per i server con meno di quattro vCore. Il numero delle pagine grandi viene modificato automaticamente se vengono modificate le impostazioni di memoria condivisa, incluse le modifiche a shared_buffers.

huge_page_size

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Dimensioni di una pagina molto grande che deve essere richiesta.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation huge_page_size

logical_decoding_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per la decodifica logica.
Tipo di dati integer
Valore predefinito 65536
Valori consentiti 64-2147483647
Tipo di parametro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per le operazioni di manutenzione, ad esempio VACUUM, Create Index.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 1024-2097151
Tipo di parametro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem è un parametro di configurazione in PostgreSQL. Controlla la quantità di memoria allocata per le operazioni di manutenzione, ad esempio VACUUM, CREATE INDEXe ALTER TABLE. A differenza di work_mem, che influisce sull'allocazione di memoria per le operazioni di query, maintenance_work_mem è riservata alle attività che mantengono e ottimizzano la struttura del database.

! [NOTA] Impostare maintenance_work_mem su valori eccessivamente aggressivi potrebbe causare periodicamente un errore di memoria insufficiente nel sistema. È estremamente importante comprendere la quantità di memoria disponibile nel server e il numero di operazioni simultanee che potrebbero allocare memoria per le attività descritte in precedenza, prima di apportare modifiche a questo parametro.

Punti chiave

  • Limite di memoria per le operazioni vacuum : se si vuole velocizzare la rimozione delle tuple inattive aumentando il valore di maintenance_work_mem, tenere presente che in VACUUM è presente una limitazione predefinita per la raccolta di identificatori di tuple inattive. Può usare fino a 1 GB di memoria per questo processo.
  • Separazione della memoria per autovacuum: è possibile usare l'impostazione autovacuum_work_mem per controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset di maintenance_work_mem. È possibile decidere la quantità di memoria usata dall'autovacuum senza influire sull'allocazione di memoria per altre attività di manutenzione e operazioni di definizione dei dati.

Note specifiche su Azure

Il valore predefinito per il parametro del server maintenance_work_mem viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto al calcolo che supporta il server flessibile non avranno alcun effetto sul valore predefinito per il parametro server maintenance_work_mem di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il maintenance_work_mem parametro in base ai valori nella formula seguente.

La formula utilizzata per calcolare il valore di maintenance_work_mem è (long)(82.5 * ln(memoryGiB) + 40) * 1024.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di transazioni preparate contemporaneamente. Quando si esegue un server di replica, è necessario impostare questo parametro su un valore identico o superiore rispetto a quello per il server primario.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0-262143
Tipo di parametro Statica
Documentation max_prepared_transactions

max_stack_depth (profondità_massima_dello_stack)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la profondità massima dello stack, in kilobyte.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 2048
Tipo di parametro Sola lettura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Quantità di memoria condivisa dinamica riservata all'avvio.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0
Tipo di parametro Sola lettura
Documentation min_dynamic_shared_memory

shared_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero di buffer di memoria condivisa usati dal server. L'unità è 8 kB. I valori consentiti sono inclusi nell'intervallo compreso tra il 10% e il 75% della memoria disponibile.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 16-1073741823
Tipo di parametro Statica
Documentation shared_buffers

Description

Il shared_buffers parametro di configurazione determina la quantità di memoria di sistema allocata al database PostgreSQL per il buffering dei dati. Funge da pool di memoria centralizzato accessibile a tutti i processi di database.

Quando sono necessari i dati, il processo del database controlla prima di tutto il buffer condiviso. Se i dati necessari sono presenti, vengono recuperati rapidamente e ignora una lettura disco che richiede più tempo. I buffer condivisi fungono da intermediario tra i processi del database e il disco e riducono in modo efficace il numero di operazioni di I/O necessarie.

Note specifiche su Azure

Il valore predefinito per il parametro del server shared_buffers viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto per il calcolo che supporta il server flessibile non hanno alcun effetto sul valore predefinito del shared_buffers parametro server di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il shared_buffers parametro in base ai valori nelle formule seguenti.

Per le macchine virtuali con un massimo di 2 GiB di memoria, la formula usata per calcolare il valore di shared_buffers è memoryGib * 16384.

Per le macchine virtuali con più di 2 GiB, la formula usata per calcolare il valore di shared_buffers è memoryGib * 32768.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_di_memoria_condivisa

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa usata per l'area di memoria condivisa principale.
Tipo di dati enumeration
Valore predefinito mmap
Valori consentiti mmap
Tipo di parametro Sola lettura
Documentation tipo_di_memoria_condivisa

temp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di buffer temporanei usati da ogni sessione del database.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 100-1073741823
Tipo di parametro dynamic
Documentation temp_buffers

work_mem (memoria di lavoro)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la quantità di memoria che deve essere usata dalle operazioni di ordinamento interne e dalle tabelle hash prima della scrittura in file disco temporanei.
Tipo di dati integer
Valore predefinito 4096
Valori consentiti 4096-2097151
Tipo di parametro dynamic
Documentation work_mem

Description

Il work_mem parametro in PostgreSQL controlla la quantità di memoria allocata per determinate operazioni interne all'interno dell'area di memoria privata di ogni sessione del database. Esempi di queste operazioni sono l'ordinamento e l'hashing.

A differenza dei buffer condivisi, che si trovano nell'area di memoria condivisa, work_mem vengono allocati in uno spazio di memoria privata per sessione o per query. Impostando dimensioni adeguate work_mem , è possibile migliorare significativamente l'efficienza di queste operazioni e ridurre la necessità di scrivere dati temporanei su disco.

Punti chiave

  • Memoria di connessione privata: work_mem fa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa che shared_buffers usa.
  • Utilizzo specifico delle query: non tutte le sessioni o query usano work_mem. È improbabile che le query semplici, ad esempio SELECT 1 , richiedano work_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi di work_mem.
  • Operazioni parallele: per le query che si estendono su più back-end paralleli, ogni back-end potrebbe potenzialmente usare uno o più blocchi di work_mem.

Monitoraggio e regolazione di work_mem

È essenziale monitorare continuamente le prestazioni del sistema e regolare work_mem in base alle esigenze, soprattutto se i tempi di esecuzione delle query correlati all'ordinamento o alle operazioni di hashing sono lenti. Ecco i modi per monitorare le prestazioni usando gli strumenti disponibili nel portale di Azure:

Regolazione granulare

Mentre si gestisce il work_mem parametro, spesso è più efficiente adottare un approccio di regolazione granulare anziché impostare un valore globale. Questo approccio garantisce che allocare la memoria in modo giudizioso in base alle esigenze specifiche di processi e utenti. Riduce inoltre al minimo il rischio di riscontrare problemi di memoria insufficiente. Ecco come procedere:

  • Livello utente: se un utente specifico è coinvolto principalmente nelle attività di aggregazione o creazione di report, che richiedono un utilizzo intensivo della memoria, valutare la possibilità di personalizzare il work_mem valore per tale utente. Usare il ALTER ROLE comando per migliorare le prestazioni delle operazioni dell'utente.

  • Livello di funzione/routine: se funzioni o routine specifiche generano file temporanei sostanziali, l'aumento del work_mem valore a livello di funzione o routine specifico può essere vantaggioso. Usare il ALTER FUNCTION comando o ALTER PROCEDURE per allocare in modo specifico più memoria a queste operazioni.

  • Livello di database: modificare work_mem a livello di database se solo database specifici generano un numero elevato di file temporanei.

  • Livello globale: se un'analisi del sistema rivela che la maggior parte delle query genera piccoli file temporanei, mentre solo alcuni creano file di grandi dimensioni, potrebbe essere prudente aumentare il work_mem valore a livello globale. Questa azione facilita la maggior parte delle query da elaborare in memoria, in modo da evitare operazioni basate su disco e migliorare l'efficienza. Tuttavia, prestare sempre attenzione e monitorare l'utilizzo della memoria nel server per assicurarsi che possa gestire il valore aumentato work_mem .

Determinazione del valore minimo work_mem per le operazioni di ordinamento

Per trovare il valore minimo work_mem per una query specifica, in particolare uno che genera file di disco temporanei durante il processo di ordinamento, iniziare considerando le dimensioni temporanee del file generate durante l'esecuzione della query. Ad esempio, se una query genera un file temporaneo di 20 MB:

  1. Connettersi al database usando psql o il client PostgreSQL preferito.
  2. Impostare un valore iniziale di work_mem leggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio : SET work_mem TO '25MB'.
  3. Nella stessa sessione, eseguire EXPLAIN ANALYZE nella query problematica.
  4. Esaminare l'output per "Sort Method: quicksort Memory: xkB". Se indica "external merge Disk: xkB", aumentare incrementally il valore work_mem e ripetere il test fino a quando appare "quicksort Memory". La presenza di "quicksort Memory" indica che la query è ora in esecuzione in memoria.
  5. Dopo aver determinato il valore tramite questo metodo, è possibile applicarlo a livello globale o su livelli più granulari (come descritto in precedenza) in base alle esigenze operative.

autovacuum_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per ogni processo di lavoro autovacuum.
Tipo di dati integer
Valore predefinito -1
Valori consentiti -1-2097151
Tipo di parametro dynamic
Documentation autovacuum_work_mem

tipo_di_memoria_condivisa_dinamica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa dinamica usata.
Tipo di dati enumeration
Valore predefinito posix
Valori consentiti posix
Tipo di parametro Sola lettura
Documentation tipo_memoria_condivisa_dinamica

hash_mem_multiplier

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Multiplo di work_mem da utilizzare per tabelle hash.
Tipo di dati NUMERIC
Valore predefinito 1
Valori consentiti 1-1000
Tipo di parametro dynamic
Documentation hash_mem_multiplier

huge_pages

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Abilita/disabilita l'uso di grandi pagine di memoria. Questa impostazione non è applicabile ai server con meno di 4 vCore.
Tipo di dati enumeration
Valore predefinito try
Valori consentiti on,off,try
Tipo di parametro Statica
Documentation huge_pages

Description

Le pagine enormi sono una funzionalità che consente la gestione della memoria in blocchi più grandi. In genere è possibile gestire blocchi fino a 2 MB, anziché le pagine standard da 4 KB.

L'uso di pagine enormi può offrire vantaggi in termini di prestazioni che consentono di eseguire in modo efficace l'offload della CPU:

  • Riducono il sovraccarico associato alle attività di gestione della memoria, diminuendo ad esempio il numero di mancati riscontri nel TLB.
  • Riducono il tempo necessario per la gestione della memoria.

In particolare, in PostgreSQL è possibile usare grandi pagine solo per l'area di memoria condivisa. Una parte significativa dell'area di memoria condivisa viene allocata per i buffer condivisi.

Un altro vantaggio è che grandi pagine impediscono lo scambio dell'area di memoria condivisa su disco, che stabilizza ulteriormente le prestazioni.

Recommendations

  • Per i server con risorse di memoria significative, evitare di disabilitare grandi pagine. La disabilitazione di grandi pagine potrebbe compromettere le prestazioni.
  • Se si inizia con un server più piccolo che non supporta pagine di grandi dimensioni, ma si prevede di aumentare le prestazioni fino a un server che lo fa, mantenere l'impostazione huge_pages su TRY per una transizione senza interruzioni e prestazioni ottimali.

Note specifiche su Azure

Per i server con quattro o più vCore, le pagine di grandi dimensioni vengono allocate automaticamente dal sistema operativo sottostante. La funzionalità non è disponibile per i server con meno di quattro vCore. Il numero delle pagine grandi viene modificato automaticamente se vengono modificate le impostazioni di memoria condivisa, incluse le modifiche a shared_buffers.

logical_decoding_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per la decodifica logica.
Tipo di dati integer
Valore predefinito 65536
Valori consentiti 64-2147483647
Tipo di parametro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per le operazioni di manutenzione, ad esempio VACUUM, Create Index.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 1024-2097151
Tipo di parametro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem è un parametro di configurazione in PostgreSQL. Controlla la quantità di memoria allocata per le operazioni di manutenzione, ad esempio VACUUM, CREATE INDEXe ALTER TABLE. A differenza di work_mem, che influisce sull'allocazione di memoria per le operazioni di query, maintenance_work_mem è riservata alle attività che mantengono e ottimizzano la struttura del database.

! [NOTA] Impostare maintenance_work_mem su valori eccessivamente aggressivi potrebbe causare periodicamente un errore di memoria insufficiente nel sistema. È estremamente importante comprendere la quantità di memoria disponibile nel server e il numero di operazioni simultanee che potrebbero allocare memoria per le attività descritte in precedenza, prima di apportare modifiche a questo parametro.

Punti chiave

  • Limite di memoria per le operazioni vacuum : se si vuole velocizzare la rimozione delle tuple inattive aumentando il valore di maintenance_work_mem, tenere presente che in VACUUM è presente una limitazione predefinita per la raccolta di identificatori di tuple inattive. Può usare fino a 1 GB di memoria per questo processo.
  • Separazione della memoria per autovacuum: è possibile usare l'impostazione autovacuum_work_mem per controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset di maintenance_work_mem. È possibile decidere la quantità di memoria usata dall'autovacuum senza influire sull'allocazione di memoria per altre attività di manutenzione e operazioni di definizione dei dati.

Note specifiche su Azure

Il valore predefinito per il parametro del server maintenance_work_mem viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto al calcolo che supporta il server flessibile non avranno alcun effetto sul valore predefinito per il parametro server maintenance_work_mem di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il maintenance_work_mem parametro in base ai valori nella formula seguente.

La formula utilizzata per calcolare il valore di maintenance_work_mem è (long)(82.5 * ln(memoryGiB) + 40) * 1024.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di transazioni preparate contemporaneamente. Quando si esegue un server di replica, è necessario impostare questo parametro su un valore identico o superiore rispetto a quello per il server primario.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0-262143
Tipo di parametro Statica
Documentation max_prepared_transactions

max_stack_depth (profondità_massima_dello_stack)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la profondità massima dello stack, in kilobyte.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 2048
Tipo di parametro Sola lettura
Documentation max_stack_depth

shared_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero di buffer di memoria condivisa usati dal server. L'unità è 8 kB. I valori consentiti sono inclusi nell'intervallo compreso tra il 10% e il 75% della memoria disponibile.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 16-1073741823
Tipo di parametro Statica
Documentation shared_buffers

Description

Il shared_buffers parametro di configurazione determina la quantità di memoria di sistema allocata al database PostgreSQL per il buffering dei dati. Funge da pool di memoria centralizzato accessibile a tutti i processi di database.

Quando sono necessari i dati, il processo del database controlla prima di tutto il buffer condiviso. Se i dati necessari sono presenti, vengono recuperati rapidamente e ignora una lettura disco che richiede più tempo. I buffer condivisi fungono da intermediario tra i processi del database e il disco e riducono in modo efficace il numero di operazioni di I/O necessarie.

Note specifiche su Azure

Il valore predefinito per il parametro del server shared_buffers viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto per il calcolo che supporta il server flessibile non hanno alcun effetto sul valore predefinito del shared_buffers parametro server di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il shared_buffers parametro in base ai valori nelle formule seguenti.

Per le macchine virtuali con un massimo di 2 GiB di memoria, la formula usata per calcolare il valore di shared_buffers è memoryGib * 16384.

Per le macchine virtuali con più di 2 GiB, la formula usata per calcolare il valore di shared_buffers è memoryGib * 32768.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_di_memoria_condivisa

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa usata per l'area di memoria condivisa principale.
Tipo di dati enumeration
Valore predefinito mmap
Valori consentiti mmap
Tipo di parametro Sola lettura
Documentation tipo_di_memoria_condivisa

temp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di buffer temporanei usati da ogni sessione del database.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 100-1073741823
Tipo di parametro dynamic
Documentation temp_buffers

work_mem (memoria di lavoro)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la quantità di memoria che deve essere usata dalle operazioni di ordinamento interne e dalle tabelle hash prima della scrittura in file disco temporanei.
Tipo di dati integer
Valore predefinito 4096
Valori consentiti 4096-2097151
Tipo di parametro dynamic
Documentation work_mem

Description

Il work_mem parametro in PostgreSQL controlla la quantità di memoria allocata per determinate operazioni interne all'interno dell'area di memoria privata di ogni sessione del database. Esempi di queste operazioni sono l'ordinamento e l'hashing.

A differenza dei buffer condivisi, che si trovano nell'area di memoria condivisa, work_mem vengono allocati in uno spazio di memoria privata per sessione o per query. Impostando dimensioni adeguate work_mem , è possibile migliorare significativamente l'efficienza di queste operazioni e ridurre la necessità di scrivere dati temporanei su disco.

Punti chiave

  • Memoria di connessione privata: work_mem fa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa che shared_buffers usa.
  • Utilizzo specifico delle query: non tutte le sessioni o query usano work_mem. È improbabile che le query semplici, ad esempio SELECT 1 , richiedano work_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi di work_mem.
  • Operazioni parallele: per le query che si estendono su più back-end paralleli, ogni back-end potrebbe potenzialmente usare uno o più blocchi di work_mem.

Monitoraggio e regolazione di work_mem

È essenziale monitorare continuamente le prestazioni del sistema e regolare work_mem in base alle esigenze, soprattutto se i tempi di esecuzione delle query correlati all'ordinamento o alle operazioni di hashing sono lenti. Ecco i modi per monitorare le prestazioni usando gli strumenti disponibili nel portale di Azure:

Regolazione granulare

Mentre si gestisce il work_mem parametro, spesso è più efficiente adottare un approccio di regolazione granulare anziché impostare un valore globale. Questo approccio garantisce che allocare la memoria in modo giudizioso in base alle esigenze specifiche di processi e utenti. Riduce inoltre al minimo il rischio di riscontrare problemi di memoria insufficiente. Ecco come procedere:

  • Livello utente: se un utente specifico è coinvolto principalmente nelle attività di aggregazione o creazione di report, che richiedono un utilizzo intensivo della memoria, valutare la possibilità di personalizzare il work_mem valore per tale utente. Usare il ALTER ROLE comando per migliorare le prestazioni delle operazioni dell'utente.

  • Livello di funzione/routine: se funzioni o routine specifiche generano file temporanei sostanziali, l'aumento del work_mem valore a livello di funzione o routine specifico può essere vantaggioso. Usare il ALTER FUNCTION comando o ALTER PROCEDURE per allocare in modo specifico più memoria a queste operazioni.

  • Livello di database: modificare work_mem a livello di database se solo database specifici generano un numero elevato di file temporanei.

  • Livello globale: se un'analisi del sistema rivela che la maggior parte delle query genera piccoli file temporanei, mentre solo alcuni creano file di grandi dimensioni, potrebbe essere prudente aumentare il work_mem valore a livello globale. Questa azione facilita la maggior parte delle query da elaborare in memoria, in modo da evitare operazioni basate su disco e migliorare l'efficienza. Tuttavia, prestare sempre attenzione e monitorare l'utilizzo della memoria nel server per assicurarsi che possa gestire il valore aumentato work_mem .

Determinazione del valore minimo work_mem per le operazioni di ordinamento

Per trovare il valore minimo work_mem per una query specifica, in particolare uno che genera file di disco temporanei durante il processo di ordinamento, iniziare considerando le dimensioni temporanee del file generate durante l'esecuzione della query. Ad esempio, se una query genera un file temporaneo di 20 MB:

  1. Connettersi al database usando psql o il client PostgreSQL preferito.
  2. Impostare un valore iniziale di work_mem leggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio : SET work_mem TO '25MB'.
  3. Nella stessa sessione, eseguire EXPLAIN ANALYZE nella query problematica.
  4. Esaminare l'output per "Sort Method: quicksort Memory: xkB". Se indica "external merge Disk: xkB", aumentare incrementally il valore work_mem e ripetere il test fino a quando appare "quicksort Memory". La presenza di "quicksort Memory" indica che la query è ora in esecuzione in memoria.
  5. Dopo aver determinato il valore tramite questo metodo, è possibile applicarlo a livello globale o su livelli più granulari (come descritto in precedenza) in base alle esigenze operative.

autovacuum_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per ogni processo di lavoro autovacuum.
Tipo di dati integer
Valore predefinito -1
Valori consentiti -1-2097151
Tipo di parametro dynamic
Documentation autovacuum_work_mem

tipo_di_memoria_condivisa_dinamica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa dinamica usata.
Tipo di dati enumeration
Valore predefinito posix
Valori consentiti posix
Tipo di parametro Sola lettura
Documentation tipo_memoria_condivisa_dinamica

hash_mem_multiplier

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Multiplo di work_mem da utilizzare per tabelle hash.
Tipo di dati NUMERIC
Valore predefinito 1
Valori consentiti 1-1000
Tipo di parametro dynamic
Documentation hash_mem_multiplier

huge_pages

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Abilita/disabilita l'uso di grandi pagine di memoria. Questa impostazione non è applicabile ai server con meno di 4 vCore.
Tipo di dati enumeration
Valore predefinito try
Valori consentiti on,off,try
Tipo di parametro Statica
Documentation huge_pages

Description

Le pagine enormi sono una funzionalità che consente la gestione della memoria in blocchi più grandi. In genere è possibile gestire blocchi fino a 2 MB, anziché le pagine standard da 4 KB.

L'uso di pagine enormi può offrire vantaggi in termini di prestazioni che consentono di eseguire in modo efficace l'offload della CPU:

  • Riducono il sovraccarico associato alle attività di gestione della memoria, diminuendo ad esempio il numero di mancati riscontri nel TLB.
  • Riducono il tempo necessario per la gestione della memoria.

In particolare, in PostgreSQL è possibile usare grandi pagine solo per l'area di memoria condivisa. Una parte significativa dell'area di memoria condivisa viene allocata per i buffer condivisi.

Un altro vantaggio è che grandi pagine impediscono lo scambio dell'area di memoria condivisa su disco, che stabilizza ulteriormente le prestazioni.

Recommendations

  • Per i server con risorse di memoria significative, evitare di disabilitare grandi pagine. La disabilitazione di grandi pagine potrebbe compromettere le prestazioni.
  • Se si inizia con un server più piccolo che non supporta pagine di grandi dimensioni, ma si prevede di aumentare le prestazioni fino a un server che lo fa, mantenere l'impostazione huge_pages su TRY per una transizione senza interruzioni e prestazioni ottimali.

Note specifiche su Azure

Per i server con quattro o più vCore, le pagine di grandi dimensioni vengono allocate automaticamente dal sistema operativo sottostante. La funzionalità non è disponibile per i server con meno di quattro vCore. Il numero delle pagine grandi viene modificato automaticamente se vengono modificate le impostazioni di memoria condivisa, incluse le modifiche a shared_buffers.

maintenance_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per le operazioni di manutenzione, ad esempio VACUUM, Create Index.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 1024-2097151
Tipo di parametro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem è un parametro di configurazione in PostgreSQL. Controlla la quantità di memoria allocata per le operazioni di manutenzione, ad esempio VACUUM, CREATE INDEXe ALTER TABLE. A differenza di work_mem, che influisce sull'allocazione di memoria per le operazioni di query, maintenance_work_mem è riservata alle attività che mantengono e ottimizzano la struttura del database.

! [NOTA] Impostare maintenance_work_mem su valori eccessivamente aggressivi potrebbe causare periodicamente un errore di memoria insufficiente nel sistema. È estremamente importante comprendere la quantità di memoria disponibile nel server e il numero di operazioni simultanee che potrebbero allocare memoria per le attività descritte in precedenza, prima di apportare modifiche a questo parametro.

Punti chiave

  • Limite di memoria per le operazioni vacuum : se si vuole velocizzare la rimozione delle tuple inattive aumentando il valore di maintenance_work_mem, tenere presente che in VACUUM è presente una limitazione predefinita per la raccolta di identificatori di tuple inattive. Può usare fino a 1 GB di memoria per questo processo.
  • Separazione della memoria per autovacuum: è possibile usare l'impostazione autovacuum_work_mem per controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset di maintenance_work_mem. È possibile decidere la quantità di memoria usata dall'autovacuum senza influire sull'allocazione di memoria per altre attività di manutenzione e operazioni di definizione dei dati.

Note specifiche su Azure

Il valore predefinito per il parametro del server maintenance_work_mem viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto al calcolo che supporta il server flessibile non avranno alcun effetto sul valore predefinito per il parametro server maintenance_work_mem di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il maintenance_work_mem parametro in base ai valori nella formula seguente.

La formula utilizzata per calcolare il valore di maintenance_work_mem è (long)(82.5 * ln(memoryGiB) + 40) * 1024.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di transazioni preparate contemporaneamente. Quando si esegue un server di replica, è necessario impostare questo parametro su un valore identico o superiore rispetto a quello per il server primario.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0-262143
Tipo di parametro Statica
Documentation max_prepared_transactions

max_stack_depth (profondità_massima_dello_stack)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la profondità massima dello stack, in kilobyte.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 2048
Tipo di parametro Sola lettura
Documentation max_stack_depth

shared_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero di buffer di memoria condivisa usati dal server. L'unità è 8 kB. I valori consentiti sono inclusi nell'intervallo compreso tra il 10% e il 75% della memoria disponibile.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 16-1073741823
Tipo di parametro Statica
Documentation shared_buffers

Description

Il shared_buffers parametro di configurazione determina la quantità di memoria di sistema allocata al database PostgreSQL per il buffering dei dati. Funge da pool di memoria centralizzato accessibile a tutti i processi di database.

Quando sono necessari i dati, il processo del database controlla prima di tutto il buffer condiviso. Se i dati necessari sono presenti, vengono recuperati rapidamente e ignora una lettura disco che richiede più tempo. I buffer condivisi fungono da intermediario tra i processi del database e il disco e riducono in modo efficace il numero di operazioni di I/O necessarie.

Note specifiche su Azure

Il valore predefinito per il parametro del server shared_buffers viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto per il calcolo che supporta il server flessibile non hanno alcun effetto sul valore predefinito del shared_buffers parametro server di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il shared_buffers parametro in base ai valori nelle formule seguenti.

Per le macchine virtuali con un massimo di 2 GiB di memoria, la formula usata per calcolare il valore di shared_buffers è memoryGib * 16384.

Per le macchine virtuali con più di 2 GiB, la formula usata per calcolare il valore di shared_buffers è memoryGib * 32768.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_di_memoria_condivisa

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa usata per l'area di memoria condivisa principale.
Tipo di dati enumeration
Valore predefinito mmap
Valori consentiti mmap
Tipo di parametro Sola lettura
Documentation tipo_di_memoria_condivisa

temp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di buffer temporanei usati da ogni sessione del database.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 100-1073741823
Tipo di parametro dynamic
Documentation temp_buffers

work_mem (memoria di lavoro)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la quantità di memoria che deve essere usata dalle operazioni di ordinamento interne e dalle tabelle hash prima della scrittura in file disco temporanei.
Tipo di dati integer
Valore predefinito 4096
Valori consentiti 4096-2097151
Tipo di parametro dynamic
Documentation work_mem

Description

Il work_mem parametro in PostgreSQL controlla la quantità di memoria allocata per determinate operazioni interne all'interno dell'area di memoria privata di ogni sessione del database. Esempi di queste operazioni sono l'ordinamento e l'hashing.

A differenza dei buffer condivisi, che si trovano nell'area di memoria condivisa, work_mem vengono allocati in uno spazio di memoria privata per sessione o per query. Impostando dimensioni adeguate work_mem , è possibile migliorare significativamente l'efficienza di queste operazioni e ridurre la necessità di scrivere dati temporanei su disco.

Punti chiave

  • Memoria di connessione privata: work_mem fa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa che shared_buffers usa.
  • Utilizzo specifico delle query: non tutte le sessioni o query usano work_mem. È improbabile che le query semplici, ad esempio SELECT 1 , richiedano work_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi di work_mem.
  • Operazioni parallele: per le query che si estendono su più back-end paralleli, ogni back-end potrebbe potenzialmente usare uno o più blocchi di work_mem.

Monitoraggio e regolazione di work_mem

È essenziale monitorare continuamente le prestazioni del sistema e regolare work_mem in base alle esigenze, soprattutto se i tempi di esecuzione delle query correlati all'ordinamento o alle operazioni di hashing sono lenti. Ecco i modi per monitorare le prestazioni usando gli strumenti disponibili nel portale di Azure:

Regolazione granulare

Mentre si gestisce il work_mem parametro, spesso è più efficiente adottare un approccio di regolazione granulare anziché impostare un valore globale. Questo approccio garantisce che allocare la memoria in modo giudizioso in base alle esigenze specifiche di processi e utenti. Riduce inoltre al minimo il rischio di riscontrare problemi di memoria insufficiente. Ecco come procedere:

  • Livello utente: se un utente specifico è coinvolto principalmente nelle attività di aggregazione o creazione di report, che richiedono un utilizzo intensivo della memoria, valutare la possibilità di personalizzare il work_mem valore per tale utente. Usare il ALTER ROLE comando per migliorare le prestazioni delle operazioni dell'utente.

  • Livello di funzione/routine: se funzioni o routine specifiche generano file temporanei sostanziali, l'aumento del work_mem valore a livello di funzione o routine specifico può essere vantaggioso. Usare il ALTER FUNCTION comando o ALTER PROCEDURE per allocare in modo specifico più memoria a queste operazioni.

  • Livello di database: modificare work_mem a livello di database se solo database specifici generano un numero elevato di file temporanei.

  • Livello globale: se un'analisi del sistema rivela che la maggior parte delle query genera piccoli file temporanei, mentre solo alcuni creano file di grandi dimensioni, potrebbe essere prudente aumentare il work_mem valore a livello globale. Questa azione facilita la maggior parte delle query da elaborare in memoria, in modo da evitare operazioni basate su disco e migliorare l'efficienza. Tuttavia, prestare sempre attenzione e monitorare l'utilizzo della memoria nel server per assicurarsi che possa gestire il valore aumentato work_mem .

Determinazione del valore minimo work_mem per le operazioni di ordinamento

Per trovare il valore minimo work_mem per una query specifica, in particolare uno che genera file di disco temporanei durante il processo di ordinamento, iniziare considerando le dimensioni temporanee del file generate durante l'esecuzione della query. Ad esempio, se una query genera un file temporaneo di 20 MB:

  1. Connettersi al database usando psql o il client PostgreSQL preferito.
  2. Impostare un valore iniziale di work_mem leggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio : SET work_mem TO '25MB'.
  3. Nella stessa sessione, eseguire EXPLAIN ANALYZE nella query problematica.
  4. Esaminare l'output per "Sort Method: quicksort Memory: xkB". Se indica "external merge Disk: xkB", aumentare incrementally il valore work_mem e ripetere il test fino a quando appare "quicksort Memory". La presenza di "quicksort Memory" indica che la query è ora in esecuzione in memoria.
  5. Dopo aver determinato il valore tramite questo metodo, è possibile applicarlo a livello globale o su livelli più granulari (come descritto in precedenza) in base alle esigenze operative.

autovacuum_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per ogni processo di lavoro autovacuum.
Tipo di dati integer
Valore predefinito -1
Valori consentiti -1-2097151
Tipo di parametro dynamic
Documentation autovacuum_work_mem

tipo_di_memoria_condivisa_dinamica

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Seleziona l'implementazione della memoria condivisa dinamica usata.
Tipo di dati enumeration
Valore predefinito posix
Valori consentiti posix
Tipo di parametro Sola lettura
Documentation tipo_memoria_condivisa_dinamica

huge_pages

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Abilita/disabilita l'uso di grandi pagine di memoria. Questa impostazione non è applicabile ai server con meno di 4 vCore.
Tipo di dati enumeration
Valore predefinito try
Valori consentiti on,off,try
Tipo di parametro Statica
Documentation huge_pages

Description

Le pagine enormi sono una funzionalità che consente la gestione della memoria in blocchi più grandi. In genere è possibile gestire blocchi fino a 2 MB, anziché le pagine standard da 4 KB.

L'uso di pagine enormi può offrire vantaggi in termini di prestazioni che consentono di eseguire in modo efficace l'offload della CPU:

  • Riducono il sovraccarico associato alle attività di gestione della memoria, diminuendo ad esempio il numero di mancati riscontri nel TLB.
  • Riducono il tempo necessario per la gestione della memoria.

In particolare, in PostgreSQL è possibile usare grandi pagine solo per l'area di memoria condivisa. Una parte significativa dell'area di memoria condivisa viene allocata per i buffer condivisi.

Un altro vantaggio è che grandi pagine impediscono lo scambio dell'area di memoria condivisa su disco, che stabilizza ulteriormente le prestazioni.

Recommendations

  • Per i server con risorse di memoria significative, evitare di disabilitare grandi pagine. La disabilitazione di grandi pagine potrebbe compromettere le prestazioni.
  • Se si inizia con un server più piccolo che non supporta pagine di grandi dimensioni, ma si prevede di aumentare le prestazioni fino a un server che lo fa, mantenere l'impostazione huge_pages su TRY per una transizione senza interruzioni e prestazioni ottimali.

Note specifiche su Azure

Per i server con quattro o più vCore, le pagine di grandi dimensioni vengono allocate automaticamente dal sistema operativo sottostante. La funzionalità non è disponibile per i server con meno di quattro vCore. Il numero delle pagine grandi viene modificato automaticamente se vengono modificate le impostazioni di memoria condivisa, incluse le modifiche a shared_buffers.

maintenance_work_mem

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la memoria massima da usare per le operazioni di manutenzione, ad esempio VACUUM, Create Index.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 1024-2097151
Tipo di parametro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem è un parametro di configurazione in PostgreSQL. Controlla la quantità di memoria allocata per le operazioni di manutenzione, ad esempio VACUUM, CREATE INDEXe ALTER TABLE. A differenza di work_mem, che influisce sull'allocazione di memoria per le operazioni di query, maintenance_work_mem è riservata alle attività che mantengono e ottimizzano la struttura del database.

! [NOTA] Impostare maintenance_work_mem su valori eccessivamente aggressivi potrebbe causare periodicamente un errore di memoria insufficiente nel sistema. È estremamente importante comprendere la quantità di memoria disponibile nel server e il numero di operazioni simultanee che potrebbero allocare memoria per le attività descritte in precedenza, prima di apportare modifiche a questo parametro.

Punti chiave

  • Limite di memoria per le operazioni vacuum : se si vuole velocizzare la rimozione delle tuple inattive aumentando il valore di maintenance_work_mem, tenere presente che in VACUUM è presente una limitazione predefinita per la raccolta di identificatori di tuple inattive. Può usare fino a 1 GB di memoria per questo processo.
  • Separazione della memoria per autovacuum: è possibile usare l'impostazione autovacuum_work_mem per controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset di maintenance_work_mem. È possibile decidere la quantità di memoria usata dall'autovacuum senza influire sull'allocazione di memoria per altre attività di manutenzione e operazioni di definizione dei dati.

Note specifiche su Azure

Il valore predefinito per il parametro del server maintenance_work_mem viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto al calcolo che supporta il server flessibile non avranno alcun effetto sul valore predefinito per il parametro server maintenance_work_mem di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il maintenance_work_mem parametro in base ai valori nella formula seguente.

La formula utilizzata per calcolare il valore di maintenance_work_mem è (long)(82.5 * ln(memoryGiB) + 40) * 1024.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di transazioni preparate contemporaneamente. Quando si esegue un server di replica, è necessario impostare questo parametro su un valore identico o superiore rispetto a quello per il server primario.
Tipo di dati integer
Valore predefinito 0
Valori consentiti 0-262143
Tipo di parametro Statica
Documentation max_prepared_transactions

max_stack_depth (profondità_massima_dello_stack)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la profondità massima dello stack, in kilobyte.
Tipo di dati integer
Valore predefinito 2048
Valori consentiti 2048
Tipo di parametro Sola lettura
Documentation max_stack_depth

shared_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero di buffer di memoria condivisa usati dal server. L'unità è 8 kB. I valori consentiti sono inclusi nell'intervallo compreso tra il 10% e il 75% della memoria disponibile.
Tipo di dati integer
Valore predefinito Dipende dalle risorse (vCore, RAM o spazio su disco) allocate al server.
Valori consentiti 16-1073741823
Tipo di parametro Statica
Documentation shared_buffers

Description

Il shared_buffers parametro di configurazione determina la quantità di memoria di sistema allocata al database PostgreSQL per il buffering dei dati. Funge da pool di memoria centralizzato accessibile a tutti i processi di database.

Quando sono necessari i dati, il processo del database controlla prima di tutto il buffer condiviso. Se i dati necessari sono presenti, vengono recuperati rapidamente e ignora una lettura disco che richiede più tempo. I buffer condivisi fungono da intermediario tra i processi del database e il disco e riducono in modo efficace il numero di operazioni di I/O necessarie.

Note specifiche su Azure

Il valore predefinito per il parametro del server shared_buffers viene calcolato quando si effettua il provisioning dell'istanza del server flessibile di Database di Azure per PostgreSQL, in base al nome del prodotto selezionato per il relativo calcolo. Eventuali modifiche successive della selezione del prodotto per il calcolo che supporta il server flessibile non hanno alcun effetto sul valore predefinito del shared_buffers parametro server di tale istanza.

Ogni volta che si modifica il prodotto assegnato a un'istanza, è necessario modificare anche il valore per il shared_buffers parametro in base ai valori nelle formule seguenti.

Per le macchine virtuali con un massimo di 2 GiB di memoria, la formula usata per calcolare il valore di shared_buffers è memoryGib * 16384.

Per le macchine virtuali con più di 2 GiB, la formula usata per calcolare il valore di shared_buffers è memoryGib * 32768.

In base alla formula precedente, nella tabella seguente sono elencati i valori su cui verrà impostato il parametro del server a seconda della quantità di memoria di cui è stato effettuato il provisioning:

Dimensioni memoria shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

temp_buffers

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta il numero massimo di buffer temporanei usati da ogni sessione del database.
Tipo di dati integer
Valore predefinito 1024
Valori consentiti 100-1073741823
Tipo di parametro dynamic
Documentation temp_buffers

work_mem (memoria di lavoro)

Attribute Value
Categoria Utilizzo delle risorse / Memoria
Description Imposta la quantità di memoria che deve essere usata dalle operazioni di ordinamento interne e dalle tabelle hash prima della scrittura in file disco temporanei.
Tipo di dati integer
Valore predefinito 4096
Valori consentiti 4096-2097151
Tipo di parametro dynamic
Documentation work_mem

Description

Il work_mem parametro in PostgreSQL controlla la quantità di memoria allocata per determinate operazioni interne all'interno dell'area di memoria privata di ogni sessione del database. Esempi di queste operazioni sono l'ordinamento e l'hashing.

A differenza dei buffer condivisi, che si trovano nell'area di memoria condivisa, work_mem vengono allocati in uno spazio di memoria privata per sessione o per query. Impostando dimensioni adeguate work_mem , è possibile migliorare significativamente l'efficienza di queste operazioni e ridurre la necessità di scrivere dati temporanei su disco.

Punti chiave

  • Memoria di connessione privata: work_mem fa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa che shared_buffers usa.
  • Utilizzo specifico delle query: non tutte le sessioni o query usano work_mem. È improbabile che le query semplici, ad esempio SELECT 1 , richiedano work_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi di work_mem.
  • Operazioni parallele: per le query che si estendono su più back-end paralleli, ogni back-end potrebbe potenzialmente usare uno o più blocchi di work_mem.

Monitoraggio e regolazione di work_mem

È essenziale monitorare continuamente le prestazioni del sistema e regolare work_mem in base alle esigenze, soprattutto se i tempi di esecuzione delle query correlati all'ordinamento o alle operazioni di hashing sono lenti. Ecco i modi per monitorare le prestazioni usando gli strumenti disponibili nel portale di Azure:

Regolazione granulare

Mentre si gestisce il work_mem parametro, spesso è più efficiente adottare un approccio di regolazione granulare anziché impostare un valore globale. Questo approccio garantisce che allocare la memoria in modo giudizioso in base alle esigenze specifiche di processi e utenti. Riduce inoltre al minimo il rischio di riscontrare problemi di memoria insufficiente. Ecco come procedere:

  • Livello utente: se un utente specifico è coinvolto principalmente nelle attività di aggregazione o creazione di report, che richiedono un utilizzo intensivo della memoria, valutare la possibilità di personalizzare il work_mem valore per tale utente. Usare il ALTER ROLE comando per migliorare le prestazioni delle operazioni dell'utente.

  • Livello di funzione/routine: se funzioni o routine specifiche generano file temporanei sostanziali, l'aumento del work_mem valore a livello di funzione o routine specifico può essere vantaggioso. Usare il ALTER FUNCTION comando o ALTER PROCEDURE per allocare in modo specifico più memoria a queste operazioni.

  • Livello di database: modificare work_mem a livello di database se solo database specifici generano un numero elevato di file temporanei.

  • Livello globale: se un'analisi del sistema rivela che la maggior parte delle query genera piccoli file temporanei, mentre solo alcuni creano file di grandi dimensioni, potrebbe essere prudente aumentare il work_mem valore a livello globale. Questa azione facilita la maggior parte delle query da elaborare in memoria, in modo da evitare operazioni basate su disco e migliorare l'efficienza. Tuttavia, prestare sempre attenzione e monitorare l'utilizzo della memoria nel server per assicurarsi che possa gestire il valore aumentato work_mem .

Determinazione del valore minimo work_mem per le operazioni di ordinamento

Per trovare il valore minimo work_mem per una query specifica, in particolare uno che genera file di disco temporanei durante il processo di ordinamento, iniziare considerando le dimensioni temporanee del file generate durante l'esecuzione della query. Ad esempio, se una query genera un file temporaneo di 20 MB:

  1. Connettersi al database usando psql o il client PostgreSQL preferito.
  2. Impostare un valore iniziale di work_mem leggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio : SET work_mem TO '25MB'.
  3. Nella stessa sessione, eseguire EXPLAIN ANALYZE nella query problematica.
  4. Esaminare l'output per "Sort Method: quicksort Memory: xkB". Se indica "external merge Disk: xkB", aumentare incrementally il valore work_mem e ripetere il test fino a quando appare "quicksort Memory". La presenza di "quicksort Memory" indica che la query è ora in esecuzione in memoria.
  5. Dopo aver determinato il valore tramite questo metodo, è possibile applicarlo a livello globale o su livelli più granulari (come descritto in precedenza) in base alle esigenze operative.