Ho alcune domande su questa opzione. È chiaro che è commentata di default in app.yml e può migliorare le prestazioni di ordinamento, ma aumenta l’utilizzo di memoria per connessione, ma cosa significa esattamente? Dipende dal numero di connessioni? Cos’è db_work_mem? Viene impostato automaticamente durante l’installazione di Discourse, proprio come db_shared_buffers e UNICORN_WORKERS? È una misura di sicurezza abilitarla o è un’impostazione avanzata?
Attualmente appare così: #db_work_mem: "40MB"
Il server è: Vultr High Frequency Compute 2 vCore, 4096 MB
Grazie, Jay! In realtà, mi ha solo incuriosito. Stavo solo cercando modi per migliorare le prestazioni del forum, ma se potrebbe causare problemi, forse è meglio lasciarlo commentato.
Quindi, se lo attivo, c’è un’alta probabilità di esaurire la memoria se la configurazione non è corretta o se il traffico aumenta? Ho capito bene?
work_mem ( integer )
Imposta la quantità massima di memoria di base utilizzata da un’operazione di query (come un ordinamento o una tabella hash) prima di scrivere su file temporanei su disco. Se questo valore è specificato senza unità di misura, viene interpretato come kilobyte. Il valore predefinito è quattro megabyte ( 4MB ). Tieni presente che per una query complessa, diverse operazioni di ordinamento o hash potrebbero essere eseguite in parallelo; a ciascuna operazione verrà generalmente consentito di utilizzare tanta memoria quanta ne specifica questo valore prima di iniziare a scrivere dati in file temporanei. Inoltre, diverse sessioni in esecuzione potrebbero eseguire tali operazioni contemporaneamente. Pertanto, la memoria totale utilizzata potrebbe essere molte volte il valore di work_mem; è necessario tenere presente questo fatto quando si sceglie il valore. Le operazioni di ordinamento sono utilizzate per ORDER BY, DISTINCT e join di tipo merge. Le tabelle hash sono utilizzate nei join hash, nell’aggregazione basata su hash e nell’elaborazione basata su hash delle sottoquery IN.
Le operazioni basate su hash sono generalmente più sensibili alla disponibilità di memoria rispetto alle operazioni equivalenti basate su ordinamento. La memoria disponibile per le tabelle hash viene calcolata moltiplicando work_mem per hash_mem_multiplier. Questo rende possibile per le operazioni basate su hash utilizzare una quantità di memoria che supera la solita quantità di base work_mem.
A volte può essere utile aumentare la memoria di lavoro al doppio del valore predefinito commentato. Penso che aiuti su siti grandi con indici di grandi dimensioni, ma in realtà non ne sono sicuro. Ho rotto un sito spingendolo troppo in alto.
Se vuoi sperimentare con la sintonizzazione, puoi provare il plugin Prometheus e creare grafici eleganti con Grafana.
Nel template postgres.template.yml, db_work_mem: "10MB" è il valore predefinito, quindi credo che sia calcolato con questa formula. Penso che questi 10MB siano il massimo attualmente possibile. Grazie Jay