Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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_pagessuTRYper 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_memsu 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 inVACUUMè 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_memper controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset dimaintenance_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_memfa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa cheshared_buffersusa. -
Utilizzo specifico delle query: non tutte le sessioni o query usano
work_mem. È improbabile che le query semplici, ad esempioSELECT 1, richiedanowork_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi diwork_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:
-
Informazioni dettagliate sulle prestazioni delle query: controllare la scheda Query principali in base ai file temporanei per identificare le query che generano file temporanei. Questa situazione suggerisce una potenziale necessità di aumentare
work_mem. - Guide alla risoluzione dei problemi: usare la scheda File temporanei elevati nelle guide alla risoluzione dei problemi per identificare le query problematiche.
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_memvalore per tale utente. Usare ilALTER ROLEcomando 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_memvalore a livello di funzione o routine specifico può essere vantaggioso. Usare ilALTER FUNCTIONcomando oALTER PROCEDUREper allocare in modo specifico più memoria a queste operazioni.Livello di database: modificare
work_mema 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_memvalore 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 aumentatowork_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:
- Connettersi al database usando psql o il client PostgreSQL preferito.
- Impostare un valore iniziale di
work_memleggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio :SET work_mem TO '25MB'. - Nella stessa sessione, eseguire
EXPLAIN ANALYZEnella query problematica. - Esaminare l'output per
"Sort Method: quicksort Memory: xkB". Se indica"external merge Disk: xkB", aumentare incrementally il valorework_meme ripetere il test fino a quando appare"quicksort Memory". La presenza di"quicksort Memory"indica che la query è ora in esecuzione in memoria. - 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_pagessuTRYper 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_memsu 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 inVACUUMè 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_memper controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset dimaintenance_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_memfa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa cheshared_buffersusa. -
Utilizzo specifico delle query: non tutte le sessioni o query usano
work_mem. È improbabile che le query semplici, ad esempioSELECT 1, richiedanowork_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi diwork_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:
-
Informazioni dettagliate sulle prestazioni delle query: controllare la scheda Query principali in base ai file temporanei per identificare le query che generano file temporanei. Questa situazione suggerisce una potenziale necessità di aumentare
work_mem. - Guide alla risoluzione dei problemi: usare la scheda File temporanei elevati nelle guide alla risoluzione dei problemi per identificare le query problematiche.
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_memvalore per tale utente. Usare ilALTER ROLEcomando 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_memvalore a livello di funzione o routine specifico può essere vantaggioso. Usare ilALTER FUNCTIONcomando oALTER PROCEDUREper allocare in modo specifico più memoria a queste operazioni.Livello di database: modificare
work_mema 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_memvalore 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 aumentatowork_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:
- Connettersi al database usando psql o il client PostgreSQL preferito.
- Impostare un valore iniziale di
work_memleggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio :SET work_mem TO '25MB'. - Nella stessa sessione, eseguire
EXPLAIN ANALYZEnella query problematica. - Esaminare l'output per
"Sort Method: quicksort Memory: xkB". Se indica"external merge Disk: xkB", aumentare incrementally il valorework_meme ripetere il test fino a quando appare"quicksort Memory". La presenza di"quicksort Memory"indica che la query è ora in esecuzione in memoria. - 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_pagessuTRYper 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_memsu 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 inVACUUMè 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_memper controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset dimaintenance_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_memfa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa cheshared_buffersusa. -
Utilizzo specifico delle query: non tutte le sessioni o query usano
work_mem. È improbabile che le query semplici, ad esempioSELECT 1, richiedanowork_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi diwork_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:
-
Informazioni dettagliate sulle prestazioni delle query: controllare la scheda Query principali in base ai file temporanei per identificare le query che generano file temporanei. Questa situazione suggerisce una potenziale necessità di aumentare
work_mem. - Guide alla risoluzione dei problemi: usare la scheda File temporanei elevati nelle guide alla risoluzione dei problemi per identificare le query problematiche.
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_memvalore per tale utente. Usare ilALTER ROLEcomando 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_memvalore a livello di funzione o routine specifico può essere vantaggioso. Usare ilALTER FUNCTIONcomando oALTER PROCEDUREper allocare in modo specifico più memoria a queste operazioni.Livello di database: modificare
work_mema 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_memvalore 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 aumentatowork_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:
- Connettersi al database usando psql o il client PostgreSQL preferito.
- Impostare un valore iniziale di
work_memleggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio :SET work_mem TO '25MB'. - Nella stessa sessione, eseguire
EXPLAIN ANALYZEnella query problematica. - Esaminare l'output per
"Sort Method: quicksort Memory: xkB". Se indica"external merge Disk: xkB", aumentare incrementally il valorework_meme ripetere il test fino a quando appare"quicksort Memory". La presenza di"quicksort Memory"indica che la query è ora in esecuzione in memoria. - 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_pagessuTRYper 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_memsu 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 inVACUUMè 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_memper controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset dimaintenance_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_memfa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa cheshared_buffersusa. -
Utilizzo specifico delle query: non tutte le sessioni o query usano
work_mem. È improbabile che le query semplici, ad esempioSELECT 1, richiedanowork_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi diwork_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:
-
Informazioni dettagliate sulle prestazioni delle query: controllare la scheda Query principali in base ai file temporanei per identificare le query che generano file temporanei. Questa situazione suggerisce una potenziale necessità di aumentare
work_mem. - Guide alla risoluzione dei problemi: usare la scheda File temporanei elevati nelle guide alla risoluzione dei problemi per identificare le query problematiche.
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_memvalore per tale utente. Usare ilALTER ROLEcomando 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_memvalore a livello di funzione o routine specifico può essere vantaggioso. Usare ilALTER FUNCTIONcomando oALTER PROCEDUREper allocare in modo specifico più memoria a queste operazioni.Livello di database: modificare
work_mema 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_memvalore 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 aumentatowork_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:
- Connettersi al database usando psql o il client PostgreSQL preferito.
- Impostare un valore iniziale di
work_memleggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio :SET work_mem TO '25MB'. - Nella stessa sessione, eseguire
EXPLAIN ANALYZEnella query problematica. - Esaminare l'output per
"Sort Method: quicksort Memory: xkB". Se indica"external merge Disk: xkB", aumentare incrementally il valorework_meme ripetere il test fino a quando appare"quicksort Memory". La presenza di"quicksort Memory"indica che la query è ora in esecuzione in memoria. - 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_pagessuTRYper 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_memsu 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 inVACUUMè 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_memper controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset dimaintenance_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_memfa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa cheshared_buffersusa. -
Utilizzo specifico delle query: non tutte le sessioni o query usano
work_mem. È improbabile che le query semplici, ad esempioSELECT 1, richiedanowork_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi diwork_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:
-
Informazioni dettagliate sulle prestazioni delle query: controllare la scheda Query principali in base ai file temporanei per identificare le query che generano file temporanei. Questa situazione suggerisce una potenziale necessità di aumentare
work_mem. - Guide alla risoluzione dei problemi: usare la scheda File temporanei elevati nelle guide alla risoluzione dei problemi per identificare le query problematiche.
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_memvalore per tale utente. Usare ilALTER ROLEcomando 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_memvalore a livello di funzione o routine specifico può essere vantaggioso. Usare ilALTER FUNCTIONcomando oALTER PROCEDUREper allocare in modo specifico più memoria a queste operazioni.Livello di database: modificare
work_mema 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_memvalore 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 aumentatowork_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:
- Connettersi al database usando psql o il client PostgreSQL preferito.
- Impostare un valore iniziale di
work_memleggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio :SET work_mem TO '25MB'. - Nella stessa sessione, eseguire
EXPLAIN ANALYZEnella query problematica. - Esaminare l'output per
"Sort Method: quicksort Memory: xkB". Se indica"external merge Disk: xkB", aumentare incrementally il valorework_meme ripetere il test fino a quando appare"quicksort Memory". La presenza di"quicksort Memory"indica che la query è ora in esecuzione in memoria. - 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_pagessuTRYper 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_memsu 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 inVACUUMè 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_memper controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset dimaintenance_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_memfa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa cheshared_buffersusa. -
Utilizzo specifico delle query: non tutte le sessioni o query usano
work_mem. È improbabile che le query semplici, ad esempioSELECT 1, richiedanowork_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi diwork_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:
-
Informazioni dettagliate sulle prestazioni delle query: controllare la scheda Query principali in base ai file temporanei per identificare le query che generano file temporanei. Questa situazione suggerisce una potenziale necessità di aumentare
work_mem. - Guide alla risoluzione dei problemi: usare la scheda File temporanei elevati nelle guide alla risoluzione dei problemi per identificare le query problematiche.
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_memvalore per tale utente. Usare ilALTER ROLEcomando 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_memvalore a livello di funzione o routine specifico può essere vantaggioso. Usare ilALTER FUNCTIONcomando oALTER PROCEDUREper allocare in modo specifico più memoria a queste operazioni.Livello di database: modificare
work_mema 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_memvalore 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 aumentatowork_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:
- Connettersi al database usando psql o il client PostgreSQL preferito.
- Impostare un valore iniziale di
work_memleggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio :SET work_mem TO '25MB'. - Nella stessa sessione, eseguire
EXPLAIN ANALYZEnella query problematica. - Esaminare l'output per
"Sort Method: quicksort Memory: xkB". Se indica"external merge Disk: xkB", aumentare incrementally il valorework_meme ripetere il test fino a quando appare"quicksort Memory". La presenza di"quicksort Memory"indica che la query è ora in esecuzione in memoria. - 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_pagessuTRYper 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_memsu 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 inVACUUMè 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_memper controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset dimaintenance_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_memfa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa cheshared_buffersusa. -
Utilizzo specifico delle query: non tutte le sessioni o query usano
work_mem. È improbabile che le query semplici, ad esempioSELECT 1, richiedanowork_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi diwork_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:
-
Informazioni dettagliate sulle prestazioni delle query: controllare la scheda Query principali in base ai file temporanei per identificare le query che generano file temporanei. Questa situazione suggerisce una potenziale necessità di aumentare
work_mem. - Guide alla risoluzione dei problemi: usare la scheda File temporanei elevati nelle guide alla risoluzione dei problemi per identificare le query problematiche.
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_memvalore per tale utente. Usare ilALTER ROLEcomando 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_memvalore a livello di funzione o routine specifico può essere vantaggioso. Usare ilALTER FUNCTIONcomando oALTER PROCEDUREper allocare in modo specifico più memoria a queste operazioni.Livello di database: modificare
work_mema 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_memvalore 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 aumentatowork_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:
- Connettersi al database usando psql o il client PostgreSQL preferito.
- Impostare un valore iniziale di
work_memleggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio :SET work_mem TO '25MB'. - Nella stessa sessione, eseguire
EXPLAIN ANALYZEnella query problematica. - Esaminare l'output per
"Sort Method: quicksort Memory: xkB". Se indica"external merge Disk: xkB", aumentare incrementally il valorework_meme ripetere il test fino a quando appare"quicksort Memory". La presenza di"quicksort Memory"indica che la query è ora in esecuzione in memoria. - 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_pagessuTRYper 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_memsu 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 inVACUUMè 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_memper controllare la memoria usata dalle operazioni autovacuum in modo indipendente. Questa impostazione funge da subset dimaintenance_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_memfa parte della memoria privata usata da ogni sessione di database. Questa memoria è distinta dall'area di memoria condivisa cheshared_buffersusa. -
Utilizzo specifico delle query: non tutte le sessioni o query usano
work_mem. È improbabile che le query semplici, ad esempioSELECT 1, richiedanowork_mem. Tuttavia, query complesse che coinvolgono operazioni come l'ordinamento o l'hashing possono utilizzare uno o più blocchi diwork_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:
-
Informazioni dettagliate sulle prestazioni delle query: controllare la scheda Query principali in base ai file temporanei per identificare le query che generano file temporanei. Questa situazione suggerisce una potenziale necessità di aumentare
work_mem. - Guide alla risoluzione dei problemi: usare la scheda File temporanei elevati nelle guide alla risoluzione dei problemi per identificare le query problematiche.
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_memvalore per tale utente. Usare ilALTER ROLEcomando 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_memvalore a livello di funzione o routine specifico può essere vantaggioso. Usare ilALTER FUNCTIONcomando oALTER PROCEDUREper allocare in modo specifico più memoria a queste operazioni.Livello di database: modificare
work_mema 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_memvalore 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 aumentatowork_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:
- Connettersi al database usando psql o il client PostgreSQL preferito.
- Impostare un valore iniziale di
work_memleggermente superiore a 20 MB per supportare eventuali intestazioni aggiuntive durante l'elaborazione in memoria. Usare un comando, ad esempio :SET work_mem TO '25MB'. - Nella stessa sessione, eseguire
EXPLAIN ANALYZEnella query problematica. - Esaminare l'output per
"Sort Method: quicksort Memory: xkB". Se indica"external merge Disk: xkB", aumentare incrementally il valorework_meme ripetere il test fino a quando appare"quicksort Memory". La presenza di"quicksort Memory"indica che la query è ora in esecuzione in memoria. - 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.